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 的消息传递介绍到此,如有疑问的朋友请留言,谢谢!
---------------------