1

既存の JMS レシーバー プログラムを次のように更新する必要があります。

既存の機能:

  • 私のレシーバー クラスはメッセージを読み取り、Web サービスを呼び出して、メッセージが xml として受信されるとサーバーの 1 つでジョブを処理します。

    新機能:

  • 受信側は、ジョブ サーバーが自由にジョブを処理できるようになるまでしばらく待機する必要があります。MessageSelectors を使用してみましたが、これはメッセージ ヘッダーにのみ適用されます。しかし、メッセージを投稿するたびに、それらのメッセージはキューに投稿された後に読み取られます。しかし、Webサービス呼び出しを通じてジョブサーバーから取得している一定の間隔を受信者に待機させたいと考えています。

私のコードは以下です:

        connectionFactory = new MQQueueConnectionFactory();
        connectionFactory.setHostName(config.getValue("host"));
        connectionFactory.setPort(Integer.parseInt(config.getValue("port")));
        connectionFactory.setTransportType(JMSC.MQJMS_TP_CLIENT_MQ_TCPIP);
        connectionFactory.setQueueManager(config.getValue("manager"));
        connectionFactory.setChannel(config.getValue("channel"));
        queueConnection =  (MQQueueConnection) connectionFactory.createQueueConnection();
                    queueSession = (MQQueueSession) queueConnection.createQueueSession(true, Session.CLIENT_ACKNOWLEDGE);
        queue = (MQQueue) queueSession.createQueue(config.getValue("queue"));
        mqQueueReceiver = (MQQueueReceiver) queueSession.createReceiver(queue);

while(真) {

        if(this.stopListener) {
            System.out.println("stopListener variable is changed ");
            break;
        }

        try {
        
            message = (JMSTextMessage) mqQueueReceiver.receive(1000);
        
            String response = "";
        
            if(this.nullCheckJMSTextObject(message)) {
            
                response= soapClient.invokeWebService(message.getText(),message.getJMSCorrelationID());

                                if(this.nullCheckSoapResponse(response)) {

                    queueSession.commit();
                    
                } else {
                                                
                    queueSession.rollback();
                    queueSession.commit();
                     Thread.sleep(receiverWaitTime);
                }
            }   

        } catch (JMSException e) {
        System.err.println("Linked Exception");
        e.getLinkedException();
        System.err.println("Error Code");
        e.getErrorCode();
        System.err.println("Cause ");
        e.getCause();
        System.err.println("fillTrackTrace ");
        e.fillInStackTrace();
            e.printStackTrace();
        break;
        }catch(IllegalStateException e) {
            e.printStackTrace();    
        break;
        }catch(InterruptedException e) {
            e.printStackTrace();
        break;
    }catch(Exception e) {
        e.printStackTrace();
        break;

        }
    }
4

1 に答える 1

2

このreceive(timeout)メソッドは、メッセージがキューに到着するまで、指定されたタイムアウト期間待機します。タイムアウト前にメッセージがキューに到着した場合、メソッドはすぐにメッセージを返します。それ以外の場合、メソッドはタイムアウト期間まで待機し、メッセージなしで戻ります。2033 例外が表示されます。

呼び出しtimeoutに指定された は、メソッドが戻る前にメッセージを待機する必要がある時間を示します。指定されたタイムアウトは、メッセージ配信を遅らせるためのものではありません。メッセージがある場合、メソッドはすぐに戻ります。receive()receive

実行順序を変更するためにロジックを変更できると思います。Web サービスがメッセージを処理する準備ができている場合にのみメッセージを受信するようにコードを変更します。

于 2012-12-22T16:23:35.233 に答える