2013-12-05 4 views
0

Я написал следующий фрагмент кода, чтобы отправить сообщение потребителю. Он работает так долго, пока потребитель жив. Но я проверяю, что произойдет, если потребитель снизится. Поэтому у меня есть следующий класс.Thread зависает после производителя.send()

public class MyConnection{ 
Producer producer; 

private void init(String brokerAddress){ 
    com.sun.messaging.ConnectionFactory myFactory = new com.sun.messaging.ConnectionFactory(); 
    myFactory.setProperty(ConnectionConfiguration.imqAddressList, brokerAddress); 
    myFactory.setProperty(ConnectionConfiguration.imqAckOnProduce, "false"); 
    myFactory.setProperty(ConnectionConfiguration.imqConfiguredClientID, "clientId"); 
    myFactory.setProperty(ConnectionConfiguration.imqEnableSharedClientID, "true"); 
    javax.jms.Connection conn = myFactory.createConnection(); 
    session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE); 
    this.producer = session.createProducer(session.createTopic("SOME_TOPIC")); 
    myFactory.getProperty(ConnectionConfiguration.imqAckOnProduce); 
    connectionStatus = BROKER_CONNECTED; 
} 
//Message is of type javax.jms.Message 
private send(Message message){ 
    boolean paramterSent = false; 
    try 
    { 
    producer.send(message); 
    paramterSent = true; 
    } 
    catch (JMSException e) 
    { 
    connectionStatus = BROKER_DISCONNECTED; 
    logger.log(Level.INFO, "Could not send message to EPS ", e); 
    } 
    return paramterSent; 
} 

Так что я тестирую здесь я называю Init() и созданием соединения, то я убить брокер, который recieves сообщения. и затем я пытаюсь вызвать send, поэтому я ожидаю, что он будет выкидывать и JMXException, но это не так, и он зависает в файле manufacturer.send(), и на консоли я получаю это сообщение.

Dec 5, 2013 9:14:54 AM com.sun.messaging.jmq.jmsclient.ExceptionHandler logCaughtException 
WARNING: [I500]: Caught JVM Exception: java.io.EOFException: Trying to read 72 bytes. Already read 0 bytes. 
Dec 5, 2013 9:14:57 AM com.sun.messaging.jmq.jmsclient.ConnectionRecover logRecoverState 
INFO: [I107]: Connection recover state: RECOVER_INACTIVE, broker: localhost:31300(31301) 
Dec 5, 2013 9:15:21 AM com.sun.messaging.jmq.jmsclient.ExceptionHandler throwConnectionException 
WARNING: [C4003]: Error occurred on connection creation [10.187.37.188:31300]. - cause: java.net.ConnectException: Connection timed out: connect 

Я использую следующие

Oracle GlassFish(tm) Server MQ Destination 
getName():  SOME_TOPIC 
Class:   com.sun.messaging.BasicTopic 
getVERSION():  3.0 
isReadonly():  false 
getProperties(): {imqDestinationName=SOME_TOPIC, imqDestinationDescription=A Description for the Destination Object} 

Что я нашел из investating, что в пакете класса com.sun.messaging.jmq.jmsclient.MessageProducerImpl, метод checkReconnecting он не может получить блокировку на объекте reconnectSyncObj, так что он пытается получить доступ к нему, но не способен так его висит. Есть предположения?

Спасибо, Sriram

+0

Я изменил некоторые имена, чтобы соответствовать моим политикам компании. – sriram

ответ

0

Я решил проблему, закрывая соединение каждый раз, когда отсоединяется брокер. Я сделал это в методе onException для javax.jms.ExceptionListener.

public void onException(JMSException exception) 
     { 
     try 
     { 
      connection.close(); 
     } 
     catch (JMSException e) 
     { 
      logger.log(Level.INFO, "Connection Failed", e); 
     } 
     } 
Смежные вопросы