前一段时间公司的产品中使用了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);