1

我之前问过这个问题如何在运行时更改 com.arjuna.ats.jbossatx.jta.TransactionManagerService TransactionTimeout 的值?

根据提供的答案,我发现这个 java 代码可以完成我的工作:

MBeanServer mBeanServer = MBeanServerLocator.locateJBoss();
TransactionManagerDelegate tmd = (TransactionManagerDelegate) mBeanServer.getAttribute(new ObjectName("jboss:service=TransactionManager"), "TransactionManager");
System.out.println("Prev: " + tmd.getTransactionTimeout());
tmd.setTransactionTimeout(200);
System.out.println("New: " + tmd.getTransactionTimeout());

现在问题来了……代码执行得很好,但是当我从 JMX 控制台检查时,事务超时仍然相同。

当我调试时,我发现从 mBeanServer 获取的 TM 实例和 jmx-console 上可用的 TM 实例是不同的!

有没有办法更新 JMX-Console 上可用的 TM 实例?

4

2 回答 2

1

巴拉特;

它们是不同的对象实例,但只有一个事务管理器。您所看到的只是内部 Arjuna 事务管理器核心的两个不同包装器/代理。此代码从两个不同的代理获取当前事务,但实际事务 UUID 相同:

def txManager = mbeanserver.getAttribute(JMXHelper.objectName("jboss:service=TransactionManager"), "TransactionManager");
TX.exec({
    println txManager.getTransaction();
    println mbeanserver.getAttribute(JMXHelper.objectName("jboss:service=TransactionManager"), "UserTransaction");
    assert mbeanserver.getAttribute(JMXHelper.objectName("jboss:service=TransactionManager"), "UserTransaction").toString().replace("Transaction: ", "").equals(txManager.getTransaction().toString())
    println "Timeout:${txManager.getTransactionTimeout()}";
});
txManager.setTransactionTimeout(200);
TX.exec({
    println txManager.getTransaction();
    println mbeanserver.getAttribute(JMXHelper.objectName("jboss:service=TransactionManager"), "UserTransaction");
    assert mbeanserver.getAttribute(JMXHelper.objectName("jboss:service=TransactionManager"), "UserTransaction").toString().replace("Transaction: ", "").equals(txManager.getTransaction().toString())
    println "Timeout:${txManager.getTransactionTimeout()}";
});

输出:

TransactionImple < ac,BasicAction:ae60d43:d590:4ffc7013:265841 状态:ActionStatus.RUNNING > 事务:TransactionImple < ac,BasicAction:ae60d43:d590:4ffc7013:265841 状态:ActionStatus.RUNNING > Timeout:200 TransactionImple < 3 ac,BasicAction:ae60 :d590:4ffc7013:265842 状态:ActionStatus.RUNNING > 事务:TransactionImple < ac,BasicAction:ae60d43:d590:4ffc7013:265842 状态:ActionStatus.RUNNING > 超时:400

于 2012-07-13T16:20:18.893 回答
0

上面的代码有效并且确实改变了事务超时。正如@Nicholas 提到 的,它们是不同的对象实例,但只有一个事务管理器。

但是 MBean 的 TransactionTimeout 属性中报告的值不会改变

这让我首先提出了这个问题。

于 2012-07-13T12:33:19.913 回答