Как изменить значение com.arjuna.ats.jbossatx.jta.TransactionManagerService TransactionTimeout во время выполнения?

У нас есть среда JBoss [EAP] 4.3.0.GA_CP01, и мне нужно изменить

TransactionTimeout 

свойство

com.arjuna.ats.jbossatx.jta.TransactionManagerService

но всякий раз, когда я пытаюсь изменить значение через MBean из JMX-Console; появляется следующая трассировка стека:

java.lang.IllegalStateException: Cannot set transaction timeout once MBean has started
com.arjuna.ats.jbossatx.jta.TransactionManagerService.setTransactionTimeout(TransactionManagerService.java:323)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
java.lang.reflect.Method.invoke(Method.java:597)
org.jboss.mx.interceptor.AttributeDispatcher.invoke(AttributeDispatcher.java:136)
org.jboss.mx.server.Invocation.dispatch(Invocation.java:94)
org.jboss.mx.server.Invocation.invoke(Invocation.java:86)
org.jboss.mx.interceptor.ModelMBeanAttributeInterceptor.invoke(ModelMBeanAttributeInterceptor.java:103)
org.jboss.mx.interceptor.PersistenceInterceptor.invoke(PersistenceInterceptor.java:76)
org.jboss.mx.server.Invocation.invoke(Invocation.java:88)
org.jboss.mx.server.AbstractMBeanInvoker.setAttribute(AbstractMBeanInvoker.java:461)
org.jboss.mx.server.MBeanServerImpl.setAttribute(MBeanServerImpl.java:608)
org.jboss.jmx.adaptor.control.Server.setAttributes(Server.java:206)
org.jboss.jmx.adaptor.html.HtmlAdaptorServlet.updateAttributes(HtmlAdaptorServlet.java:236)
org.jboss.jmx.adaptor.html.HtmlAdaptorServlet.processRequest(HtmlAdaptorServlet.java:98)
org.jboss.jmx.adaptor.html.HtmlAdaptorServlet.doPost(HtmlAdaptorServlet.java:82)
javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)

Есть ли способ программно изменить значение TransactionTimeout без подпрыгивания сервера во время выполнения??


person Bharat Sinha    schedule 09.07.2012    source источник


Ответы (2)


Вот отличный пример того, как это сделать (используя встроенный Groovy внутри экземпляра JBoss 4.3.0.GA_CP01):

mbeanserver.getAttribute(JMXHelper.objectName("jboss:service=TransactionManager"), "TransactionManager").setTransactionTimeout(200);

По сути, MBeanService com.arjuna.ats.jbossatx.jta.TransactionManagerService не позволяет изменить время ожидания транзакции по умолчанию, но если вы получите атрибут TransactionManager (экземпляр com.arjuna.ats.jbossatx.jta.TransactionManagerDelegate), он предоставляет метод:

public void com.arjuna.ats.jbossatx.BaseTransactionManagerDelegate.setTransactionTimeout(int) throws javax.transaction.SystemException

Обратите внимание, что это не изменит значения атрибута TransactionTimeout компонента MBean, но все транзакции, запущенные после вызова этого метода, будут иметь новый тайм-аут транзакции.

Более заводной код:

def txManager = mbeanserver.getAttribute(JMXHelper.objectName("jboss:service=TransactionManager"), "TransactionManager");
TX.exec({
    println "Timeout:${txManager.getTransactionTimeout()}";
});
txManager.setTransactionTimeout(txManager.getTransactionTimeout() * 2);
TX.exec({
    println "Timeout:${txManager.getTransactionTimeout()}";
});

Выход:

Время ожидания:200
Время ожидания:400

person Nicholas    schedule 09.07.2012
comment
Спасибо.... позвольте мне посмотреть, как я могу использовать это в своей среде. Я не использую Groovy. - person Bharat Sinha; 12.07.2012
comment
Да... Я нахожу groovy полезным для примеров, потому что я могу быстро его протестировать, и его цель обычно понятна как псевдокод. - person Nicholas; 12.07.2012

Спасибо Николай!

Вот код 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());

И, как вы процитировали, Обратите внимание, что это не изменит значение, указанное в атрибуте TransactionTimeout MBean, однако значение будет действовать для всех транзакций после этой операции.

person Bharat Sinha    schedule 13.07.2012