前一段时间公司的产品中使用了ActiveMQ作为消息通知的工具,也简要记录了一些概念,整理后与大家分享一下(部分内容摘自网络,详见参考资料一栏)。
1.StreamMessage :消息体是 Java 流,写入和读出都是顺序的.
2.MapMessage :消息体包含 key-value 对, key 为 String , value 为基本类型,可以通过迭代器访问.
3.TextMessage :消息体是 String.
4.ObjectMessage :消息体是可序列化的 Java 对象.
分为两种:
DeliveryMode.PERSISTENT :保证消息仅传一次, JMS Provider 服务停止后消息不会丢失;
DeliveryMode.NON_PERSISTENT :消息最多传一次,消息会因 JMS Provider 停止后丢失;
同 JMSDestination 一样,在发送前设置的会被忽略.
在 JMS Provider 重启后, NON_PERSISTENT 消息丢失了,而 PERSISTENT 消息能正常被消费者消费。
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 创建目的地
Destination destination = session.createQueue("JMS.DEMO");
Destination destination2 = session.createQueue("JMS.DEMO3");
// 创建生产者
MessageProducer publisher = session.createProducer(destination);
// 设置传输模式
publisher.setDeliveryMode(DeliveryMode.PERSISTENT);
// 创建消息
TextMessage message = session.createTextMessage("Test Message");
message.setJMSReplyTo(destination2);
// 发送消息
publisher.send(message);
public void onMessage(Message message) {
try {
System.out.println("Receive message: " + message);
if (message.getJMSReplyTo() != null) {
session.createProducer(message.getJMSReplyTo()).send(session.createTextMessage("This is a reply to"
+ message.getJMSReplyTo()));
}
} catch (Exception e) {
e.printStackTrace();
}
}
消息的过期时间,其值为当前时间加上存活时间(毫秒);当存活时间设置为 0 时,该字段的值也被设置为 0 ,表示永不过期;消费端在一般情况下都不会接收到过期的消息,但 JMS Provider 并不保证这一点;
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 创建目的地
Destination destination = session.createQueue("JMS.DEMO");
// 创建生产者
MessageProducer publisher = session.createProducer(destination);
// 设置传输模式
publisher.setDeliveryMode(DeliveryMode.PERSISTENT);
// 创建消息
TextMessage message = session.createTextMessage("Test Message");
// 发送消息
publisher.setTimeToLive(5000);
publisher.send(message);