2011-01-18 18 views
11

बारी है मैं jboss 5.1.x उपयोग कर रहा हूँ, EJB3.0लेन-देन टाइमआउट

मैं एमडीबी जो JMS कतार को सुनता है। जब एमडीबी एक संदेश लेता है, तो यह कुछ मॉडेम को टीसीपी के माध्यम से एक संदेश भेजता है। कभी कभी कि मोडेम जब सर्वर एक जवाब के लिए इंतजार कर रहा है प्रतिक्रिया नहीं करता:

 byte[] byteData = receive(is); 

coz मैं InputStream पर समाप्ति सेट नहीं कर सकते।

इसलिए ईजेबी कंटेनर लेनदेन टाइमआउट (जो डिफ़ॉल्ट रूप से वहां है) के लिए धन्यवाद ऑपरेशन को वापस रोलिंग और फिर फिर से निष्पादित एक पुनः प्रयास किया गया।

डिफ़ॉल्ट रूप से इस तंत्र मेरे लिए ठीक काम करता है, समस्या है:

कभी कभी लेनदेन कभी नहीं का समय समाप्त हो, और लंबे समय के बाद मैं कंसोल में संदेश निम्नलिखित हो:

15:18:22,578 WARN [arjLoggerI18N] [com.arjuna.ats.arjuna.coordinator.TransactionReaper_18] - TransactionReaper::check timeout for TX a6b2232:5f8:4d3591c6:76 in state RUN 
    15:18:22,578 WARN [arjLoggerI18N] [com.arjuna.ats.arjuna.coordinator.BasicAction_58] - Abort of action id a6b2232:5f8:4d3591c6:76 invoked while multiple threads active within it. 
    15:18:22,578 WARN [arjLoggerI18N] [com.arjuna.ats.arjuna.coordinator.CheckedAction_2] - CheckedAction::check - atomic action a6b2232:5f8:4d3591c6:76 aborting with 1 threads active! 
    15:18:22,578 WARN [arjLoggerI18N] [com.arjuna.ats.arjuna.coordinator.TransactionReaper_7] - TransactionReaper::doCancellations worker Thread[Thread-10,5,jboss] successfully canceled TX a6b2232:5f8:4d3591c6:76 

कोई विचार क्या गलत है? और कभी-कभी यह क्यों काम करता है और कभी-कभी ऐसा नहीं होता है?

धन्यवाद,

किरण।

उत्तर

11

जेबीओएसएएस जो अर्जुन के लेनदेन प्रबंधक का उपयोग करता है। ईजेबी 3 इंटरसेप्टर श्रृंखला में अनलोल करना शुरू हो जाएगा और अंततः लेनदेन प्रबंधक इंटरसेप्टरों को मारा जाएगा जिनकी नौकरी लेनदेन को रद्द करना है।

  • लिए एमडीबी के आप इसे @ActivationConfigProperty(propertyName="transactionTimeout" value="1500")

  • अन्य सेम के लिए साथ annote कर सकते हैं श्रेणी स्तर या विधि स्तर पर @TransactionTimeout(1500) हो सकता है।

लेनदेन प्रबंधक का पता लगाता है कि लेन-देन का समय समाप्त हो गया है और फिर एक अतुल्यकालिक धागा (विधि में चल धागे से अलग) के भीतर से यह रोकता है, लेकिन यह वर्तमान में चल रहे धागा करने के लिए एक बाधा भेजता है कभी नहीं।

इसलिए परिणामस्वरूप: ने इसके अंदर सक्रिय कई धागे ... सक्रिय 1 धागे के साथ निरस्त कर रहे हैं!

संपादित करें:

//--- 

ThreadGroup root = Thread.currentThread().getThreadGroup().getParent(); 

while (root.getParent() != null) 
    root = root.getParent(); 

findAllThread(root,0); 

//--- 

public static findAllThread(ThreadGroup threadGroup, int level){ 

    int actCount = threadGroup.activeCount(); 
    Thread[] threads = new Thread[actCount*2]; 
    actCount = threadGroup.enumerate(threads, false); 


    for (int i=0; i<actCount; i++) { 
     Thread thread = threads[i]; 
     thread.interrupt(); 
    } 

    int groupCount = threadGroup.activeGroupCount(); 
    ThreadGroup[] groups = new ThreadGroup[numGroups*2]; 
    groupCount = threadGroup.enumerate(groups, false); 

    for (int i=0; i<groupCount; i++) 
     findAllThread(groups[i], level+1); 

//--- 

यह भी संदर्भ हेन्डलर, finalizer जैसे अन्य सक्रिय धागे सूची जाएगा, सिग्नल डिस्पैचर आदि

+0

मैं इसे कैसे संभाल होगा? मैं चाहता हूं कि वर्तमान में चल रहे थ्रेड को 'बाधित' करें। 10x – rayman

+0

इंटरप्ट को इंगित करने के लिए ध्वज का उपयोग करें और उस पर आधारित, थ्रेड को वर्तमान में निष्पादित कार्य को सेट होने पर रोकना चाहिए। –

+0

हां, लेकिन फिर भी आप कहते हैं कि लेन-देन टाइमआउट समय-समय पर थ्रेड में सक्षम नहीं होगा जो स्वयं धागे में चल रहे हैं। मैं इसे हासिल करना चाहता हूं, मैं इसे कैसे कार्यान्वित कर सकता हूं? 10x। – rayman