消息使用者在第一条消息后被阻止

时间:2015-12-12 14:18:03

标签: java jms activemq

我尝试使用来自多个客户端的消息并回复我收到的消息,但是当第一个客户端发送消息时,他没有得到任何响应,其他任何客户端都无法发送任何消息。就像我的消费者类被锁定一样。有什么想法吗?

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 个答案:

答案 0 :(得分:1)

您没有使用MessageListener注册Session。您可以通过创建无限循环来解决此问题,该循环使用Queue轮询MessageConsumer,使用新的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()

的调用
相关问题