2013-06-17 8 views
1

Я сделал простую заявку ActiveMQ.Каковы возможные причины, по которым приложение ActiveMQ отключается молча?

Слушает в очереди. Если приходит сообщение, распечатайте dataId

Вот код:

import javax.jms.Connection; 
import javax.jms.ConnectionFactory; 
import javax.jms.Destination; 
import javax.jms.ExceptionListener; 
import javax.jms.JMSException; 
import javax.jms.MapMessage; 
import javax.jms.Message; 
import javax.jms.MessageConsumer; 
import javax.jms.MessageListener; 
import javax.jms.Session; 

import org.apache.activemq.ActiveMQConnectionFactory; 

public class MQ implements MessageListener { 
    private Connection connection = null; 
    private Session session = null; 
    private Destination destination = null; 

    private void errorOnConnection(JMSException e) { 
     System.out.println("MQ is having problems. Exception::"+ e); 
    } 

    private void init() throws JMSException { 
     String BROKER_URL = "failover:(tcp://myQueue001:61616,tcp://myQueue002:61616)?randomize=false"; 
     ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(BROKER_URL); 

     connection = connectionFactory.createConnection("user", "password"); 

     connection.setExceptionListener(
        new ExceptionListener() { 
         @Override public void onException(JMSException e) { 
          errorOnConnection(e); 
         } 
        }); 

     session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); 

     destination = session.createQueue("myQueue"); 


     MessageConsumer consumer = session.createConsumer(destination); 
     consumer.setMessageListener(this); 
    } 

    public boolean start() { 
     try { 
      if(connection==null) 
       init(); 
      connection.start(); 
     } catch (Exception e) { 
      System.out.println("MQListener cannot be started, exception: " + e); 
     } 
     return true; 

    } 

    @Override 
    public void onMessage(Message msg) { 
     try { 
      if(msg instanceof MapMessage){ 
       MapMessage m = (MapMessage)msg; 
       int dataId = m.getIntProperty("dataId"); 
       System.out.println(dataId); 
      } 
     } catch (JMSException e) { 
      System.out.println("Got an exception: " + e); 
     } 


    } 

    public static void main(String[] args) { 
     MQ mq = new MQ(); 
     mq.start(); 

    } 

} 

Он отлично работает и делает то, что он предназначен для выполнения.

Однако, проблема в том, что он может работать только в течение нескольких дней. Через несколько дней он просто прекращает работу без каких-либо исключений или ошибок.

Очередь, которую я слушаю, относится к третьей стороне. От парня там очередь иногда будет закрыта или перезапущена или прервана.

Но я думаю, что даже если это произойдет, настройки ActiveMQ по умолчанию будут обрабатывать его, последовательно подключаясь к нему, не так ли? (в соответствии с http://activemq.apache.org/cms/configuring.html))

Итак, возможны ли другие возможные причины, приводящие мой код к молчанию?

ответ

1

Зависит от бит на вашей версии. Поскольку вы ничего не делаете сами, чтобы поддерживать приложение, но вместо этого в зависимости от кода ActiveMQ, чтобы поддерживать хотя бы один поток, не относящийся к deamon. В некоторых версиях ActiveMQ клиент не всегда делал это, так что ваше приложение вполне могло появиться при сбое при сбое. Лучше всего перейти на v5.8.0, который, как я полагаю, имел некоторые исправления для этого.

Вы можете добавить код опроса в главном, чтобы что-то прочитать с консоли, или что бы не допустить, чтобы клиент оставался до тех пор, пока вы не уверены, что хотите его спуститься.

+0

спасибо. Чтобы сохранить его, у вас есть лучший способ вместо чтения с консоли? как насчет Thread.sleep в главном или что-то в этом роде? –

+0

Моя текущая версия - 5.2.0 –

+0

Сделайте все, что работает для вашего прецедента. Вы можете использовать отдельный сеанс и потребитель для выполнения блокирующего приема по теме управления или что-то еще. В конце концов, вам нужно выбрать что-то, что сработает для вас. –

Смежные вопросы