尝试从服务器获取消息但接收呼叫被阻止

时间:2016-11-10 19:13:56

标签: spring jms spring-jms

//这是从我向服务器发送消息的发送消息,其工作正常

public void sendMessage(com.google.protobuf.Message sendmessage){

try {
  createJmsTemplate();
  createJmsTemplateReciever();
  JmsMessageCreator jmsMessageCreator = new JmsMessageCreator() {
    @Override
    public Message createMessage(Session session) throws JMSException {
      BytesMessage msg = session.createBytesMessage();
      msg.writeBytes(sendmessage.toByteArray());
      return msg;
    }
  };

  MessageCreator messageCreator = new MessageCreator() {
    public Message createMessage(Session session) throws JMSException {
      Message msg = jmsMessageCreator.createMessage(session);
      msg.setJMSCorrelationID("2708");
      return msg;
    }
  };

  jmsTemplate.send(messageCreator);
  System.out.println("Message sent... ");

} catch (Exception e) {
  e.printStackTrace();
  System.exit(0);
}

}

//但是当我调用此方法时,在接听电话时会被阻止...

public void recieveMessage(){     试试{

  byteMessage = (BytesMessage) jmsTemplateReciever.receive();
  try {
    if (byteMessage != null) {
      byte[] byteArr = new byte[(int) byteMessage.getBodyLength()];
      for (int i = 0; i < (int) byteMessage.getBodyLength(); i++) {
        byteArr[i] = byteMessage.readByte();
        String s = new String(byteArr);
        System.out.println(s);
      }
      String s = new String(byteArr);
      System.out.println(s);

      byteMessage.acknowledge();
    }

  } catch (JMSException e) {

  }

} catch (Exception e) {
  e.printStackTrace();
  System.exit(0);
}

} }

1 个答案:

答案 0 :(得分:0)

如JMS 1.1规范第9.2.2节所述,receive()调用无限期地阻塞,直到消息到达队列。因此,您的应用程序中的呼叫会被阻止。

一个选项是指定一个等待时间,例如receive(3000)等待3秒,如果没有消息在3秒内到达则出现。 JMS实现者可能会提供另一种形式的receive方法,如果队列中没有消息,该方法会立即返回。

另一种选择是使用消息监听器来异步接收消息,如JMS 1.1规范第9.3.1节所述。每当消息到达队列时,JMS提供程序都会通知您的应用程序。