发送方如何知道消息已被MQ JMS API使用?

发送方如何知道消息已被MQ JMS API使用?,jms,mq,Jms,Mq,我正在处理一个独立的mqjms应用程序,我们的应用程序需要“意识到”客户机已经使用了放在队列上的消息生成器。因为客户端应用程序不由我们负责。因此,我们不能让他们写类似于“msg.acknowledge();”的东西(在我的情况下,msg.acknowledge()不是正确的方法)。我在stackoverflow中搜索历史答案。发现以下内容与我想要的完全相同: 我的问题是,有没有其他方法可以将其归档到MQ API或JMS API中?我需要做的编码只在味精生产方面,它可以是队列或主题 另一个问题

我正在处理一个独立的mqjms应用程序,我们的应用程序需要“意识到”客户机已经使用了放在队列上的消息生成器。因为客户端应用程序不由我们负责。因此,我们不能让他们写类似于“msg.acknowledge();”的东西(在我的情况下,msg.acknowledge()不是正确的方法)。我在stackoverflow中搜索历史答案。发现以下内容与我想要的完全相同:

我的问题是,有没有其他方法可以将其归档到MQ API或JMS API中?我需要做的编码只在味精生产方面,它可以是队列或主题

另一个问题是JMS中的确认模式CLIENT_acknowledge,这是否会产生不相关的结果?我一直认为,这种模式可以在调用send()方法时阻止应用程序,直到客户端使用消息并调用msg.acknowledge(),但似乎不是这样。消息传递后,产品将退出应用程序,消息将存储在队列中,直到客户端调用acknowledge()。是否可以让producer应用程序挂起,直到客户端确认消息


如果我的概念不对,请纠正我,谢谢。

消息队列的主要目的是将生产者和消费者解耦。生产者不需要等待消息被消费者消费,它可以继续它的工作。理想情况下,如果生产者需要知道消息是否已由使用者处理,它应该等待使用者在另一个队列上发送响应消息

消息确认与生产者无关。消息确认是消费者告知消息传递提供者在消息传递到应用程序后从队列中删除消息的方式

JMS提供程序(如MQ JMS)在将消息传递给应用程序后,会自动通知消息传递提供程序从队列中删除消息。然后是客户端确认,在接收到消息后,应用程序显式地告诉消息传递提供程序从队列中删除消息


生产商是否有理由等待消费者收到信息?有一种方法虽然不优雅,但可以是:一旦消息发送,使用发送消息的消息id并尝试浏览该消息。如果找不到邮件,您可以假设邮件已被使用

谢谢沙石,您的回复非常有用。我们需要知道消费者从我们这边得到消息并记录时间戳。所以我们需要知道消费者已经得到了信息。如何使用主题来存档此文件?这有什么不同吗?我知道主题可以同步传递消息。如果我使用持久订阅,这能满足我的要求吗?顺便问一下,正如您提到的,我们可以检查队列中的消息ID,以确保消息是否已经被客户端使用,这就是所谓的JMS浏览吗?我不太熟悉JMS技术的细节,只是想确定一个方向,然后我可以研究它。再次感谢。@Shashi,如果是MQ(IBM),客户端是否必须发送回一个确认它已读取消息?如果没有,那么自动确认信息何时发送回q经理?是在调用onMessage之后吗?如果使用自动确认模式,应用程序不必发送任何确认。这是由JMS客户机完成的。我认为JMS客户机会在onMessage方法返回后确认消息。@Shashi如果onMessage中出现异常并且线程死亡,消息还会在队列中吗?我面临着一个类似的问题,onMessage中有一个异常,线程由于未处理的异常而死亡。我可以在日志中清楚地看到消息是从队列中读取的,但是如果线程死亡,消息不会从队列中删除。你知道这是不是一次预期的行为吗?