2012-08-06 6 views
5

मुझे जेएमएस री-कनेक्ट रणनीति के साथ कोई समस्या है। मुझे यकीन नहीं है कि मैं इसे सही तरीके से कर रहा हूं (संभवतः मैं नहीं हूं)। वैसे भी, मैं वेबलॉगिक का उपयोग कर रहा हूं, और यह एक उपभोक्ता ग्राहक है। यहां बताया गया है कि मैं कनेक्शन कैसे प्राप्त करता हूं, और स्वचालित पुनः कनेक्ट जोड़ने का प्रयास करता हूं। समस्या यह है कि यह फिर से कनेक्ट नहीं होता है, और कभी-कभी लॉगिंग करने में कोई अपवाद नहीं है। मैं वेबलॉगिक शुरू करके स्थिति को फिर से बना सकता हूं, प्रारंभिक कनेक्शन प्राप्त करने वाले उपभोक्ता क्लाइंट को शुरू करता हूं, मैं वेबलॉगिक को बंद कर देता हूं, फिर मैं वेबलॉग को फिर से शुरू करता हूं जिस बिंदु पर यह उपभोक्ता कतार में किसी भी संदेश को स्वीकार किए बिना कतार में रहता है क्योंकि उन्हें प्राप्त नहीं किया जा रहा है।शुरुआत में और पहले से ही पिछले कनेक्शन प्राप्त करने के बाद JMS सर्वर से पुनः कनेक्टिंग

public void setReceiver(MessageListener listener) { 
     try { 
      Properties parm = new Properties(); 
      parm.setProperty("java.naming.factory.initial", 
        "weblogic.jndi.WLInitialContextFactory"); 
      parm.setProperty("java.naming.provider.url", URL); 
      parm.setProperty("java.naming.security.principal", username); 
      parm.setProperty("java.naming.security.credentials", password); 
      ctx = new InitialContext(parm); 
      final QueueConnectionFactory connectionFactory = (QueueConnectionFactory) ctx 
        .lookup(conFactoryName); 
      connection = connectionFactory.createQueueConnection(); 
      // TODO: 8/6/2012 Work on reconnection strategies for Consumer. 
      ((WLConnection) connection) 
        .setReconnectPolicy(JMSConstants.RECONNECT_POLICY_ALL); 
      ((WLConnection) connection).setReconnectBlockingMillis(30000L); 
      ((WLConnection) connection).setTotalReconnectPeriodMillis(-1L); 
      session = connection.createQueueSession(false, 
        Session.AUTO_ACKNOWLEDGE); 

      queue = (Queue) ctx.lookup(queueName); 
      // receiver = session.createReceiver(queue); 
      // receiver.setMessageListener(listener); 
      consumer = session.createConsumer(queue); 
      consumer.setMessageListener(listener); 

      connection.setExceptionListener(new ExceptionListener() { 

       @Override 
       public void onException(JMSException arg0) { 
        // Assume Disconnected. 
        FileHandler fh = null; 
        try { 
         fh = new FileHandler("./logs/ExceptionListener", true); 
        } catch (SecurityException e) { 
         e.printStackTrace(); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
        SimpleFormatter formatter = new SimpleFormatter(); 
        fh.setFormatter(formatter); 
        Logger log2 = Logger.getLogger("ExceptionListener"); 
        log2.addHandler(fh); 
        boolean connected = false; 
        do { 
         if (connection != null) { 
          try { 
           connection.close(); 
          } catch (JMSException e) { 
           log.warning(e.toString()); 
          } 
          try { 
           connection = connectionFactory.createQueueConnection(); 
           connection.setExceptionListener(this); 
           connection.start(); 
           connected = true; 
          } catch (JMSException e) { 
           log.severe(e.toString()); 
          } 
         } 
        } while (!connected); 

       } 
      }); 
      connection.start(); 

     } catch (JMSException je) { 
      log.severe(je.getMessage()); 
     } catch (Exception e) { 
      log.severe(e.getMessage()); 
     } 
    } 

उत्तर

3

तो आखिर में मैंने इस मुद्दे को समझ लिया। अपवाद श्रोता के साथ मुख्य समस्या को मेरे निर्माण पथ में प्रतिस्पर्धी जार होने के कारण नहीं कहा जा रहा था। मेरे wljmsclient.jar और wlsasclient.jar को हटाने के बाद, मुझे wlfullclient.jar और wljmsclient.jar और wlsjclient.jar था, मेरे निर्माण पथ में, मुझे त्रुटि संदेश प्राप्त करना शुरू हुआ जो मुझे आगे डीबग करने की अनुमति देता था। यहाँ मेरी अंतिम समाधान है जो प्रारंभिक कनेक्शन पर हर 30 सेकंड से कनेक्ट करने की कोशिश करेंगे, और फिर इसे अगर यह एक कनेक्शन हासिल की है, लेकिन फिर हर 30 सेकंड में फिर से कनेक्ट करने के लिए कोशिश करेंगे यह खो दिया है:

public boolean setReceiver(MessageListener listener) { 
     try { 
      Properties parm = new Properties(); 
      parm.setProperty("java.naming.factory.initial", 
        "weblogic.jndi.WLInitialContextFactory"); 
      parm.setProperty("java.naming.provider.url", URL); 
      parm.setProperty("java.naming.security.principal", username); 
      parm.setProperty("java.naming.security.credentials", password); 
      ctx = new InitialContext(parm); 
      final QueueConnectionFactory connectionFactory = (QueueConnectionFactory) ctx 
        .lookup(conFactoryName); 
      connection = connectionFactory.createQueueConnection(); 
      ((WLConnection) connection) 
        .setReconnectPolicy(JMSConstants.RECONNECT_POLICY_ALL); 
      ((WLConnection) connection).setReconnectBlockingMillis(30000L); 
      ((WLConnection) connection).setTotalReconnectPeriodMillis(-1L); 
      session = connection.createQueueSession(false, 
        Session.AUTO_ACKNOWLEDGE); 
      queue = (Queue) ctx.lookup(queueName); 
      consumer = session.createConsumer(queue); 
      consumer.setMessageListener(listener); 

      connection.setExceptionListener(new ExceptionListener() { 
       @Override 
       public void onException(JMSException arg0) { 
        // Assume Disconnected. 
        Logger log2 = new MyLogger().getLogger("BPEL Client"); 
        if (arg0 instanceof LostServerException) { 
         log2.severe("Connection to the Server has been lost, will retry in 30 seconds. " 
           + arg0.toString()); 
        } else { 
         log2.severe(arg0.toString()); 
        } 

       } 
      }); 
      connection.start(); 
      log.info("Successfully connected to " + URL); 
      return true; 
     } catch (JMSException je) { 
      log.severe("Could not connect to the WebLogic Server, will retry in 30 seconds. " 
        + je.getMessage()); 
      try { 
       Thread.sleep(30000L); 
      } catch (InterruptedException e) { 
       log.warning(e.toString()); 
      } 
      return setReceiver(listener); 
     } catch (Exception e) { 
      log.severe("Could not connect to the WebLogic Server, will retry in 30 seconds. " 
        + e.toString()); 
      try { 
       Thread.sleep(30000L); 
      } catch (InterruptedException ie) { 
       log.warning(ie.toString()); 
      } 
      return setReceiver(listener); 

     } 
    } 
+3

हैं अंततः कनेक्शन प्राप्त नहीं किया जा सकता है अंततः आपको पकड़ ब्लॉक से रिकर्सिव कॉल के कारण एक स्टैक ओवरफ्लो त्रुटि मिल जाएगी –

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