2

簡単な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によると)

私のコードを黙って終了させる他の考えられる原因はありますか?

4

1 に答える 1

1

バージョンのビットに依存します。アプリケーションの実行を維持するために自分で何もしているのではなく、少なくとも 1 つの非デーモン スレッドの実行を維持するために ActiveMQ コードに依存しているためです。一部の ActiveMQ バージョンでは、クライアントが常にこれを行っているとは限らなかったため、フェイルオーバーが発生している間、アプリケーションは完全に停止する可能性がありました。v5.8.0 に切り替えるのが最善の策です。

メインにポーリングコードを追加して、コンソールから何かを読み取ったり、クライアントをダウンさせたいと確信するまでクライアントを確実に稼働させないようにすることができます。

于 2013-06-17T14:31:23.793 に答える