ActiveMQ 消息传递

  根据上文的 ActiveMQ 的简介以及 Linux 系统中的安装,下面,我们来看 ActiveMQ 的消息的传递。

前提

  在介绍 ActiveMQ 之前,我先介绍一下 ActiveMQ 不同版本对于处理对象消息的不同。

ObjectMessage对象依赖于marshal / unmarshal对象有效负载的Java序列化。由于恶意有效负载可以利用主机系统,因此通常认为此过程不安全。这就是从版本5.12.2和 5.13.0开始的原因,ActiveMQ强制用户明确将可以使用ObjectMessages交换的包列入白名单。
由于老版本不用考虑是否安全问题,所以,在这里小编就使用的最新版本来介绍:

1、配置文件

  首先,我们应该找到我们安装的 ActiveMQ 的位置,找到 :
在这里插入图片描述
然后,对 activemq 目录下的 bin/env 配置文件进行配置,可以将下列系统属性添加到 ACTIVEMQ_OPTS 变量中,保存退出即可。

-Dorg.apache.activemq.SERIALIZABLE_PACKAGES=*

在这里插入图片描述

2、客户端使用

  在客户端,您需要具有相同的机制,因为恶意代码可以在ObjectMessage.getObject()调用时反序列化,从而危及应用程序的环境。您可以在代理上使用相同的配置机制,并使用系统属性配置受信任的类,由于配置单体类比较繁琐,在这里我就使用一种简单的方式如下:

在消息消费时,将 setTrustAllPackages() 允许用户关闭安全检查,并相信所有类。

ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:61616");
factory.setTrustAllPackages(true);

注意: 如若不关闭安全检查,运行消息消费者时则出现如下异常:
在这里插入图片描述

ActiveMQ 处理对象消息

1、定义消息的载体对象
public class User implements Serializable {
    private static final long serialVersionUID = -4362634196033542053L;

    private Integer userId;
    private String name;
    private Double price;
    //此处省略 get 和 set 方法,以及有参无参构造器
    @Override
    public String toString() {
        return "User{" +
                "userId=" + userId +
                ", name='" + name + '\'' +
                ", price=" + price +
                '}';
    }
}
2、定义消息生产者
public class UserProducer {

	//创建 activemq 的连接账号
    private static String userName = "admin";
    //创建 activemq 的连接密码
    private static String password = "admin";
    // activemq 基于 tcp 协议的链接地址 端口默认为 61616
    private static String brokerURL = "tcp://192.168.111.161:61616";

    public static void main(String[] args) throws Exception {
        //1、创建 ActiveMQConnectionFactory 对象
        ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory(userName, password, brokerURL);
        //2、通过 ActiveMQConnectionFactory 对象获取 Connection 对象
        Connection connection = factory.createConnection();
        //3、创建连接
        connection.start();
        //4、创建 session 对象
        /**
         * 创建会话对象
         *      方法 -- connection.createSession(boolean transacted, int acknowledgeMode);
         *  transacted  --  是否使用事务;
         *      可选值为 true | false
         *          true  -  使用事务,当设置此变量值,则 acknowledgeMode 参数无效,
         *                  建议传递的 acknowledgeMode 参数值为 Session.SESSION_TRANSACTED
         *          false  -  不适用事务,设置此变量值,则 acknowledgeMode 参数必须设置。
         *  acknowledgeMode  -  消息确认机制,可选值为:
         *      Session.AUTO_ACKNOWLEDGE  -  自动确认消息机制
         *      Session.CLIENT_ACKNOWLEDGE  -  客户端确认消息机制
         *      Session.DUPS_OK_ACKNOWLEDGE  -  有副本的客户端确认消息机制
         *
         */
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

        //5、获取 destination 对象(目的地)
        Destination destination = session.createQueue("user--MQ");

        //6、创建MessageProducer 对象
        MessageProducer producer = session.createProducer(destination);
        //7、创建Message 对象
        Message message = session.createObjectMessage(new User(111, "zmf", 99999D));
        //8、发送消息
        producer.send(message);

        //9、关闭资源
        producer.close();
        session.close();
        connection.close();
    }
}

启动后,我们可以在http://ip:8161/admin/queues.jsp中看到:
在这里插入图片描述

3、定义消息消费者
public class UserConsumer {

    private static String userName = "admin";
    private static String password = "admin";
    private static String brokerURL = "tcp://192.168.111.161:61616";

    public static void main(String[] args) throws Exception {
        //1、创建 ActiveMQConnectionFactory 对象
        ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory(userName, password, brokerURL);
        //允许用户关闭安全检查,并相信所有类。
        factory.setTrustAllPackages(true);
        //2、通过 ActiveMQConnectionFactory 对象获取 Connection 对象
        Connection connection = factory.createConnection();
        //3、创建连接
        connection.start();
        //4、创建 session 对象
        /**
         * 创建会话对象
         *      方法 -- connection.createSession(boolean transacted, int acknowledgeMode);
         *  transacted  --  是否使用事务;
         *      可选值为 true | false
         *          true  -  使用事务,当设置此变量值,则 acknowledgeMode 参数无效,
         *                  建议传递的 acknowledgeMode 参数值为 Session.SESSION_TRANSACTED
         *          false  -  不适用事务,设置此变量值,则 acknowledgeMode 参数必须设置。
         *  acknowledgeMode  -  消息确认机制,可选值为:
         *      Session.AUTO_ACKNOWLEDGE  -  自动确认消息机制
         *      Session.CLIENT_ACKNOWLEDGE  -  客户端确认消息机制
         *      Session.DUPS_OK_ACKNOWLEDGE  -  有副本的客户端确认消息机制
         *
         */
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        //5、获取 destination 对象(目的地)
        Destination destination = session.createQueue("user--MQ");
        //6、创建 MessageConsumer 对象
        MessageConsumer consumer = session.createConsumer(destination);
        //7、获取 消息队列里的消息
        ActiveMQObjectMessage message = (ActiveMQObjectMessage) consumer.receive();
        System.out.println("获取的信息: " + message.getObject());
        //8、关闭资源
        consumer.close();
        session.close();
        connection.close();
    }
}

启动后,我们可以在http://ip:8161/admin/queues.jsp中看到:
在这里插入图片描述
后台打印如下:
在这里插入图片描述

实现队列服务监听

  我们要实现队列服务监听,消息生产者,没有任何改变,我们只需要改变消息消费者的代码如下:

消息消费者
public class UserConsumer {

    //创建 activemq 的连接账号
    private static String userName = "admin";
    //创建 activemq 的连接密码
    private static String password = "admin";
    // activemq 基于 tcp 协议的链接地址 端口默认为 61616
    private static String brokerURL = "tcp://192.168.111.161:61616";

    public static void main(String[] args) throws Exception {
        //1、创建 ActiveMQConnectionFactory 对象
        ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory(userName,password,brokerURL);
        //允许用户关闭安全检查,并相信所有类。
        factory.setTrustAllPackages(true);
        //2、通过 ActiveMQConnectionFactory 对象获取 Connection 对象
        Connection connection = factory.createConnection();
        //3、创建连接
        connection.start();
        //4、创建 session 对象
        /**
         * 创建会话对象
         *      方法 -- connection.createSession(boolean transacted, int acknowledgeMode);
         *  transacted  --  是否使用事务;
         *      可选值为 true | false
         *          true  -  使用事务,当设置此变量值,则 acknowledgeMode 参数无效,
         *                  建议传递的 acknowledgeMode 参数值为 Session.SESSION_TRANSACTED
         *          false  -  不适用事务,设置此变量值,则 acknowledgeMode 参数必须设置。
         *  acknowledgeMode  -  消息确认机制,可选值为:
         *      Session.AUTO_ACKNOWLEDGE  -  自动确认消息机制
         *      Session.CLIENT_ACKNOWLEDGE  -  客户端确认消息机制
         *      Session.DUPS_OK_ACKNOWLEDGE  -  有副本的客户端确认消息机制
         *
         */
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        //5、获取 destination 对象(目的地)
        Destination destination = session.createQueue("user--MQ");
        //6、创建 MessageConsumer 对象
        MessageConsumer consumer = session.createConsumer(destination);

        //7、设置Message监听器,并获取消息队列里的消息
        consumer.setMessageListener(new MessageListener() {
            public void onMessage(Message message) {
                try {
                    if (message instanceof TextMessage) {
                        System.out.println("获取的信息:" + ((TextMessage) message).getText());
                    } else if (message instanceof ObjectMessage) {
                        System.out.println("获取的信息:" + ((ObjectMessage) message).getObject());
                    }
                } catch (JMSException e) {
                    e.printStackTrace();
                }
            }
        });
        System.out.println("消费者启动。。。。");
        Thread.sleep(Long.MAX_VALUE);
        //8、关闭资源
        consumer.close();
        session.close();
        connection.close();
    }
}

启动,我们会看到消息队列中,有一个消息消费者在线:
在这里插入图片描述
后台获取消息信息如下:
在这里插入图片描述
此次 ActiveMQ 的消息传递介绍到此,如有疑问的朋友请留言,谢谢!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值