有时消息生产者希望消费者回复一个消息,JMSReplyTo为一个Destination,表示需要回复的目的地。当然消费者可以不理会它。
public class Test6 {
public static void main(String[] args) throws JMSException {
//建立与消息服务器的连接:
ConnectionFactory factory = new ActiveMQConnectionFactory("vm://localhost");
Connection connection = factory.createConnection();
connection.start();
// 将生产者生产的消息发送到这个队列:
Queue queue = new ActiveMQQueue( "testQueue");
//将消费者回复的消息发送存储到这个队列:
Queue replyQueue = new ActiveMQQueue("replyQueue");
//创建一个会话:
final Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Message message = session.createTextMessage( "我是生产者产生的消息。" );
message.setJMSReplyTo(replyQueue);
//创建一个生产者:
MessageProducer producer = session.createProducer(queue);
producer.send( message );
System.out.println( "生产者生产的消息已成功发送到服务器。");
//创建一个消费者:
MessageConsumer consumer1 = session.createConsumer(queue);
consumer1.setMessageListener( new MessageListener(){
@Override
public void onMessage(Message message) {
TextMessage text = (TextMessage) message;
try {
System.out.println( "消费者接收消息为: " + text.getText() + "\n" );
System.out.println( "接下来消费者将回复一条消息,于是再创建个生产者,但消息发送到回复队列"+ "\n" );
MessageProducer producer = session.createProducer(message.getJMSReplyTo() );
producer.send( session.createTextMessage("消息已接收."));
} catch (JMSException e) {
e.printStackTrace();
}
}
});
//再创建一个消费者,用来消费回复队列中的消息
MessageConsumer consumer2 = session.createConsumer(replyQueue);
consumer2.setMessageListener( new MessageListener(){
@Override
public void onMessage(Message message) {
TextMessage text = (TextMessage) message;
try {
System.out.println( "原始生产者确认回复 : "+ text.getText() + "\n" );
} catch (JMSException e) {
e.printStackTrace();
}
}
});
}
}
结果:
生产者生产的消息已成功发送到服务器。
消费者接收消息为: 我是生产者产生的消息。
接下来消费者将回复一条消息,于是再创建个生产者,但消息发送到回复队列
原始生产者确认回复 : 消息已接收.