【Java.JMS】点对点通信——Queue

来源:互联网 发布:网络安全技术方案 编辑:程序博客网 时间:2024/05/16 07:16

单点传输——消息的对应的数据通道是队列Queue,消息生产者QueueSender和消息消费者QueueReceiver

javax.jms public interface QueueSender extends MessageProducerpublic interface QueueReceiver extends MessageConsumer


和Queue相关的接口还有:

javax.jmspublic interface QueueConnectionFactory extends ConnectionFactorypublic interface QueueConnection extends Connectionpublic interface QueueSession extends Session

( Session和Connection在使用之后需要关闭。

在消息接收前需要打开Connection,connection.start(); )


点对点通信的模型如下:



点对点JMS应用程序的编程模型如下:



实例:

我们通过Active MQ Admin Portlet手动去Send消息到Queue中,在代码中创建两个Consumer去异步接收这个消息。

消费者代码如下:

package com.gof.jms.test;import javax.jms.Connection;import javax.jms.ConnectionFactory;import javax.jms.DeliveryMode;import javax.jms.Destination;import javax.jms.JMSException;import javax.jms.Message;import javax.jms.MessageConsumer;import javax.jms.MessageListener;import javax.jms.MessageProducer;import javax.jms.Session;import javax.jms.TextMessage;import org.apache.activemq.ActiveMQConnectionFactory;public class QueueMessageApp {public static final String user = "system";public static final String password = "manager";public static final String url = "tcp://localhost:61616";public static final String queueName = "test_queue";public static final boolean transacted = false;public static final boolean persistent = false;    public static void main(String[] args){    Connection connection = null;    Session session = null;        try{    // create the connection        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(user, password, url);            connection = connectionFactory.createConnection();            connection.start();                        // create the session            session = connection.createSession(transacted, Session.AUTO_ACKNOWLEDGE);            Destination destination = session.createQueue(queueName);                        // In this example, we will send the message through activemq admin portlet manually.                        // create the consumer1             MessageConsumer consumer1 = session.createConsumer(destination);            consumer1.setMessageListener(new MessageListener() {public void onMessage(Message message) {// TODO Auto-generated method stubTextMessage recvMessage = (TextMessage)message;try{System.out.println("Receive message by the 1st Consumer: " + recvMessage.getText());}catch (JMSException e){e.printStackTrace();}}});                        // create the consumer2             MessageConsumer consumer2 = session.createConsumer(destination);            consumer2.setMessageListener(new MessageListener() {public void onMessage(Message message) {// TODO Auto-generated method stubTextMessage recvMessage = (TextMessage)message;try{System.out.println("Receive message by the 2nd Consumer: " + recvMessage.getText());}catch (JMSException e){e.printStackTrace();}}});                        // To avoid the connection closed before the message listener received the message.            Thread.sleep(5000000);                }catch (Exception e){    e.printStackTrace();    }finally{    try{    // close session and connection        if (session != null){        session.close();        }        if (connection != null){        connection.close();        }    }catch (Exception e){    e.printStackTrace();    }    }    }}


首先启动Active MQ,再启动上面的消费者程序。

在Active MQ Admin Porlet中手动发送Queue消息到目标Queue,



可以得到如下的程序输出:



可以看出每个消息直只被消费了一次,如果有多个消费者同时监听一个Queue的话,无法确定一个消息最终会被哪一个消费者消费




1 0
原创粉丝点击