2013-05-01 4 views
6

JTOpen की KeyedDataQueue कक्षा द्वारा प्रदान की गई पढ़ने() विधि का उपयोग करते समय मुझे एक अजीब व्यवहार पता चला है।JTOpen KeyedDataQueue पढ़ें() टाइमआउट

मैंने 90 के टाइमआउट सेट किए हैं और 99% पढ़ने के निष्पादन के लिए टाइमआउट पहुंचने पर मेरी कॉलिंग विधि निष्पादन फिर से शुरू हो गया है।

http://archive.midrange.com/java400-l/201112/msg00056.html

असल:

अन्य 1% टाइमआउट/पर पहुंच गया और मेरी बुला विधि लटका रहता है नहीं माना जाता है के लिए के रूप में ...

थोड़ा खोज के बाद मैं इस पोस्ट पाया यह इस बात की पुष्टि है कि मैं क्या संदिग्ध:

"मैं यह भी पाया कि DataQueue.read() टाइमआउट कार्यक्षमता सर्वर साइड है इसलिए यदि टीसीपी/आईपी Conn ईक्शन चुपचाप टूट गया है (जो मैं मानता हूं इसका मूल कारण है) यह अभी भी लटका होगा। "

मैं JTOpen के संस्करण 7.2 का उपयोग कर रहा हूँ और मुझे पता है संस्करण 7.9 पहले से ही वहाँ बाहर है। मैं क्योंकि मैं महत्वपूर्ण अनुप्रयोगों का एक बहुत 7.2 का उपयोग कर कि स्थिर रहे है और 7.9 के लिए अद्यतन नहीं किया वास्तव में इस है पहला वास्तविक परिदृश्य जो मुझे 7.9

उस निर्णय में मेरी सहायता करने के लिए मुझे आपकी प्रतिक्रिया पसंद आएगा, खासतौर से आप में से उन लोगों में से जो आपकी स्थिति में आए थे और अंततः जेटी ओपेन को अपग्रेड करके हल किया।

विशेष रूप से, क्या इस मुद्दे के लिए कामकाज हैं, और इसके साथ जेटी ओपेन सहायता को अपग्रेड कर रहा है? जेटी ओपेन को 7.9 ब्रेक में अपग्रेड करेगा कुछ भी जो 7.2 में काम कर रहा था?

+0

@ जेम्सस: मैं खुद को वर्तनी के लिए एक स्टिकर हूं, लेकिन सबकुछ को अमेरिकीकृत करने की कोई आवश्यकता नहीं है। ;) (हालांकि यह अन्यथा एक अच्छा संपादन था।) –

+1

आपको [Midrange.com पर जावा 400 सूची] (http://lists.midrange.com/mailman/listinfo/java400-l) का लिंक मिला है; आप उस मेलिंग सूची के लिए साइन अप करना चाहते हैं और वहां अपना प्रश्न पोस्ट कर सकते हैं। ऐसा लगता है कि अब तक आईबीएम मिड्रेंज समुदाय में Midrange.com की तुलना में स्टैक ओवरफ़्लो पर केवल बहुत पतली भागीदारी है। –

+0

शायद यह उनकी खराब वर्तनी क्षमता के कारण है: पी मैं अपनी किस्मत आजमाऊंगा – RedEagle

उत्तर

1

जैसा ऊपर बताया गया है डेटाक्यू रीड टाइमआउट सर्वर पक्ष है। यदि iSeries और क्लाइंट के बीच टीसीपी कनेक्शन स्टाल या मर जाता है तो ग्राहक सॉकेट के समय तक प्रतीक्षा करेगा। मेरा समाधान एक स्टॉल किए गए पढ़ने को रोकने के लिए एक असफल सुरक्षित इंटरप्टर स्थापित करना है। यह एक त्वरित कोड नमूना है कि यह कैसे किया जा सकता है।

public class DataQueueListenerExample { 
    //This executes our Interrupter after the specified delay. 
    public final ScheduledThreadPoolExecutor interruptExecuter = new ScheduledThreadPoolExecutor(1); 
    //the dataqueue object. 
    protected DataQueue dataqueue; 

    public DataQueueEntry read(int wait) 
    { 
     ScheduledFuture<?> future = null; 
     try { 
      //create our fail safe interrupter. We only want it to 
      //interrupt when we are sure the read has stalled. My wait time is 15 seconds 
      future = createInterrupter(wait * 2, TimeUnit.SECONDS); 
      //read the dataqueue 
      return this.dataqueue.read(wait); 
     } catch (AS400SecurityException e) { 
     } catch (ErrorCompletingRequestException e) { 
     } catch (IOException e) { 
     } catch (IllegalObjectTypeException e) { 
     } catch (InterruptedException e) { 
      //The read was interrupted by our Interrupter 
      return null; 
     } catch (ObjectDoesNotExistException e) { 
     } finally{ 
      //Cancel our interrupter 
      if(future != null && !future.isDone()) 
       future.cancel(true); 
      Thread.interrupted();//clear the interrupted flag 

      interruptExecuter.shutdown(); 
     } 
     return null; 
    } 


    public ScheduledFuture<?> createInterrupter(long timeout,TimeUnit timeunit) 
    { 
     return interruptExecuter.schedule(new Interrupter(),timeout,timeunit); 
    } 

    class Interrupter implements Runnable 
    { 
     final Thread parent; 
     Interrupter() 
     { 
      this.parent = Thread.currentThread(); 
     } 

     @Override 
     public void run() { 
      parent.interrupt(); 
     } 
    } 
    } 

मैं दृढ़ता से एक InterruptedException के बाद एक नया AS400 कनेक्शन पर DataQueue वस्तु पुनः बनाने की सलाह देते हैं। संभावना है कि आपका AS400 कनेक्शन रुक गया है। Thread.interrupt बहुत उपयोगी है, लेकिन सावधानी के साथ इसका उपयोग करें।

+0

यह लगभग सही है ... यह कोड सफलतापूर्वक इंटरप्टेड एक्सेप्शन तक पहुंचता है लेकिन विजुअलVM का उपयोग करके मुझे एहसास हुआ कि धागे लटकाए जा रहे हैं ... मुझे लगता है कि ऐसा इसलिए है क्योंकि डेटाक्यू रीड विधि अभी भी सक्रिय है ... कोई विचार? क्या इसे पढ़ने के रूप में सेट करने का कोई तरीका है? – RedEagle

+0

बस interruptExecuter.shutdown() जोड़ने की जरूरत है; धन्यवाद Zig158 – RedEagle

संबंधित मुद्दे