消息总是从生产者发送到中间件再有中间件发送给消费者。
对于broker而言,消息的持久化的机制则用来处理消息在目的地阶段的安全隐患。
如果Producer选择不使用持久化,则消息缓存在内存中,虽然可以获得高吞吐率,但是一旦JMS Provider宕掉,就会导致消息的丢失。非持久化具有高吞吐量和低可靠性的特点。
如果Producer选择持久化,则JMS Provider会将消息存到物理媒介上(文件、数据库),Consumer获取消息,也是从物理媒介读取,吞吐量受到影响,但是即使JMS Provider宕掉,消息也不会丢失。持久化具有低吞吐量和高可靠性的特点。
针对持久化,JMS Provider可以提供多种持久化方案,比如持久化到本地文件、不同的数据库等,不过这些不是Producer需要关心的,Producer只需要告诉JMS Provider要不要持久化消息就好了。
持久化方案的选择,在%ActiveMQ_HOME%\conf\activemq.xml文件,<persistenceAdapter />元素下配置。
持久化设置:
javax.jms.MessageProducer:
setDeliveryMode(int):void
- 设置此producer实例的默认递送模式
send(Message message):void
- 以默认的deliveryMode发送消息
send(Message message, int deliveryMode, int priority, long timeToLive):void
- 以指定的deliveryMode发送消息
javax.jms.DeliveryMode
static int NON_PERSISTENT
非持久化模式
static int PERSISTENT
持久化模式
JMS规范定义了2种消息传输模式:持久传送模式和非持久传输模式。发送者可以通过如下类似的代码进行设置
TopicPublisher publihser = session.createPublisher(topic);
// 设置持久化传输
publihser.setDeliveryMode(DeliveryMode.PERSISTENT);
这种方式对publisher发送的所有消息都有效,相当于是一个全局的效果。如果只是想设置某一个消息的传输模式,可以通过以下代码设置消息头的属性来实现
TextMessage message = session.createTextMessage(text);
message.setJMSDeliveryMode(DeliveryMode.PERSISTENT);