对象消息处理
- 与处理文本消息不一样的地方
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消费
消息被消费了