จะเปลี่ยนค่าของ com.arjuna.ats.jbossatx.jta.TransactionManagerService TransactionTimeout ณ รันไทม์ได้อย่างไร

เรามีสภาพแวดล้อม JBoss [EAP] 4.3.0.GA_CP01 และฉันจำเป็นต้องแก้ไข

TransactionTimeout 

ทรัพย์สินของ

com.arjuna.ats.jbossatx.jta.TransactionManagerService

แต่เมื่อใดก็ตามที่ฉันพยายามเปลี่ยนค่าผ่าน MBean จาก JMX-Console stacktrace ต่อไปนี้จะปรากฏขึ้น:

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 strong>) จะแสดงวิธีการ:

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

โปรดทราบว่าการดำเนินการนี้จะไม่เปลี่ยนค่าที่รายงานในแอตทริบิวต์ TransactionTimeout ของ MBean แต่ธุรกรรมทั้งหมดที่เริ่มต้นหลังจากเรียกใช้เมธอดนี้จะมีการหมดเวลาของธุรกรรมใหม่

รหัส 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

person Nicholas    schedule 09.07.2012
comment
ขอบคุณ.... ให้ฉันดูว่าฉันจะใช้สิ่งนี้ในสภาพแวดล้อมของฉันได้อย่างไร ฉันไม่ได้ใช้ Groovy - person Bharat Sinha; 12.07.2012
comment
ใช่แล้ว... ฉันพบว่ามีประโยชน์มากสำหรับตัวอย่างต่างๆ เนื่องจากฉันสามารถทดสอบได้อย่างรวดเร็ว และโดยปกติแล้วเจตนาของมันจะชัดเจนเหมือนเป็นรหัสหลอก - 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