1

我必须将现有的 JMS Receiver 程序更新为如下。

现有功能:

  • 一旦消息作为 xml 接收,我的接收器类将读取一条消息并调用 Web 服务来处理其中一个服务器中的作业。

    新功能:

  • 接收者应该等待一段时间,直到作业服务器有空来处理作业。我尝试使用 MessageSelectors 但它仅适用于消息头。我尝试了此选项“message = (JMSTextMessage) mqQueueReceiver.receive(100000000000000);” 但是每当我发布消息时,这些消息都会在发布到队列后被读取。但我想让接收器等待我通过 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);

而(真){

        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 异常。

timeoutreceive()调用指定的值指示该方法必须等待消息多长时间才能receive返回。指定的超时时间不是为了延迟消息传递。如果有消息,该方法将立即返回。

我认为可以修改您的逻辑以更改执行顺序。仅在您的 Web 服务准备好处理消息时更改代码以接收消息。

于 2012-12-22T16:23:35.233 回答