与Queue不同的是,Topic实现的是发布/订阅模型,在下面的例子中,启动2个消费者共同监听一个Topic,然后循环给这个Topic中发送多个消息。
- importjavax.jms.Connection;
- importjavax.jms.JMSException;
- importjavax.jms.Message;
- importjavax.jms.MessageConsumer;
- importjavax.jms.MessageListener;
- importjavax.jms.MessageProducer;
- importjavax.jms.Session;
- importjavax.jms.TextMessage;
- importjavax.jms.Topic;
- importorg.apache.activemq.ActiveMQConnectionFactory;
- importorg.apache.activemq.command.ActiveMQTopic;
- publicclassTopicTest{
- publicstaticvoidmain(String[]args)throwsException{
- ActiveMQConnectionFactoryfactory=newActiveMQConnectionFactory("vm://localhost");
- Connectionconnection=factory.createConnection();
- connection.start();
- //创建一个Topic
- Topictopic=newActiveMQTopic("testTopic");
- Sessionsession=connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
- //注册消费者1
- MessageConsumercomsumer1=session.createConsumer(topic);
- comsumer1.setMessageListener(newMessageListener(){
- publicvoidonMessage(Messagem){
- try{
- System.out.println("Consumer1get"+((TextMessage)m).getText());
- }catch(JMSExceptione){
- e.printStackTrace();
- }
- }
- });
- //注册消费者2
- MessageConsumercomsumer2=session.createConsumer(topic);
- comsumer2.setMessageListener(newMessageListener(){
- publicvoidonMessage(Messagem){
- try{
- System.out.println("Consumer2get"+((TextMessage)m).getText());
- }catch(JMSExceptione){
- e.printStackTrace();
- }
- }
- });
- //创建一个生产者,然后发送多个消息。
- MessageProducerproducer=session.createProducer(topic);
- for(inti=0;i<10;i++){
- producer.send(session.createTextMessage("Message:"+i));
- }
- }
- }
运行后得到下面的输出结果:
- Consumer1getMessage:0
- Consumer2getMessage:0
- Consumer1getMessage:1
- Consumer2getMessage:1
- Consumer1getMessage:2
- Consumer2getMessage:2
- Consumer1getMessage:3
- Consumer2getMessage:3
- Consumer1getMessage:4
- Consumer2getMessage:4
- Consumer1getMessage:5
- Consumer2getMessage:5
- Consumer1getMessage:6
- Consumer2getMessage:6
- Consumer1getMessage:7
- Consumer2getMessage:7
- Consumer1getMessage:8
- Consumer2getMessage:8
- Consumer1getMessage:9
- Consumer2getMessage:9
说明每一个消息都会被所有的消费者消费。