JMS持久交付模式

时间:2013-12-01 08:36:53

标签: jms persistent

我正在学习JMS并遇到了这样的陈述:http://docs.oracle.com/javaee/1.3/jms/tutorial/1_3_1-fcs/doc/advanced.html#1023387

  

PERSISTENT传送模式(默认值)指示JMS提供程序   要特别注意确保邮件在传输过程中不会丢失   JMS提供程序失败的情况。使用此传递模式发送的消息   发送时会记录到稳定存储空间。

如果JMS Provider出现故障,那么JMS Provider如何确保消息不会丢失?

这是什么意思:

  

“使用此传送模式发送的邮件在发送时会记录到稳定存储中。”

请帮助我理解JMS概念。

2 个答案:

答案 0 :(得分:4)

这意味着当消息传递提供程序由于任何原因而关闭并再次出现时,具有PERSISTENT传递模式的消息不会丢失。消息传递提供程序将具有PERSISTENT传递模式的消息保存到磁盘,当消息提供重新启动时,将从磁盘读取消息并将其带入内存。

希望这很清楚。

答案 1 :(得分:0)

您可以进行简单的测试来理解这个概念。请参阅教程here,了解如何创建生产者和消费者。

您会看到producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT); 将其更改为producer.setDeliveryMode(DeliveryMode.PERSISTENT);

现在创建两个类。一个只调用生产者而一个只调用消费者。

public class AppOnlyProduce { public static void thread(Runnable runnable, boolean daemon) { Thread brokerThread = new Thread(runnable); brokerThread.setDaemon(daemon); brokerThread.start(); } public static void main(String[] args) throws InterruptedException { thread(new HelloWorldProducer(), false); thread(new HelloWorldProducer(), false); } }

public class AppOnlyConsumer { public static void thread(Runnable runnable, boolean daemon) { Thread brokerThread = new Thread(runnable); brokerThread.setDaemon(daemon); brokerThread.start(); } public static void main(String[] args) throws InterruptedException { thread(new HelloWorldConsumer(), false); thread(new HelloWorldConsumer(), false); } } 首先运行AppOnlyProduce。它将创建两条消息。现在运行AppOnlyConsumer它将读取两条消息。 现在将该行更改为producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);

再次运行AppOnlyProduce。它将创建两条消息。现在运行AppOnlyConsumer您将看到它等待消息的某个时间并且他们说Received: null

在第一种情况下,模式是持久的。因此,尽管Java程序结束了消息,但是在JMS启动时(这次是消费者)可以保留并使其可用

在第二种情况下,模式并不持久。所以一旦节目结束,消息就会消失。