And it's here where using of transactional driver brings another benefit with ready to use approaches to set up the recovery. As in the prior article we will work with the jbosstm quickstart transactionaldriver-standalone.
After reading the post about transaction recovery you will find out that for the recovery manager would consider any resource that we
enlist into the global transaction
we have to:
- either ensure that resource could be serialized into Narayana transaction log store
(resource has to be serializable),
in which case the recovery manager deserialize the
XAResource
and use it directly to get data from it - or to register recovery counterpart of the transaction enlistment which is capable to provide the instance of
XAResource
to theRecoveryModule
in other words we need implemntation ofXAResourceRecoveryHelper
orXAResourceRecovery
(and that's where transactional driver can help us).
For configuration of the recovery properties, we use
the jbossts-properties.xml
descriptor in our quickstart. We leave the most of the properties with their default values
but we still need to concentrate to set up the recovery.
You can observe that it serves to define recovery modules, orphan filters or xa resource recovery helpers.
Those are important entries for the recovery works for our transaction JDBC driver.
For better understanding what was set I recommend to check the comments there.
JDBC transaction driver and the recovery
In the prior article about JDBC driver we introduced three ways of providing connection data to the transaction manager (it then wraps the connection and provides transactionality in the user application). Let's go through the driver enlistment variants and check how the recovery can be configured for them.XADataSource provided within Narayana JDBC driver properties
This is a variant where XADatasource
is created directly in the code and then
the created(!) instance is passed to the jdbc transactional driver.
As transactional driver receives the resource directly it does not have clue how to create
such resource on its own during recovery. We have to help it with
our own implementation of the XAResourceRecovery
class.
That has to be of course registered
into environment bean (it's intentionally commented out as for testing purposes we need to change different variants).
- link to section of previous blogpost
- quickstart class enlisting the resource
- the implementation class providing the XAResource (in our case pretty dummy one)
- testcase with recovery
XADataSource bound to JNDI
This variant bound the XADatasource
to JNDI name. The recovery can lookup
the provided jndi name and receive it to create an XAConnection
to find the indoubt transactions at database side.
The point here is to pass information about jndi name to the recovery process for it knowing what to search for.
The jdbc driver uses a xml descriptor for that purpose in two variants
In fact, there is no big difference between those two variants and you can use whatever fits you better. In both versions you provide the JNDI name to be looked-up.
- link to section of previous blogpost
- quickstart class enlisting the resource
- testcase with recovery #1
- testcase with recovery #2
- configuration in the jbossts-properties.xml file
XADataSource connection data provided in properties file
The last variant uses properties file where the same connection information is used already during resource enlistment. And the same property file is then automatically used for recovery. You don't need to set any property manually. The recovery is automatically setup because the placement of the properties file is serialized into object store and then loaded during recovery.
In this case you configured the PropertyFileDynamicClass providing datasource credentials for the transaction manager and the recovery too.
If you would like to extend the behaviour you can implement your own
DynamicClass (please consult the codebase).
For the recovery would work automatically you need to work with the
RecoverableXAConnection
.
Summary
There is currently available three approaches for the setting up recovery of jdbc transactional driver
creation of your own XAResourceRecovery/XAResourceRecoveryHelper
which is feasible if you want to control the creation
of the datasource and jdbc connection on your own. Or using one of the prepared XAResourceRecovery
classes - either
JDBCXARecovery
or BasicXARecovery
where you provide xml file where you specify the JNDI name of the datasource.
The last option is to use properties file which defines credentials for connection and for recovery too.
No comments:
Post a Comment