2012-07-09 60 views
0

我們的JBoss [EAP] 4.3.0.GA_CP01環境,我需要修改的如何在運行時更改com.arjuna.ats.jbossatx.jta.TransactionManagerService TransactionTimeout的值?

com.arjuna.ats.jbossatx.jta.TransactionManagerService 

TransactionTimeout 

財產,但每當我試圖通過從MBean的JMX-控制檯更改值;以下堆棧跟蹤顯示出來:

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的值,而不在運行時反彈的服務器?

回答

0

謝謝尼古拉斯!

這裏是一個可以用來改變運行事務超時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()); 

而當你引用, 注意,這不會改變MBean的TransactionTimeout報告的值屬性但是,該值對於此操作發佈後的所有事務均有效。

2

下面是如何做到這一點一個常規例子(使用JBoss的4.3.0.GA_CP01實例內嵌入常規):

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

基本上,MBeanService com.arjuna.ats.jbossatx.jta.TransactionManagerService不允許更改默認的事務超時,但如果你獲得的屬性事務管理com.arjuna.ats.jbossatx.jta.TransactionManagerDelegate的實例),它暴露的方法:

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

請注意,這不會更改MBean的TransactionTimeout屬性中報告的值,但在調用此方法後啓動的所有事務都會產生新的事務超時。

更多Groovy代碼:

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

+0

謝謝....讓我看看我如何在我的環境中使用它。我不使用Groovy。 – SiB 2012-07-12 09:20:45

+1

是的......我發現groovy對於例子很有用,因爲我可以快速測試它,它的意圖通常很明顯就是僞代碼。 – Nicholas 2012-07-12 10:22:42