JBossTSRecovery

Introduction

 

In this wiki we're going to look at how you can test the recovery capabilities of

JBossTransactions. We're not going to go into much technical depth here, because the

manuals cover this in copious detail.

If you want to know how it works read the manuals. If you want to know why

it works the way it does, read a good book on transactions.

 

In the following examples we'll look at recovery in a stand-alone deployment of JBossTransactions. After that, we'll examine recovery when running within JBossAS.

 

Local JTA Recovery

 

In this example, we'll use the local JTA implementation that comes with JBossTransactions. In order

to ensure you've configured JBossTS correctly, check your jbossjts-properties.xml file in the distribution. The following needs to be set:

 

<property name="com.arjuna.ats.jta.jtaTMImplementation" value="com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionManagerImple"/>         <property name="com.arjuna.ats.jta.jtaUTImplementation" value="com.arjuna.ats.internal.jta.transaction.arjunacore.UserTransactionImple"/>

 

and only the

 

        <property             name="com.arjuna.ats.arjuna.recovery.recoveryExtension5" value="com.arjuna.ats.internal.jta.recovery.arjunacore.XARecoveryModule"/>

 

Clean your ObjectStore directory before proceeding with the examples.

 

You can remove the jts XARecoveryModule as it is not needed in this example.

 

Download and build the example code. If you run the example using java Test you'll see output similar to:

 

ExampleResource: ExampleXAResource (Constructor) ExampleResource: start ExampleResource: ExampleXAResource (Constructor) ExampleResource: isSameRM ExampleResource: start ExampleResource: end ExampleResource: prepare ExampleResource: end ExampleResource: prepare ExampleResource: writeObject (Serialized) ExampleResource: writeObject (Serialized) ExampleResource: commit,xid=< 131075, 51, 25,-3f57fe99:e57e:44742e0f:1--3f57fe99:e57e:44742e0f:0-3f57fe99:e57e:44742e0f:4>,onePhase=false ExampleResource: Sleeping 20000 milliseconds

 

At this stage the process is blocked and you should kill it. What has happened so far is that two XAResource instances have been created and registered with the transaction. Each has been instructed to prepare and the serialized representation of each instance has been saved within the transaction log. If you look within the ObjectStore directory, you should see a single log entry like:

 

ObjectStore//HashedActionStore/defaultStore/StateManager/BasicAction/TwoPhaseCoordinator/AtomicAction/190: total 8 -rw-rr   1 marklitt  wheel  728 May 24 10:57 -3f57fe99_e57e_44742e0f_0

 

This is the log representing the transaction you have just terminated. We now want recovery to kick in. To do this, run java Test -recover and wait for recovery to run. (You can run recovery explicitly by editing the example or driving it through the Recovery Manager tools: see the manuals for how to do this.)

 

When recovery runs, you will see something like:

 

DONE ExampleResource: readObject (Deserialized ExampleResource: readObject (Deserialized ExampleResource: commit,xid=< 131075, 27, 25,1--3f57fe99:e5a0:44743023:e-3f57fe99:e5a0:44743023:f >,onePhase=false ExampleResource: Sleeping 20000 milliseconds ExampleResource: Sleep complete ExampleResource: commit,xid=< 131075, 27, 26,1--3f57fe99:e5a0:44743023:e-3f57fe99:e5a0:44743023:12 >,onePhase=false ExampleResource: Sleeping 20000 milliseconds ExampleResource: Sleep complete

 

If you look in the ObjectStore, you will see that the log entry has gone because both resources have been fully recovered and committed.

 

JTS Recovery

 

In this example, we'll still use the JTA, but this time we will utilise the JTS implementation that comes with JBossTS. First make sure that your jbossjts-properties.xml file is correctly configured. You need:

 

<property name="com.arjuna.ats.jta.jtaTMImplementation" value="com.arjuna.ats.internal.jta.transaction.jts.TransactionManagerImple"/>         <property name="com.arjuna.ats.jta.jtaUTImplementation" value="com.arjuna.ats.internal.jta.transaction.jts.UserTransactionImple"/>

 

and

 

        <property             name="com.arjuna.ats.arjuna.recovery.recoveryExtension5" value="com.arjuna.ats.internal.jta.recovery.jts.XARecoveryModule"/>

 

this time.

 

You also need to add the following to the jta section of your properties file:

 

   <property name="com.arjuna.ats.jta.recovery.XAResourceRecovery2" value="ExampleXAResourceRecovery"/>

 

Download and compile the example code. The run the example using java Test. You should obtain output similar to:

 

INFO : oid: 00 14 37 2D 49 49 38 28 01 0C 39                            ..7-II8(..9 object is activated ExampleXAResource1: ExampleXAResource1 (Constructor) ExampleXAResource1: start INFO : oid: 01 14 37 2D 49 49 38 28 01 0C 39                            ..7-II8(..9 object is activated ExampleXAResource2: ExampleXAResource2 (Constructor) ExampleXAResource1: isSameRM ExampleXAResource2: start INFO : oid: 02 14 37 2D 49 49 38 28 01 0C 39                            ..7-II8(..9 object is activated ExampleXAResource1: end ExampleXAResource1: prepare < 131072, 28, 26,1--3f57fe99:e5d9:4474352e:10-3f57fe99:e5d9:4474352e:12 > ExampleXAResource1: writeObject (Serialized) ExampleXAResource2: end ExampleXAResource2: prepare < 131072, 28, 26, 1--3f57fe99:e5d9:4474352e:10-3f57fe99:e5d9:4474352e:16 > ExampleXAResource2: writeObject (Serialized) ExampleXAResource1: commit,xid=< 131072, 28, 26, 1--3f57fe99:e5d9:4474352e:10-3f57fe99:e5d9:4474352e:12 >,onePhase=false ExampleXAResource1: Sleeping 20000 milliseconds

 

You can safely ignore the JacORB output for the purposes of this test.

 

Now if you look in the ObjectStore directory you'll see two entries:

 

PutObjectStoreDirHere//ShadowNoFileLockStore/defaultStore/CosTransactions/XAResourceRecord: total 16 -rw-rr   1 marklitt  wheel  940 May 24 11:27 -3f57fe99_e5d9_4474352e_13 -rw-rr   1 marklitt  wheel  940 May 24 11:27 -3f57fe99_e5d9_4474352e_17

 

One state log for each registered XAResource. Because the resources are potentially remote, the have responsibility for saving and restoring their own states, rather than being saved within the transaction log as happened previously.

 

Now execute java Test -recover to start the recovery phase of our example. You'll eventually see:

 

DONE ExampleXAResource1: readObject (Deserialized INFO : oid: 00 14 37 2D 4A 49 37 1B 10 25                               ..7-JI7..% object is activated ExampleXAResource1: commit,xid=< 131072, 28, 26, 1--3f57fe99:e5d9:4474352e:10-3f57fe99:e5d9:4474352e:12 >,onePhase=false ExampleXAResource1: Sleeping 20000 milliseconds ExampleXAResource2: readObject (Deserialized INFO : oid: 01 14 37 2D 4A 49 37 1B 10 25                               ..7-JI7..% object is activated ExampleXAResource1: Sleep complete INFO : oid: 00 14 37 2D 4A 49 37 1B 10 25                               ..7-JI7..% object is deactivated ExampleXAResource2: commit,xid=< 131072, 28, 26, 1--3f57fe99:e5d9:4474352e:10-3f57fe99:e5d9:4474352e:16 >,onePhase=false ExampleXAResource2: Sleeping 20000 milliseconds ExampleXAResource1: ExampleXAResource1 (Constructor) ExampleXAResource1: recover ExampleXAResource1: recover ExampleXAResource2: ExampleXAResource2 (Constructor) ExampleXAResource2: recover ExampleXAResource2: isSameRM ExampleXAResource2: recover ExampleXAResource2: Sleep complete INFO : oid: 01 14 37 2D 4A 49 37 1B 10 25                               ..7-JI7..% object is deactivated

 

As each resource is recovered and committed, it's log entry is deleted. So if you look within the ObjectStore, you will see no entries once recovery has completed successfully.

 

JDBC recovery

 

See this example for how to do XA recovery for JDBC datasources.

 

Referenced by: