ActiveMQ入门

来源:互联网 发布:mac ps返回 编辑:程序博客网 时间:2024/06/18 12:29

前面我们已经搭建和配置好了ActiveMQ,下面来看一个Demo,体验一下MQ。

JMS 消息模型

  JMS消息服务应用程序结构支持两种模型:点对点模型,发布者/订阅者模型。  

  (1)点对点模型(Queue)

    一个生产者向一个特定的队列发布消息,一个消费者从这个队列中依次读取消息。

    模型特点:只有一个消费者获得消息。

  (2)发布者/订阅者模型(Topic)

    0个或多个订阅者可以接受特定主题的消息。

    模型特点:多个消费者可获得消息。

    Topic和Queue的最大区别在于Topic是以广播的形式,通知所有在线监听的客户端有新的消息,没有监听的客户端将收不到消息;而Queue则是以点对点的形式通知多个处于监听状态的客户端中的一个。

JMS消息格式

  • MapMessage -- key-value键值对
  • TextMessage -- 字符串对象
  • ObjcetMessage -- 一个序列化的Java对象
  • ByteMessage -- 一个未解释字节的数据流
  • StreamMessage -- Java原始值的数据流

点对点模型Demo

复制代码
public class Constants {    public static final String MQ_NAME = "parry";        public static final String MQ_PASSWORD = "parry123";        public static final String MQ_BROKETURL = "tcp://192.168.56.129:61616";}
复制代码
复制代码
import javax.jms.Connection;import javax.jms.ConnectionFactory;import javax.jms.Destination;import javax.jms.JMSException;import javax.jms.MessageProducer;import javax.jms.Session;import javax.jms.TextMessage;import org.apache.activemq.ActiveMQConnectionFactory;import com.parry.demo.constant.Constants;/** *  * <p> * MSProduct 点对点模型-消息生产者 * <p> */public class MSProduct {    public static void main(String[] args) {        // 连接工厂        ConnectionFactory factory;        // 连接实例        Connection connection = null;        // 收发的线程实例        Session session;        // 消息发送目标地址        Destination destination;        // 消息创建者        MessageProducer messageProducer;        try {            factory = new ActiveMQConnectionFactory(Constants.MQ_NAME, Constants.MQ_PASSWORD,                    Constants.MQ_BROKETURL);            // 获取连接实例            connection = factory.createConnection();            // 启动连接            connection.start();            // 创建接收或发送的线程实例(创建session的时候定义是否要启用事务,且事务类型是Auto_ACKNOWLEDGE也就是消费者成功在Listern中获得消息返回时,会话自动确定用户收到消息)            session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);            // 创建队列(返回一个消息目的地)            destination = session.createQueue("parryQuene");            // 创建消息生产者            messageProducer = session.createProducer(destination);            // 创建TextMessage消息实体            TextMessage message = session.createTextMessage("我是parry,这是我的第一个消息!");            messageProducer.send(message);            session.commit();        } catch (JMSException e) {            e.printStackTrace();        } finally {            if (connection != null) {                try {                    connection.close();                } catch (JMSException e) {                    e.printStackTrace();                }            }        }    }}
复制代码
复制代码
import javax.jms.Connection;import javax.jms.ConnectionFactory;import javax.jms.Destination;import javax.jms.JMSException;import javax.jms.MessageConsumer;import javax.jms.Session;import org.apache.activemq.ActiveMQConnectionFactory;import com.parry.demo.constant.Constants;/** * <p> * MQConsumer 点对点--消息消费者 * <p> */public class MQConsumer {    public static void main(String[] args) {        // 连接工厂        ConnectionFactory connectionFactory;        // 连接实例        Connection connection = null;        // 收发的线程实例        Session session;        // 消息发送目标地址        Destination destination;        try {            // 实例化连接工厂            connectionFactory = new ActiveMQConnectionFactory(Constants.MQ_NAME, Constants.MQ_PASSWORD, Constants.MQ_BROKETURL);            // 获取连接实例            connection = connectionFactory.createConnection();            // 启动连接            connection.start();            // 创建接收或发送的线程实例(消费者就不需要开启事务了)            session = connection.createSession(Boolean.FALSE,Session.AUTO_ACKNOWLEDGE);            // 创建队列(返回一个消息目的地)            destination = session.createQueue("parryQuene");            // 创建消息消费者            MessageConsumer consumer = session.createConsumer(destination);            //注册消息监听            consumer.setMessageListener(new MQListerner());        } catch (JMSException e) {            e.printStackTrace();        }    }}
复制代码
复制代码
import javax.jms.JMSException;import javax.jms.Message;import javax.jms.MessageListener;import javax.jms.TextMessage;/** * <p> * MQListerner 生产者监听器 * <p> */public class MQListerner implements MessageListener{    @Override    public void onMessage(Message message) {        try {            System.out.println(((TextMessage)message).getText());        } catch (JMSException e) {            e.printStackTrace();        }    }}
复制代码

 发布者/订阅者模型Demo

  (1)发布者

复制代码
import javax.jms.Connection;import javax.jms.ConnectionFactory;import javax.jms.Destination;import javax.jms.JMSException;import javax.jms.MessageProducer;import javax.jms.Session;import javax.jms.TextMessage;import org.apache.activemq.ActiveMQConnectionFactory;import com.parry.demo.constant.Constants;/** * <p> * MQProducer 订阅消息的发送者 * <p> */public class MQProducer {    public static void main(String[] args) {        // 连接工厂        ConnectionFactory factory;        // 连接实例        Connection connection = null;        // 收发的线程实例        Session session;        // 消息发送目标地址        Destination destination;        try {            // 实例化连接工厂            factory = new ActiveMQConnectionFactory(Constants.MQ_NAME, Constants.MQ_PASSWORD, Constants.MQ_BROKETURL);            // 获取连接实例            connection = factory.createConnection();            // 启动连接            connection.start();            // 创建接收或发送的线程实例(创建session的时候定义是否要启用事务,且事务类型是Auto_ACKNOWLEDGE也就是消费者成功在Listern中获得消息返回时,会话自动确定用户收到消息)            session = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);            // 创建队列(返回一个消息目的地)            destination = session.createTopic("parryTopic");            // 创建消息发布者            MessageProducer producer = session.createProducer(destination);            // 创建TextMessage消息            TextMessage message = session.createTextMessage("你好,这是我发布的第一条消息!");            // 发布消息            producer.send(message);        } catch (JMSException e) {            e.printStackTrace();        } finally {            if (connection != null) {                try {                    connection.close();                } catch (JMSException e) {                    e.printStackTrace();                }            }        }    }}
复制代码

  (2)订阅者01

复制代码
import javax.jms.Connection;import javax.jms.ConnectionFactory;import javax.jms.Destination;import javax.jms.JMSException;import javax.jms.MessageConsumer;import javax.jms.Session;import org.apache.activemq.ActiveMQConnectionFactory;import com.parry.demo.constant.Constants;/** * <p> * MQCousumer01 订阅-发布模式 订阅者01 * <p> */public class MQCousumer01 {    public static void main(String[] args) {        // 连接工厂        ConnectionFactory factory;        // 连接实例        Connection connection = null;        // 收发的线程实例        Session session;        // 消息发送目标地址        Destination destination;        try {            // 实例化连接工厂            factory = new ActiveMQConnectionFactory(Constants.MQ_NAME, Constants.MQ_PASSWORD, Constants.MQ_BROKETURL);            // 获取连接实例            connection = factory.createConnection();            // 启动连接            connection.start();            // 创建接收或发送的线程实例            session = connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);            // 创建队列(返回一个消息目的地)            destination = session.createTopic("parryTopic");            // 创建消息订阅者            MessageConsumer consumer = session.createConsumer(destination);            // 消息发布者添加监听器            consumer.setMessageListener(new Listerner01());        } catch (JMSException e) {            e.printStackTrace();        }    }}
复制代码
复制代码
import javax.jms.JMSException;import javax.jms.Message;import javax.jms.MessageListener;import javax.jms.TextMessage;/** * <p> * Listerner01 订阅者01的监听器 * <p> */public class Listerner01 implements MessageListener{    @Override    public void onMessage(Message message) {        try {            System.out.println("订阅者01接收到消息:" + ((TextMessage)message).getText());        } catch (JMSException e) {            e.printStackTrace();        }    }}
复制代码

  (3)订阅者02

复制代码
import javax.jms.Connection;import javax.jms.ConnectionFactory;import javax.jms.Destination;import javax.jms.JMSException;import javax.jms.MessageConsumer;import javax.jms.Session;import org.apache.activemq.ActiveMQConnectionFactory;import com.parry.demo.constant.Constants;/** * <p> * MQCousumer02 订阅-发布模式 订阅者02 * <p> */public class MQCousumer02 {    public static void main(String[] args) {        // 连接工厂        ConnectionFactory factory;        // 连接实例        Connection connection = null;        // 收发的线程实例        Session session;        // 消息发送目标地址        Destination destination;        try {            // 实例化连接工厂            factory = new ActiveMQConnectionFactory(Constants.MQ_NAME, Constants.MQ_PASSWORD, Constants.MQ_BROKETURL);            // 获取连接实例            connection = factory.createConnection();            // 启动连接            connection.start();            // 创建接收或发送的线程实例            session = connection.createSession(Boolean.FALSE, Session.AUTO_ACKNOWLEDGE);            // 创建队列(返回一个消息目的地)            destination = session.createTopic("parryTopic");            // 创建消息订阅者            MessageConsumer consumer = session.createConsumer(destination);            // 消息发布者添加监听器            consumer.setMessageListener(new Listerner02());        } catch (JMSException e) {            e.printStackTrace();        }    }}
复制代码
复制代码
import javax.jms.JMSException;import javax.jms.Message;import javax.jms.MessageListener;import javax.jms.TextMessage;/** * <p> * Listerner02 订阅者02的监听器 * <p> */public class Listerner02 implements MessageListener{    @Override    public void onMessage(Message message) {        try {            System.out.println("订阅者02接收到消息:"+((TextMessage)message).getText());        } catch (JMSException e) {            e.printStackTrace();        }    }}
原创粉丝点击