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