@Override public void start(StartContext context) throws StartException { final JTAEnvironmentBean jtaEnvironmentBean = jtaPropertyManager.getJTAEnvironmentBean(); jtaEnvironmentBean.setLastResourceOptimisationInterfaceClassName(LastResource.class.getName()); // recovery nodes jtaEnvironmentBean.setXaRecoveryNodes(Collections.singletonList(nodeIdentifier)); // setup the XA orphan filters if (useActionStatusServiceRecoveryFilter) { jtaEnvironmentBean.setXaResourceOrphanFilterClassNames(Arrays.asList(JTATransactionLogXAResourceOrphanFilter.class.getName(), JTANodeNameXAResourceOrphanFilter.class.getName(), SubordinateJTAXAResourceOrphanFilter.class.getName(), SubordinationManagerXAResourceOrphanFilter.class.getName(), JTAActionStatusServiceXAResourceOrphanFilter.class.getName())); } else { jtaEnvironmentBean.setXaResourceOrphanFilterClassNames(Arrays.asList(JTATransactionLogXAResourceOrphanFilter.class.getName(), JTANodeNameXAResourceOrphanFilter.class.getName(), SubordinateJTAXAResourceOrphanFilter.class.getName(), SubordinationManagerXAResourceOrphanFilter.class.getName())); } jtaEnvironmentBean.setXAResourceRecordWrappingPlugin(new com.arjuna.ats.internal.jbossatx.jta.XAResourceRecordWrappingPluginImpl()); jtaEnvironmentBean.setTransactionManagerJNDIContext("java:jboss/TransactionManager"); jtaEnvironmentBean.setTransactionSynchronizationRegistryJNDIContext("java:jboss/TransactionSynchronizationRegistry"); jtaEnvironmentBean.setUserTransactionOperationsProviderClassName(LocalUserTransactionOperationsProvider.class.getName()); }
@Override public void stop(StopContext context) { final JTAEnvironmentBean jtaEnvironmentBean = jtaPropertyManager.getJTAEnvironmentBean(); // reset the XA orphan filters jtaEnvironmentBean.setXaResourceOrphanFilterClassNames(null); // reset the recovery nodes jtaEnvironmentBean.setXaRecoveryNodes(null); // reset the record wrapper plugin jtaEnvironmentBean.setXAResourceRecordWrappingPlugin(null); jtaEnvironmentBean.setLastResourceOptimisationInterfaceClassName(null); }
@Override public void start(StartContext context) throws StartException { final JTAEnvironmentBean jtaEnvironmentBean = jtaPropertyManager.getJTAEnvironmentBean(); jtaEnvironmentBean.setLastResourceOptimisationInterfaceClassName(LastResource.class.getName()); // recovery nodes jtaEnvironmentBean.setXaRecoveryNodes(Collections.singletonList(nodeIdentifier)); // setup the XA orphan filters if (useActionStatusServiceRecoveryFilter) { jtaEnvironmentBean.setXaResourceOrphanFilterClassNames(Arrays.asList(JTATransactionLogXAResourceOrphanFilter.class.getName(), JTANodeNameXAResourceOrphanFilter.class.getName(), SubordinateJTAXAResourceOrphanFilter.class.getName(), SubordinationManagerXAResourceOrphanFilter.class.getName(), JTAActionStatusServiceXAResourceOrphanFilter.class.getName())); } else { jtaEnvironmentBean.setXaResourceOrphanFilterClassNames(Arrays.asList(JTATransactionLogXAResourceOrphanFilter.class.getName(), JTANodeNameXAResourceOrphanFilter.class.getName(), SubordinateJTAXAResourceOrphanFilter.class.getName(), SubordinationManagerXAResourceOrphanFilter.class.getName())); } jtaEnvironmentBean.setXAResourceRecordWrappingPlugin(new com.arjuna.ats.internal.jbossatx.jta.XAResourceRecordWrappingPluginImpl()); jtaEnvironmentBean.setTransactionManagerJNDIContext("java:jboss/TransactionManager"); jtaEnvironmentBean.setTransactionSynchronizationRegistryJNDIContext("java:jboss/TransactionSynchronizationRegistry"); jtaEnvironmentBean.setUserTransactionOperationsProviderClassName(LocalUserTransactionOperationsProvider.class.getName()); }
@Override public void start(StartContext context) throws StartException { final JTAEnvironmentBean jtaEnvironmentBean = jtaPropertyManager.getJTAEnvironmentBean(); jtaEnvironmentBean.setLastResourceOptimisationInterfaceClassName(LastResource.class.getName()); // recovery nodes jtaEnvironmentBean.setXaRecoveryNodes(Collections.singletonList(nodeIdentifier)); // setup the XA orphan filters if (useActionStatusServiceRecoveryFilter) { jtaEnvironmentBean.setXaResourceOrphanFilterClassNames(Arrays.asList(JTATransactionLogXAResourceOrphanFilter.class.getName(), JTANodeNameXAResourceOrphanFilter.class.getName(), SubordinateJTAXAResourceOrphanFilter.class.getName(), SubordinationManagerXAResourceOrphanFilter.class.getName(), JTAActionStatusServiceXAResourceOrphanFilter.class.getName())); } else { jtaEnvironmentBean.setXaResourceOrphanFilterClassNames(Arrays.asList(JTATransactionLogXAResourceOrphanFilter.class.getName(), JTANodeNameXAResourceOrphanFilter.class.getName(), SubordinateJTAXAResourceOrphanFilter.class.getName(), SubordinationManagerXAResourceOrphanFilter.class.getName())); } jtaEnvironmentBean.setXAResourceRecordWrappingPlugin(new com.arjuna.ats.internal.jbossatx.jta.XAResourceRecordWrappingPluginImpl()); jtaEnvironmentBean.setTransactionManagerJNDIContext("java:jboss/TransactionManager"); jtaEnvironmentBean.setTransactionSynchronizationRegistryJNDIContext("java:jboss/TransactionSynchronizationRegistry"); jtaEnvironmentBean.setUserTransactionOperationsProviderClassName(LocalUserTransactionOperationsProvider.class.getName()); }
@Override public void stop(StopContext context) { final JTAEnvironmentBean jtaEnvironmentBean = jtaPropertyManager.getJTAEnvironmentBean(); // reset the XA orphan filters jtaEnvironmentBean.setXaResourceOrphanFilterClassNames(null); // reset the recovery nodes jtaEnvironmentBean.setXaRecoveryNodes(null); // reset the record wrapper plugin jtaEnvironmentBean.setXAResourceRecordWrappingPlugin(null); jtaEnvironmentBean.setLastResourceOptimisationInterfaceClassName(null); }
@Override public void stop(StopContext context) { final JTAEnvironmentBean jtaEnvironmentBean = jtaPropertyManager.getJTAEnvironmentBean(); // reset the XA orphan filters jtaEnvironmentBean.setXaResourceOrphanFilterClassNames(null); // reset the recovery nodes jtaEnvironmentBean.setXaRecoveryNodes(null); // reset the record wrapper plugin jtaEnvironmentBean.setXAResourceRecordWrappingPlugin(null); jtaEnvironmentBean.setLastResourceOptimisationInterfaceClassName(null); }
/** * If node identifier wasn't set by property manager, then set default {@link #DEFAULT_NODE_IDENTIFIER}. */ private void initNodeIdentifier() { if (arjPropertyManager.getCoreEnvironmentBean().getNodeIdentifier() == null) { LOGGER.warning("Node identifier was not set. Setting it to the default value: " + DEFAULT_NODE_IDENTIFIER); try { arjPropertyManager.getCoreEnvironmentBean().setNodeIdentifier(DEFAULT_NODE_IDENTIFIER); } catch (CoreEnvironmentBeanException e) { LOGGER.log(Level.WARNING, e.getMessage(), e); } } jtaPropertyManager.getJTAEnvironmentBean() .setXaRecoveryNodes(Collections.singletonList(arjPropertyManager.getCoreEnvironmentBean().getNodeIdentifier())); }
@Before public void setUp() { RecoveryEnvironmentBean recoveryEnvironmentBean = recoveryPropertyManager .getRecoveryEnvironmentBean(); recoveryEnvironmentBean .setRecoveryModuleClassNames(Arrays .asList(new String[] { "com.arjuna.ats.internal.arjuna.recovery.AtomicActionRecoveryModule", "com.arjuna.ats.internal.jta.recovery.arjunacore.XARecoveryModule" })); JTAEnvironmentBean jtaEnvironmentBean = jtaPropertyManager .getJTAEnvironmentBean(); jtaEnvironmentBean .setXaResourceRecoveryClassNames(Arrays .asList(new String[] { "com.hp.mwtests.ts.jta.recovery.TestXAResourceRecovery" })); jtaEnvironmentBean .setXaResourceOrphanFilterClassNames(Arrays .asList(new String[] { "com.arjuna.ats.internal.jta.recovery.arjunacore.JTATransactionLogXAResourceOrphanFilter", "com.arjuna.ats.internal.jta.recovery.arjunacore.JTANodeNameXAResourceOrphanFilter" })); jtaEnvironmentBean.setXaRecoveryNodes(Arrays .asList(new String[] { "1" })); }
@Test public void testSubordinateJTAXAResourceOrphanFilter() throws HeuristicRollbackException, HeuristicMixedException, HeuristicCommitException, SystemException, RollbackException, XAException { XAResourceOrphanFilter orphanFilter = new SubordinateJTAXAResourceOrphanFilter(); XidImple xid = (XidImple) XATxConverter.getXid(Uid.nullUid(), false, XATxConverter.FORMAT_ID); XATxConverter.setSubordinateNodeName(xid.getXID(), TxControl.getXANodeName()); List<String> xaRecoveryNodes = jtaPropertyManager.getJTAEnvironmentBean().getXaRecoveryNodes(); try { jtaPropertyManager.getJTAEnvironmentBean().setXaRecoveryNodes(Arrays.asList("2")); assertEquals(XAResourceOrphanFilter.Vote.ABSTAIN, orphanFilter.checkXid(xid)); jtaPropertyManager.getJTAEnvironmentBean().setXaRecoveryNodes(Arrays.asList("1")); assertEquals(XAResourceOrphanFilter.Vote.ROLLBACK, orphanFilter.checkXid(xid)); } finally { jtaPropertyManager.getJTAEnvironmentBean().setXaRecoveryNodes(xaRecoveryNodes); } } }
@Test public void test() throws NotSupportedException, SystemException, IllegalStateException, RollbackException, SecurityException, HeuristicMixedException, HeuristicRollbackException, NamingException { arjPropertyManager.getObjectStoreEnvironmentBean().setObjectStoreType(JDBCStore.class.getName()); arjPropertyManager.getObjectStoreEnvironmentBean().setJdbcAccess(TestJDBCAccess.class.getName()); javax.transaction.TransactionManager tm = TransactionManager.transactionManager(); tm.begin(); tm.getTransaction().enlistResource(new DummyXAResource()); tm.getTransaction().enlistResource(new DummyXAResource()); tm.commit(); assertTrue(commitCount == 1); FAULT_JDBC = true; jtaPropertyManager.getJTAEnvironmentBean().setXaRecoveryNodes(Arrays.asList(new String[] { "1" })); jtaPropertyManager.getJTAEnvironmentBean().setXaResourceOrphanFilters(Arrays.asList(new XAResourceOrphanFilter[] { new com.arjuna.ats.internal.jta.recovery.arjunacore.JTATransactionLogXAResourceOrphanFilter(), new com.arjuna.ats.internal.jta.recovery.arjunacore.JTANodeNameXAResourceOrphanFilter() })); jtaPropertyManager.getJTAEnvironmentBean().setXaResourceRecoveries(Arrays.asList(new XAResourceRecovery[] { new DummyXAResourceRecovery() })); jtaPropertyManager.getJTAEnvironmentBean().setOrphanSafetyInterval(1); recoveryPropertyManager.getRecoveryEnvironmentBean().setRecoveryBackoffPeriod(2); recoveryPropertyManager.getRecoveryEnvironmentBean().setRecoveryModules(Arrays.asList(new RecoveryModule[] { new XARecoveryModule() })); RecoveryManager manager = RecoveryManager.manager(RecoveryManager.DIRECT_MANAGEMENT); manager.scan(); assertFalse(rollbackCalled); }
@Test public void testJTANodeNameXAResourceOrphanFilter() { XAResourceOrphanFilter orphanFilter = new JTANodeNameXAResourceOrphanFilter(); Xid notJTAFormatId = XATxConverter.getXid(new Uid(), false, 0); assertEquals(XAResourceOrphanFilter.Vote.ABSTAIN, orphanFilter.checkXid(notJTAFormatId)); List<String> recoveryNodes = new LinkedList<String>(); recoveryNodes.add("1"); jtaPropertyManager.getJTAEnvironmentBean().setXaRecoveryNodes(recoveryNodes); String notRecoverableNodeName ="2"; TxControl.setXANodeName(notRecoverableNodeName); Xid jtaNotRecoverableNodeName = XATxConverter.getXid(new Uid(), false, XATxConverter.FORMAT_ID); assertEquals(XAResourceOrphanFilter.Vote.ABSTAIN, orphanFilter.checkXid(jtaNotRecoverableNodeName)); String recoverableNodeName ="1"; TxControl.setXANodeName(recoverableNodeName); Xid jtaRecoverableNodeName = XATxConverter.getXid(new Uid(), false, XATxConverter.FORMAT_ID); assertEquals(XAResourceOrphanFilter.Vote.ROLLBACK, orphanFilter.checkXid(jtaRecoverableNodeName)); recoveryNodes.clear(); recoveryNodes.add(NodeNameXAResourceOrphanFilter.RECOVER_ALL_NODES); jtaPropertyManager.getJTAEnvironmentBean().setXaRecoveryNodes(recoveryNodes); assertEquals(XAResourceOrphanFilter.Vote.ROLLBACK, orphanFilter.checkXid(jtaNotRecoverableNodeName)); assertEquals(XAResourceOrphanFilter.Vote.ROLLBACK, orphanFilter.checkXid(jtaRecoverableNodeName)); }
jtaPropertyManager.getJTAEnvironmentBean().setXaRecoveryNodes( Arrays.asList(new String[] { "*" }));
xarn.add(NodeNameXAResourceOrphanFilter.RECOVER_ALL_NODES); jtaPropertyManager.getJTAEnvironmentBean().setXaRecoveryNodes(xarn); XARecoveryModule xaRecoveryModule = new XARecoveryModule(); Field safetyIntervalMillis = RecoveryXids.class.getDeclaredField("safetyIntervalMillis");
@Test public void testJTAActionStatusServiceXAResourceOrphanFilter() { XAResourceOrphanFilter orphanFilter = new JTAActionStatusServiceXAResourceOrphanFilter(); List<String> xaRecoveryNodes = jtaPropertyManager.getJTAEnvironmentBean().getXaRecoveryNodes(); List<String> recoveryNodes = new LinkedList<String>(); recoveryNodes.add("1"); jtaPropertyManager.getJTAEnvironmentBean().setXaRecoveryNodes(recoveryNodes); try { Uid uid = new Uid(); Xid xid = XATxConverter.getXid(uid, false, XATxConverter.FORMAT_ID); assertEquals(XAResourceOrphanFilter.Vote.ROLLBACK, orphanFilter.checkXid(xid)); TwoPhaseCoordinator tpc = new TwoPhaseCoordinator(uid); try { tpc.start(); assertEquals(XAResourceOrphanFilter.Vote.LEAVE_ALONE, orphanFilter.checkXid(xid)); } finally { tpc.cancel(); } assertEquals(XAResourceOrphanFilter.Vote.ROLLBACK, orphanFilter.checkXid(xid)); jtaPropertyManager.getJTAEnvironmentBean().setXaRecoveryNodes(null); TwoPhaseCoordinator tpc2 = new TwoPhaseCoordinator(uid); tpc2.start(); assertEquals(XAResourceOrphanFilter.Vote.ABSTAIN, orphanFilter.checkXid(xid)); tpc2.cancel(); } finally { jtaPropertyManager.getJTAEnvironmentBean().setXaRecoveryNodes(xaRecoveryNodes); } }
List<String> recoveryNodes = new LinkedList<String>(); recoveryNodes.add("1"); jtaPropertyManager.getJTAEnvironmentBean().setXaRecoveryNodes(recoveryNodes); final List<String> recoveryExtensions = new ArrayList<String>(); assertEquals(XAResourceOrphanFilter.Vote.ROLLBACK, orphanFilter.checkXid(xids.get(0))); } finally { jtaPropertyManager.getJTAEnvironmentBean().setXaRecoveryNodes(xaRecoveryNodes); recoveryPropertyManager.getRecoveryEnvironmentBean().setRecoveryModuleClassNames(null);
List<String> xaRecoveryNodes = jtaPropertyManager.getJTAEnvironmentBean().getXaRecoveryNodes(); jtaPropertyManager.getJTAEnvironmentBean().setOrphanSafetyInterval(0); jtaPropertyManager.getJTAEnvironmentBean().setXaRecoveryNodes(Arrays.asList(new String[]{NodeNameXAResourceOrphanFilter.RECOVER_ALL_NODES})); XARecoveryModule xarm = new XARecoveryModule(); xarm.addXAResourceOrphanFilter(new JTANodeNameXAResourceOrphanFilter()); jtaPropertyManager.getJTAEnvironmentBean().setXaRecoveryNodes(xaRecoveryNodes);