ActiveMQ--ActiveMQ对象消息处理

20 篇文章 0 订阅
6 篇文章 1 订阅

对象消息处理

  • 与处理文本消息不一样的地方
 message = session.createObjectMessage(user);
    创建工程(略)
    修改 POM 文件添加 ActiveMQ 坐标

      版本最好与ActiveMQ应用程序的版本一直

    <dependencies>
        <dependency>
            <groupId>org.apache.activemq</groupId>
            <artifactId>activemq-all</artifactId>
            <version>5.15.12</version>
        </dependency>
    </dependencies>
    创建流程

在这里插入图片描述

  • 连接url不要写错 tcp://ip:端口(默认61616)
  • 对象需要实现Serializable接口
  • 使用高版本可能存在一定的问题,需要增加一行代码

((ActiveMQConnectionFactory)factory).setTrustAllPackages(true);

  • 创建连接之后需要start来开启连接
  • 最后需要释放资源

创建消息生产者

public class ActiveMqProducer {

    //发送消息到ActiveMQ中
    public void sendMsgToActiveMQ(User user) {
        //连接工厂
        ConnectionFactory factory = null;
        //连接对象
        Connection connection = null;
        //会话
        Session session = null;
        //目的地
        Destination destination = null;
        //消息生产者
        MessageProducer producer = null;
        //消息对象
        Message message = null;

        try {
            /*** userName:访问 ActiveMQ 服务的用户名。用户 密码。默认的为 admin。用户名可以通过 jetty-ream.properties 文件进行修改
             * password:访问 ActiveMQ 服务的用户名。用户 密码。默认的为 admin。用户名可以通过 jetty-ream.properties 文件进行修改
             * brokerURL:访问 ActiveMQ 服务的路径地址。 路径结构为:协议名://主机地址:端口号 */
            factory = new ActiveMQConnectionFactory("admin", "admin", "tcp://192.168.1.123:61616");

			((ActiveMQConnectionFactory)factory).setTrustAllPackages(true);

            //创建连接对象
            connection = factory.createConnection();
            //启动连接
            connection.start();
            /**
             * transacted:是否使用事务 可选值为:true|false
                 *true:使用事务 当设置此变量值。Session.SESSION_TRANSACTED
                 *false:不适用事务,设置此变量 则 acknowledgeMode 参数必须设置
             * acknowledgeMode:
                 * Session.AUTO_ACKNOWLEDGE:自动消息确认机制
                 * Session.CLIENT_ACKNOWLEDGE:客户端确认机制
                 * Session.DUPS_OK_ACKNOWLEDGE:有副本的客户端确认消息机制
             */
            session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
            //创建目的地,目的地名称即队列的名称。消息的 消费者需要通过此名称访问对应的队列
            destination = session.createQueue("object-destination");
            //创建消息的生产者
            producer = session.createProducer(destination);
            //创建消息
            message = session.createObjectMessage(user);
            //发送消息
            producer.send(message);
        } catch (JMSException e) {
            e.printStackTrace();
        } finally {
            //释放资源
            if (producer != null) {
                try {
                    producer.close();
                } catch (JMSException e) {
                    e.printStackTrace();
                }
            }

            if (session != null) {
                try {
                    session.close();
                } catch (JMSException e) {
                    e.printStackTrace();
                }
            }

            if (connection != null) {
                try {
                    connection.close();
                } catch (JMSException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
   4 测试发送对象消息到ActiveMQ

在这里插入图片描述


创建消息消费者

  • 使用高版本可能存在一定的问题,需要增加一行代码

((ActiveMQConnectionFactory)factory).setTrustAllPackages(true);

  • 连接url不要写错 tcp://ip:端口(默认61616)
  • 创建连接之后需要start来开启连接
  • 最后需要释放资源
public class ActiveMqConsumer {

    //发送消息到ActiveMQ中
    public void receiveMsgToActiveMQ() {
        //连接工厂
        ConnectionFactory factory = null;
        //连接对象
        Connection connection = null;
        //会话
        Session session = null;
        //目的地
        Destination destination = null;
        //消息生产者
        MessageConsumer consumer = null;
        //消息对象
        Message message = null;

        try {
            /*** userName:访问 ActiveMQ 服务的用户名。用户 密码。默认的为 admin。用户名可以通过 jetty-ream.properties 文件进行修改
             * password:访问 ActiveMQ 服务的用户名。用户 密码。默认的为 admin。用户名可以通过 jetty-ream.properties 文件进行修改
             * brokerURL:访问 ActiveMQ 服务的路径地址。 路径结构为:协议名://主机地址:端口号 */
            factory = new ActiveMQConnectionFactory("admin", "admin", "tcp://192.168.1.123:61616");
        
            ((ActiveMQConnectionFactory)factory).setTrustAllPackages(true);
            
            //创建连接对象
            connection = factory.createConnection();
            //启动连接
            connection.start();
            /**
             * transacted:是否使用事务 可选值为:true|false
                 *true:使用事务 当设置此变量值。Session.SESSION_TRANSACTED
                 *false:不适用事务,设置此变量 则 acknowledgeMode 参数必须设置
             * acknowledgeMode:
                 * Session.AUTO_ACKNOWLEDGE:自动消息确认机制
                 * Session.CLIENT_ACKNOWLEDGE:客户端确认机制
                 * Session.DUPS_OK_ACKNOWLEDGE:有副本的客户端确认消息机制
             */
            session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
            //创建目的地,目的地名称即队列的名称。消息的 消费者需要通过此名称访问对应的队列
            destination = session.createQueue("object-destination");
            //创建消息的消费者
            consumer = session.createConsumer(destination);
            //接收消息
            message = consumer.receive();
            ObjectMessage objectMessage = (ObjectMessage) message;
            User u = (User) objectMessage.getObject();
            System.out.println(u);
        } catch (JMSException e) {
            e.printStackTrace();
        } finally {
            //释放资源
            if (consumer != null) {
                try {
                    consumer.close();
                } catch (JMSException e) {
                    e.printStackTrace();
                }
            }

            if (session != null) {
                try {
                    session.close();
                } catch (JMSException e) {
                    e.printStackTrace();
                }
            }

            if (connection != null) {
                try {
                    connection.close();
                } catch (JMSException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
   4 测试从ActiveMQ消费

      消息被消费了
在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值