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