Bagaimana cara mengubah nilai com.arjuna.ats.jbossatx.jta.TransactionManagerService TransactionTimeout saat run-time?

Kami memiliki lingkungan JBoss [EAP] 4.3.0.GA_CP01 dan saya perlu memodifikasi

TransactionTimeout 

milik

com.arjuna.ats.jbossatx.jta.TransactionManagerService

tetapi setiap kali saya mencoba mengubah nilainya melalui MBean dari JMX-Console; stacktrace berikut muncul:

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)

Apakah ada cara terprogram untuk mengubah nilai TransactionTimeout tanpa memantulkan server saat run-time??


person Bharat Sinha    schedule 09.07.2012    source sumber


Jawaban (2)


Berikut adalah contoh keren tentang cara melakukan ini (menggunakan groovy yang tertanam di dalam instance JBoss 4.3.0.GA_CP01):

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

Pada dasarnya, MBeanService com.arjuna.ats.jbossatx.jta.TransactionManagerService tidak mengizinkan Anda mengubah batas waktu transaksi default, tetapi jika Anda mengambil atribut TransactionManager (contoh dari com.arjuna.ats.jbossatx.jta.TransactionManagerDelegate), ini memperlihatkan metode:

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

Perhatikan bahwa ini tidak akan mengubah nilai yang dilaporkan dalam atribut TransactionTimeout MBean, namun semua transaksi yang dimulai setelah metode ini dipanggil akan memiliki batas waktu transaksi yang baru.

Kode yang lebih asyik:

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()}";
});

Keluaran:

Batas waktu:200
Batas waktu:400

person Nicholas    schedule 09.07.2012
comment
Terima kasih.... biarkan saya melihat bagaimana saya dapat menggunakan ini di lingkungan saya. Saya tidak menggunakan Groovy. - person Bharat Sinha; 12.07.2012
comment
Ya... Menurut saya groovy berguna sebagai contoh karena saya dapat mengujinya dengan cepat dan maksudnya biasanya jelas sebagai kode semu. - person Nicholas; 12.07.2012

Terima kasih Nicholas!

Berikut adalah kode Java yang dapat digunakan untuk mengubah batas waktu transaksi saat runtime...

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());

Dan seperti yang Anda kutip, Perhatikan bahwa ini tidak akan mengubah nilai yang dilaporkan dalam atribut TransactionTimeout MBean namun nilai tersebut akan efektif untuk semua transaksi setelah operasi ini.

person Bharat Sinha    schedule 13.07.2012