Irek
Słonina
programowanie, bazy
danych i linuksy
Temat: JMS MessageListener i zanik połączenia
Witam,od pewnego czasu moja aplikacja z bliżej nieokreślonych przyczyn
o losowych porach przestaje odbierać komunikaty z EAI.
Podejrzewam zaniki połączenia sieciowego pomiędzy środowiskiem
aplikacji, a szyną EAI.
Przyczyna na chwilę obecną mniejszym problemem, większym jest
sposób reakcji aplikacji na awarię.
Aplikacja nie rzuca mi żadnym wyjątkiem, nie mam żadnego śladu
w logach dotyczącego awarii połączenia.
Nie mam dużego doświadczenia w JMS'ach więc proszę o poradę:
stosujecie jakieś watchdogi sprawdzające stan połączenia?
Może gdzieś nie łapię potrzebnego wyjątku albo trzeba zastosować
jakieś dodatkowe przełączniki w klasach połączeniowych?
Mam ograniczony dostęp do szyny, a tym bardziej symulację awarii
dlatego w pierwszej kolejności szukam błędów w kodzie.
Uproszczony kod, który stosuję do podłączenia się do szyny:
package TMP;
import com.ibm.jms.JMSTextMessage;
import com.ibm.mq.jms.MQQueue;
import com.ibm.mq.jms.MQQueueConnection;
import com.ibm.mq.jms.MQQueueConnectionFactory;
import com.ibm.mq.jms.MQQueueReceiver;
import com.ibm.mq.jms.MQQueueSession;
import java.util.Enumeration;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.Session;
public class EAIListenerProto {
public EAIListenerProto() {
MQQueueConnection c;
MQQueueReceiver receiver = null;
MQQueueSession sessionIn;
try {
MQQueueConnectionFactory qcf = new MQQueueConnectionFactory();
// [tutaj wlasciwe ustawianie qcf, SSL itp.]
c = (MQQueueConnection) qcf.createConnection();
sessionIn = (MQQueueSession) c.createQueueSession(true, Session.CLIENT_ACKNOWLEDGE);
MQQueue queueIn = (MQQueue) sessionIn.createQueue("queue:///JAKIS.IN");
receiver = (MQQueueReceiver) sessionIn.createReceiver(queueIn);
c = (MQQueueConnection) qcf.createConnection();
receiver.setMessageListener(new MessageListener() {
@Override
public void onMessage(Message arg0) {
JMSTextMessage msg = null;
if (arg0 instanceof JMSTextMessage) {
try {
msg = (JMSTextMessage) arg0;
Enumeration en = arg0.getPropertyNames();
int i = 0;
while (en.hasMoreElements()) {
String x = en.nextElement().toString();
System.out.println("enum " + i + ": " + x);
System.out.println("val " + i + ": " + arg0.getObjectProperty(x));
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
});
c.start();
} catch (Throwable ex) {
ex.printStackTrace();
}
}
}