Queue实现的是点到点模型,在下面的例子中,启动2个消费者共同监听一个Queue,然后循环给这个Queue中发送多个消息,我们依然采用ActiveMQ。
- importjavax.jms.Connection;
- importjavax.jms.DeliveryMode;
- importjavax.jms.JMSException;
- importjavax.jms.Message;
- importjavax.jms.MessageConsumer;
- importjavax.jms.MessageListener;
- importjavax.jms.MessageProducer;
- importjavax.jms.Queue;
- importjavax.jms.Session;
- importjavax.jms.TextMessage;
- importorg.apache.activemq.ActiveMQConnectionFactory;
- importorg.apache.activemq.command.ActiveMQQueue;
- publicclassQueueTest{
- publicstaticvoidmain(String[]args)throwsException{
- ActiveMQConnectionFactoryfactory=newActiveMQConnectionFactory("vm://localhost");
- Connectionconnection=factory.createConnection();
- connection.start();
- //创建一个Queue
- Queuequeue=newActiveMQQueue("testQueue");
- //创建一个Session
- Sessionsession=connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
- //注册消费者1
- MessageConsumercomsumer1=session.createConsumer(queue);
- comsumer1.setMessageListener(newMessageListener(){
- publicvoidonMessage(Messagem){
- try{
- System.out.println("Consumer1get"+((TextMessage)m).getText());
- }catch(JMSExceptione){
- e.printStackTrace();
- }
- }
- });
- //注册消费者2
- MessageConsumercomsumer2=session.createConsumer(queue);
- comsumer2.setMessageListener(newMessageListener(){
- publicvoidonMessage(Messagem){
- try{
- System.out.println("Consumer2get"+((TextMessage)m).getText());
- }catch(JMSExceptione){
- e.printStackTrace();
- }
- }
- });
- //创建一个生产者,然后发送多个消息。
- MessageProducerproducer=session.createProducer(queue);
- for(inti=0;i<10;i++){
- producer.send(session.createTextMessage("Message:"+i));
- }
- }
- }
运行这个例子会得到下面的输出结果:
- Consumer1getMessage:0
- Consumer2getMessage:1
- Consumer1getMessage:2
- Consumer2getMessage:3
- Consumer1getMessage:4
- Consumer2getMessage:5
- Consumer1getMessage:6
- Consumer2getMessage:7
- Consumer1getMessage:8
- Consumer2getMessage:9
可以看出每个消息直被消费了一次,但是如果有多个消费者同时监听一个Queue的话,无法确定一个消息最终会被哪一个消费者消费。