5

私は現在、永続的なサブスクリプション用のメッセンジャーサービスをプログラミングしています(耐久性がなくなる可能性がありますが、まだ議論中です)。何らかの理由でサーバーが一時的にダウンし、必要なシナリオを処理する方法についての提案を探していました。トピックを自動的に再購読します。接続方法のサンプルコードは次のとおりです。

public void DurableChatter(String broker, String username, String password)
{
    javax.jms.MessageProducer publisher = null;
    javax.jms.MessageConsumer subscriber = null;
    javax.jms.Topic topic = null;

    //Create a connection:
    try{
        javax.jms.ConnectionFactory factory;
        factory = (new progress.message.jclient.ConnectionFactory (broker));
        connection = factory.createConnection (username, password);

        //Durable Subscriptions are indexed by username, clientID and subscription name
        //It is a good proactice to set the clientID:
        connection.setClientID(CLIENT_ID);
        pubSession = connection.createSession(false,javax.jms.Session.AUTO_ACKNOWLEDGE);
        subSession = connection.createSession(false,javax.jms.Session.AUTO_ACKNOWLEDGE);
    }
    catch (javax.jms.JMSException jmse){
        System.err.println ("Error: Cannot connect to Broker - " + broker);
        jmse.printStackTrace();
        System.exit(1);
    }

    //Create Publisher and Durable Subscriber:
    try{

        topic = pubSession.createTopic(APP_TOPIC);
        subscriber = subSession.createDurableSubscriber(topic, "SampleSubscription");
        subscriber.setMessageListener(this);
        publisher = pubSession.createProducer(topic);
        connection.start();
    }
    catch (javax.jms.JMSException jmse){
        System.out.println("Error: connection not started.");
        jmse.printStackTrace();
        System.exit(1);
    }

    //Wait for user input

    try
    {
        System.out.println("Enter text to send as message and press enter.");
        java.io.BufferedReader stdin =
            new java.io.BufferedReader(new java.io.InputStreamReader(System.in));
        while (true)
        {
            String s = stdin.readLine();

            if(s == null){
                exit();
            }
            else if (s.length()>0)
            {
                try
                {
                    javax.jms.TextMessage msg = pubSession.createTextMessage();
                    msg.setText(username + ": " + s);
                    //Publish the message persistantly:
                    publisher.send(
                        msg,                               //message
                        javax.jms.DeliveryMode.PERSISTENT, //publish persistantly
                        javax.jms.Message.DEFAULT_PRIORITY,//priority
                        MESSAGE_LIFESPAN);                 //Time to Live
                }
                catch (javax.jms.JMSException jmse){
                    System.err.println("Error publishing message:" + jmse.getMessage());
                }
            }
        }
    }
    catch (java.io.IOException ioe)
    {
        ioe.printStackTrace();
    }
}
4

2 に答える 2

3

クライアントを作成する必要がありますimplement javax.jmsExceptionListener

これにより、接続が失われたときにクライアントがすぐに JMS API からコールバックを受信できるようになります。これは、アプリケーションが現時点で何も公開しようとしていない場合でも同様です。

を作成しConnection、接続して起動したら、 を呼び出しますconnection.setExceptionListener(myListener)Connectionの Javadoc も参照してください。

于 2016-10-20T12:03:06.050 に答える
0

障害検出をどれくらい速くする必要がありますか?すべてのクライアントに少なくとも1分に1回メッセージが送信されるようにプロトコルを設定します(通信プロトコルに新しい「fluff」キープアライブメッセージを追加する必要があります)-キープアライブメッセージを受信しないクライアントは、安全にサーバーがダウンし、再接続を開始します。

理想的には、この種のことは、JMSではなくUDPブロードキャストで行うのが最適です(オーバーヘッド用)が、オプションとしてUDPブロードキャストがある場合は、jgroupsを使用してクラスター検出/フェイルオーバー/再結合を行うと思います。

于 2012-07-20T17:08:47.453 に答える