订阅/发布模式:
PUB/SUB方式的工作流程,首先subscriber(订阅者)向JMS容器订阅(Listen to)自己感兴趣的topic(主题),多个订阅者可以同时对一个主题进行订阅,消息发布者发布一条消息,所有订阅了该主题的订阅者都能收到这个消息。默认情况下,pub/sub方式下的消息不是持久的,这意味着,消息一经发出,不管有没有人接收,都不会保存下来,而且订阅者只能接收到自已订阅之后发布者发出的消息。这种方式有点像订阅报刊杂志,一种报刊可以有多人同时订阅,但订阅者只能收到开始订阅之后的报社发行的期刊。
与点到点模型不同,发布/订阅模型中,消息生产者产生一个消息后,把这个消息发送到一个Topic中,这个Topic可以同时有多个接收者在监听,当一个消息到达这个Topic之后,所有消息接收者都会收到这个消息。
public class Test4 {
public static void main(String[] args) throws JMSException {
//建立与消息服务器的连接:
ConnectionFactory factory = new ActiveMQConnectionFactory("vm://localhost");
Connection connection = factory.createConnection();
connection.start();
//创建一个Topic:
Topic topic = new ActiveMQTopic("testTopic");
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//创建第一个消费者
MessageConsumer consumer1 = session.createConsumer(topic);
consumer1.setMessageListener( new MessageListener(){
@Override
public void onMessage(Message topic) {
TextMessage text = (TextMessage) topic;
try {
System.out.println( "第一个消费者接受消息: " + text.getText() );
} catch (JMSException e) {
e.printStackTrace();
}
}
});
//创建第二个消费者
MessageConsumer consumer2 = session.createConsumer(topic);
consumer2.setMessageListener( new MessageListener(){
@Override
public void onMessage(Message topic) {
TextMessage text = (TextMessage) topic;
try {
System.out.println( "第二个消费者接受消息: " + text.getText()+ "\n" );
} catch (JMSException e) {
e.printStackTrace();
}
}
});
//创建一个生产者:
MessageProducer producer = session.createProducer(topic);
for( int i=0;i<5;i++){
Message message = session.createTextMessage( " 我是第 " + i+ " 条消息。");
producer.send(message);
}
}
}
运行结果:
第一个消费者接受消息: 我是第 0 条消息。
第二个消费者接受消息: 我是第 0 条消息。
第一个消费者接受消息: 我是第 1 条消息。
第二个消费者接受消息: 我是第 1 条消息。
第一个消费者接受消息: 我是第 2 条消息。
第二个消费者接受消息: 我是第 2 条消息。
第一个消费者接受消息: 我是第 3 条消息。
第二个消费者接受消息: 我是第 3 条消息。
第一个消费者接受消息: 我是第 4 条消息。
第二个消费者接受消息: 我是第 4 条消息。