ActiveMQ 消息传递
1、配置文件
首先,我们应该找到我们安装的 ActiveMQ 的位置,找到 :
然后,对 activemq 目录下的 bin/env 配置文件进行配置,可以将下列系统属性添加到 ACTIVEMQ_OPTS 变量中,保存退出即可。
-Dorg.apache.activemq.SERIALIZABLE_PACKAGES=*
1
2、客户端使用
在客户端,您需要具有相同的机制,因为恶意代码可以在ObjectMessage.getObject()调用时反序列化,从而危及应用程序的环境。您可以在代理上使用相同的配置机制,并使用系统属性配置受信任的类,由于配置单体类比较繁琐,在这里我就使用一种简单的方式如下:
在消息消费时,将 setTrustAllPackages() 允许用户关闭安全检查,并相信所有类。
ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:61616");
factory.setTrustAllPackages(true);
1
2
注意: 如若不关闭安全检查,运行消息消费者时则出现如下异常:
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 +
                '}';
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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();
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
启动后,我们可以在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();
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
启动后,我们可以在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(http://www.my516.com);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
启动,我们会看到消息队列中,有一个消息消费者在线:
后台获取消息信息如下:
此次 ActiveMQ 的消息传递介绍到此,如有疑问的朋友请留言,谢谢!
--------------------- 
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号