我正在学习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概念。
答案 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启动时(这次是消费者)可以保留并使其可用
在第二种情况下,模式并不持久。所以一旦节目结束,消息就会消失。