2015-12-12 52 views
0

我嘗試使用來自多個客戶端的消息並對他們作出響應,以便我收到消息,但是當第一個客戶端發送消息時,他沒有得到任何響應,其他客戶端也不能發送任何消息消息。就像我的消費者階層被鎖定一樣。任何想法爲什麼?消息使用者在第一條消息後被阻止

public class Consumer implements MessageListener { 
    private static ConnectionFactory factory = null; 
    private static Connection connection = null; 
    private static Session session = null; 
    private static Destination sendQueue = null; 
    private static Destination recieveQueue = null; 
    private static MessageConsumer consumer = null; 
    private static MessageProducer producer = null; 

    final static Logger logger = Logger.getLogger(Consumer.class); 

    public static void main(String[] args) { 

     try { 
      factory = new ActiveMQConnectionFactory("tcp://localhost:61616"); 
      connection = factory.createConnection(); 
      connection.start(); 
      session = connection.createSession(false, 
        Session.AUTO_ACKNOWLEDGE); 
      recieveQueue = session.createQueue("BookingQueue"); 
      consumer = session.createConsumer(recieveQueue); 
     // JMSMessageListener listener = new JMSMessageListener(); 
     // consumer.setMessageListener(listener); 

     } catch (Exception e) { 
      System.out.println(e); 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    public void onMessage(Message message) { 
     if (message instanceof ObjectMessage) { 
      ObjectMessage msg = (ObjectMessage)message; 
      Booking booking; 
      try { 
       booking = (Booking) msg.getObject(); 
       logger.info("Received order for " + booking.getCustomer()); 
       sendQueue = message.getJMSReplyTo(); 
       producer = session.createProducer(sendQueue); 
       logger.info("# The Agent sending hello"); 
       TextMessage messageNew = session.createTextMessage("Hello, please reply immediately to my message!"); 
       messageNew.setJMSReplyTo(recieveQueue); 

       producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT); 
       producer.send(messageNew); 
       consumer.close(); 
       session.close(); 
       connection.close(); 
      } catch (Exception e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

    } 

    } 


} 

回答

1

您未註冊MessageListenerSession。您可以通過創建一個無限循環來解決此問題,該循環使用MessageConsumer輪詢Queue,使用新的MessageProducer發送確認。像下面這樣:

public class Consumer implements Runnable { 
    private final Connection connection; 
    private final MessageConsumer consumer; 
    private final Session producerSession; 
    private volatile boolean closed = false; 

    public Consumer(Connection connection) { 
     this.connection = connection; 
     Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); 
     Destination receiveQueue = session.createQueue("BookingQueue"); 
     consumer = session.createConsumer(receiveQueue); 
     producerSession = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); 
    } 

    public void close() { 
     closed = true; 
     connection.close(); 
    } 

    @Override 
    public void run() { 
     while(!closed) { 
      Message message = consumer.receive(); 
      Destination sendQueue = message.getJMSReplyTo(); 
      MessageProducer producer = producerSession.createProducer(sendQueue); 
      // send message via producer 
      producer.close(); 
     } 
    } 
} 

MessageListener已被替換調用consumer.receive()

相關問題