Java Hazelcast XtransAction与Bitronix事务管理器

Java Hazelcast XtransAction与Bitronix事务管理器,java,transactions,hazelcast,xa,bitronix,Java,Transactions,Hazelcast,Xa,Bitronix,我正在对Hazelcast XA事务进行一些测试,在使用Bitronix作为事务管理器时遇到了问题 我遵循了Hazelcast的官方文件: Libs版本: @Test public void hazelcastBitronixXATransactionTest() throws Exception{ try{ doHazelcastXATransactionTest(createInstance("myCluster")); }catch(Exception e

我正在对Hazelcast XA事务进行一些测试,在使用Bitronix作为事务管理器时遇到了问题

我遵循了Hazelcast的官方文件:

Libs版本:

@Test
public void hazelcastBitronixXATransactionTest() throws Exception{
    try{
        doHazelcastXATransactionTest(createInstance("myCluster"));
    }catch(Exception e){
        Assert.fail();
        System.out.println("Other Exception:" + e.getMessage());
    }
}
private HazelcastInstance createInstance(String clusterName){
    System.setProperty("hazelcast.logging.type", "slf4j");

    Config config = new Config();
    config.getGroupConfig().setName(clusterName);
    config.getNetworkConfig().getJoin().getMulticastConfig().setEnabled(true);

    TcpIpConfig tcpIpConfig = config.getNetworkConfig().getJoin().getTcpIpConfig();
    tcpIpConfig.setEnabled(false);

    return Hazelcast.newHazelcastInstance(config);
}
private void doHazelcastXATransactionTest(HazelcastInstance hazelcastInstance) throws Exception{
  BitronixTransactionManager btm = TransactionManagerServices.getTransactionManager();
  btm.setTransactionTimeout(60);
  btm.begin();

  HazelcastXAResource xaResource = hazelcastInstance.getXAResource();

  Transaction transaction = btm.getTransaction();
  transaction.enlistResource(xaResource);

  try {
      TransactionContext context = xaResource.getTransactionContext();
      TransactionalMap map = context.getMap("m");
      map.put("key", "value");

      transaction.delistResource(xaResource, XAResource.TMSUCCESS);

      btm.commit();
  } catch (Exception e) {
      System.out.println("Exception do rollback:" + e.getMessage());
      btm.rollback();
  }
}
bitronix.tm.internal.BitronixSystemException: unknown XAResource HazelcastXaResource {myCluster}, it does not belong to a registered resource
Hazelcast:3.5.4

Bitronix事务管理器:2.1.4

Java:1.7

代码:

@Test
public void hazelcastBitronixXATransactionTest() throws Exception{
    try{
        doHazelcastXATransactionTest(createInstance("myCluster"));
    }catch(Exception e){
        Assert.fail();
        System.out.println("Other Exception:" + e.getMessage());
    }
}
private HazelcastInstance createInstance(String clusterName){
    System.setProperty("hazelcast.logging.type", "slf4j");

    Config config = new Config();
    config.getGroupConfig().setName(clusterName);
    config.getNetworkConfig().getJoin().getMulticastConfig().setEnabled(true);

    TcpIpConfig tcpIpConfig = config.getNetworkConfig().getJoin().getTcpIpConfig();
    tcpIpConfig.setEnabled(false);

    return Hazelcast.newHazelcastInstance(config);
}
private void doHazelcastXATransactionTest(HazelcastInstance hazelcastInstance) throws Exception{
  BitronixTransactionManager btm = TransactionManagerServices.getTransactionManager();
  btm.setTransactionTimeout(60);
  btm.begin();

  HazelcastXAResource xaResource = hazelcastInstance.getXAResource();

  Transaction transaction = btm.getTransaction();
  transaction.enlistResource(xaResource);

  try {
      TransactionContext context = xaResource.getTransactionContext();
      TransactionalMap map = context.getMap("m");
      map.put("key", "value");

      transaction.delistResource(xaResource, XAResource.TMSUCCESS);

      btm.commit();
  } catch (Exception e) {
      System.out.println("Exception do rollback:" + e.getMessage());
      btm.rollback();
  }
}
bitronix.tm.internal.BitronixSystemException: unknown XAResource HazelcastXaResource {myCluster}, it does not belong to a registered resource
试验方法:

@Test
public void hazelcastBitronixXATransactionTest() throws Exception{
    try{
        doHazelcastXATransactionTest(createInstance("myCluster"));
    }catch(Exception e){
        Assert.fail();
        System.out.println("Other Exception:" + e.getMessage());
    }
}
private HazelcastInstance createInstance(String clusterName){
    System.setProperty("hazelcast.logging.type", "slf4j");

    Config config = new Config();
    config.getGroupConfig().setName(clusterName);
    config.getNetworkConfig().getJoin().getMulticastConfig().setEnabled(true);

    TcpIpConfig tcpIpConfig = config.getNetworkConfig().getJoin().getTcpIpConfig();
    tcpIpConfig.setEnabled(false);

    return Hazelcast.newHazelcastInstance(config);
}
private void doHazelcastXATransactionTest(HazelcastInstance hazelcastInstance) throws Exception{
  BitronixTransactionManager btm = TransactionManagerServices.getTransactionManager();
  btm.setTransactionTimeout(60);
  btm.begin();

  HazelcastXAResource xaResource = hazelcastInstance.getXAResource();

  Transaction transaction = btm.getTransaction();
  transaction.enlistResource(xaResource);

  try {
      TransactionContext context = xaResource.getTransactionContext();
      TransactionalMap map = context.getMap("m");
      map.put("key", "value");

      transaction.delistResource(xaResource, XAResource.TMSUCCESS);

      btm.commit();
  } catch (Exception e) {
      System.out.println("Exception do rollback:" + e.getMessage());
      btm.rollback();
  }
}
bitronix.tm.internal.BitronixSystemException: unknown XAResource HazelcastXaResource {myCluster}, it does not belong to a registered resource
Hazelcast实例创建方法:

@Test
public void hazelcastBitronixXATransactionTest() throws Exception{
    try{
        doHazelcastXATransactionTest(createInstance("myCluster"));
    }catch(Exception e){
        Assert.fail();
        System.out.println("Other Exception:" + e.getMessage());
    }
}
private HazelcastInstance createInstance(String clusterName){
    System.setProperty("hazelcast.logging.type", "slf4j");

    Config config = new Config();
    config.getGroupConfig().setName(clusterName);
    config.getNetworkConfig().getJoin().getMulticastConfig().setEnabled(true);

    TcpIpConfig tcpIpConfig = config.getNetworkConfig().getJoin().getTcpIpConfig();
    tcpIpConfig.setEnabled(false);

    return Hazelcast.newHazelcastInstance(config);
}
private void doHazelcastXATransactionTest(HazelcastInstance hazelcastInstance) throws Exception{
  BitronixTransactionManager btm = TransactionManagerServices.getTransactionManager();
  btm.setTransactionTimeout(60);
  btm.begin();

  HazelcastXAResource xaResource = hazelcastInstance.getXAResource();

  Transaction transaction = btm.getTransaction();
  transaction.enlistResource(xaResource);

  try {
      TransactionContext context = xaResource.getTransactionContext();
      TransactionalMap map = context.getMap("m");
      map.put("key", "value");

      transaction.delistResource(xaResource, XAResource.TMSUCCESS);

      btm.commit();
  } catch (Exception e) {
      System.out.println("Exception do rollback:" + e.getMessage());
      btm.rollback();
  }
}
bitronix.tm.internal.BitronixSystemException: unknown XAResource HazelcastXaResource {myCluster}, it does not belong to a registered resource
Do方法:

@Test
public void hazelcastBitronixXATransactionTest() throws Exception{
    try{
        doHazelcastXATransactionTest(createInstance("myCluster"));
    }catch(Exception e){
        Assert.fail();
        System.out.println("Other Exception:" + e.getMessage());
    }
}
private HazelcastInstance createInstance(String clusterName){
    System.setProperty("hazelcast.logging.type", "slf4j");

    Config config = new Config();
    config.getGroupConfig().setName(clusterName);
    config.getNetworkConfig().getJoin().getMulticastConfig().setEnabled(true);

    TcpIpConfig tcpIpConfig = config.getNetworkConfig().getJoin().getTcpIpConfig();
    tcpIpConfig.setEnabled(false);

    return Hazelcast.newHazelcastInstance(config);
}
private void doHazelcastXATransactionTest(HazelcastInstance hazelcastInstance) throws Exception{
  BitronixTransactionManager btm = TransactionManagerServices.getTransactionManager();
  btm.setTransactionTimeout(60);
  btm.begin();

  HazelcastXAResource xaResource = hazelcastInstance.getXAResource();

  Transaction transaction = btm.getTransaction();
  transaction.enlistResource(xaResource);

  try {
      TransactionContext context = xaResource.getTransactionContext();
      TransactionalMap map = context.getMap("m");
      map.put("key", "value");

      transaction.delistResource(xaResource, XAResource.TMSUCCESS);

      btm.commit();
  } catch (Exception e) {
      System.out.println("Exception do rollback:" + e.getMessage());
      btm.rollback();
  }
}
bitronix.tm.internal.BitronixSystemException: unknown XAResource HazelcastXaResource {myCluster}, it does not belong to a registered resource
我收到一个
BitronixSystemException
,在尝试登记XA资源
事务时抛出。登记资源(xaResource)

完整的堆栈跟踪:

@Test
public void hazelcastBitronixXATransactionTest() throws Exception{
    try{
        doHazelcastXATransactionTest(createInstance("myCluster"));
    }catch(Exception e){
        Assert.fail();
        System.out.println("Other Exception:" + e.getMessage());
    }
}
private HazelcastInstance createInstance(String clusterName){
    System.setProperty("hazelcast.logging.type", "slf4j");

    Config config = new Config();
    config.getGroupConfig().setName(clusterName);
    config.getNetworkConfig().getJoin().getMulticastConfig().setEnabled(true);

    TcpIpConfig tcpIpConfig = config.getNetworkConfig().getJoin().getTcpIpConfig();
    tcpIpConfig.setEnabled(false);

    return Hazelcast.newHazelcastInstance(config);
}
private void doHazelcastXATransactionTest(HazelcastInstance hazelcastInstance) throws Exception{
  BitronixTransactionManager btm = TransactionManagerServices.getTransactionManager();
  btm.setTransactionTimeout(60);
  btm.begin();

  HazelcastXAResource xaResource = hazelcastInstance.getXAResource();

  Transaction transaction = btm.getTransaction();
  transaction.enlistResource(xaResource);

  try {
      TransactionContext context = xaResource.getTransactionContext();
      TransactionalMap map = context.getMap("m");
      map.put("key", "value");

      transaction.delistResource(xaResource, XAResource.TMSUCCESS);

      btm.commit();
  } catch (Exception e) {
      System.out.println("Exception do rollback:" + e.getMessage());
      btm.rollback();
  }
}
bitronix.tm.internal.BitronixSystemException: unknown XAResource HazelcastXaResource {myCluster}, it does not belong to a registered resource

有人面对过这个问题吗?这方面有什么线索吗?

显然,Bitronix需要在使用XAResources之前注册它们。 在获得HazelcastXAResource后,我在下面添加了一行代码,它成功了

EhCacheXAResourceProducer.registerXAResource(xaResource.getName(),xaResource)