JMS持久交付模式

JMS持久交付模式,jms,persistent,Jms,Persistent,我正在学习JMS,遇到了以下声明: 默认情况下,持久传递模式指示JMS提供程序 要格外小心,以确保邮件在传输过程中不会丢失 JMS提供程序失败的情况。使用此传递模式发送的邮件 发送时记录到稳定存储器 如果JMS提供程序发生故障,那么JMS提供程序如何确保消息不会丢失 这意味着什么: “使用此传递模式发送的邮件在发送时会记录到稳定存储器中。” 请帮助我理解这里的JMS概念。这意味着当消息传递提供程序因任何原因停机并再次出现时,具有持久传递模式的消息不会丢失。消息传递提供程序使用持久传递模式将消息保

我正在学习JMS,遇到了以下声明:

默认情况下,持久传递模式指示JMS提供程序 要格外小心,以确保邮件在传输过程中不会丢失 JMS提供程序失败的情况。使用此传递模式发送的邮件 发送时记录到稳定存储器

如果JMS提供程序发生故障,那么JMS提供程序如何确保消息不会丢失

这意味着什么:

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


请帮助我理解这里的JMS概念。

这意味着当消息传递提供程序因任何原因停机并再次出现时,具有持久传递模式的消息不会丢失。消息传递提供程序使用持久传递模式将消息保存到磁盘,当消息提供重新启动时,将从磁盘读取消息并将其带到内存中


希望这一点是明确的。

这意味着,当消息提供程序因任何原因停机并再次出现时,具有持久传递模式的消息不会丢失。消息传递提供程序使用持久传递模式将消息保存到磁盘,当消息提供重新启动时,将从磁盘读取消息并将其带到内存中


希望这是清楚的。

你可以做一个简单的测试来理解这个概念。请参阅有关如何创建生产者和消费者的教程

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

现在创建两个类。只呼叫生产者和消费者的人

public class AppOnlyProduce{
公共静态无效线程(可运行、可运行、布尔守护进程){
Thread brokerThread=新线程(可运行);
brokerThread.setDaemon(守护进程);
brokerThread.start();
}
公共静态void main(字符串[]args)引发InterruptedException{
线程(新HelloWorldProducer(),false);
线程(新HelloWorldProducer(),false);
}
}

公共类AppOnlyConsumer{
公共静态无效线程(可运行、可运行、布尔守护进程){
Thread brokerThread=新线程(可运行);
brokerThread.setDaemon(守护进程);
brokerThread.start();
}
公共静态void main(字符串[]args)引发InterruptedException{
线程(新HelloWorldConsumer(),false);
线程(新HelloWorldConsumer(),false);
}
}
首轮约生产。它将创建两条消息。现在运行AppOnlyConsumer,它将读取两条消息。 现在将行更改回
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT)

再次运行AppOnlyProduce。它将创建两条消息。现在运行AppOnlyConsumer,您将看到它等待消息,他们说
Received:null

在第一种情况下,模式是持久的。所以,尽管Java程序结束消息在JMS启动时被持久化并可用(这一次是由使用者提供的)


在第二种情况下,模式不是持久的。所以程序一结束消息就消失了

你可以做一个简单的测试来理解这个概念。请参阅有关如何创建生产者和消费者的教程

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

现在创建两个类。只呼叫生产者和消费者的人

public class AppOnlyProduce{
公共静态无效线程(可运行、可运行、布尔守护进程){
Thread brokerThread=新线程(可运行);
brokerThread.setDaemon(守护进程);
brokerThread.start();
}
公共静态void main(字符串[]args)引发InterruptedException{
线程(新HelloWorldProducer(),false);
线程(新HelloWorldProducer(),false);
}
}

公共类AppOnlyConsumer{
公共静态无效线程(可运行、可运行、布尔守护进程){
Thread brokerThread=新线程(可运行);
brokerThread.setDaemon(守护进程);
brokerThread.start();
}
公共静态void main(字符串[]args)引发InterruptedException{
线程(新HelloWorldConsumer(),false);
线程(新HelloWorldConsumer(),false);
}
}
首轮约生产。它将创建两条消息。现在运行AppOnlyConsumer,它将读取两条消息。 现在将行更改回
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT)

再次运行AppOnlyProduce。它将创建两条消息。现在运行AppOnlyConsumer,您将看到它等待消息,他们说
Received:null

在第一种情况下,模式是持久的。所以,尽管Java程序结束消息在JMS启动时被持久化并可用(这一次是由使用者提供的)


在第二种情况下,模式不是持久的。所以程序一结束消息就消失了

因此,我对持久模式的理解是-->我向ApacheQ发送一条消息。在它因为某种原因被发送到任何消息处理器之前,ApacheQ会停止运行。我重新启动服务器,然后先前发送的消息仍在队列中可用。我说的对吗?我想你是指作为消费者的消息处理器,是的,你的理解是正确的,所以我对持久模式的理解是-->我向ApacheQ发送消息。在它因为某种原因被发送到任何消息处理器之前,ApacheQ会停止运行。我重新启动服务器,然后先前发送的消息仍在队列中可用。我说的对吗?我想你指的是作为消费者的信息处理者,是的,你的理解是正确的