Java JMS和MDB仅限setRollback

Java JMS和MDB仅限setRollback,java,glassfish,jms,message-driven-bean,Java,Glassfish,Jms,Message Driven Bean,我有一个java类,它使用队列中的消息,向一些URL发送HTTP调用。我在google和stackoverflow上做了一些搜索(如果我错过了任何关于这个问题的消息来源,我真的很抱歉),但是找不到任何关于setRollbackOnly调用的详细信息 我的问题是。。。在我回滚的情况下,从队列中使用的消息将阻塞队列的其余部分,并将循环,直到成功处理为止,或者将在当前队列的末尾重新查询 下面是我用于从队列消费和发送HTTP调用的代码,整个应用程序都在Glassfish服务器上运行: public cl

我有一个java类,它使用队列中的消息,向一些URL发送HTTP调用。我在google和stackoverflow上做了一些搜索(如果我错过了任何关于这个问题的消息来源,我真的很抱歉),但是找不到任何关于setRollbackOnly调用的详细信息

我的问题是。。。在我回滚的情况下,从队列中使用的消息将阻塞队列的其余部分,并将循环,直到成功处理为止,或者将在当前队列的末尾重新查询

下面是我用于从队列消费和发送HTTP调用的代码,整个应用程序都在Glassfish服务器上运行:

public class RequestSenderBean implements MessageListener { @Resource private MessageDrivenContext mdbContext; public RequestSenderBean(){} public void onMessage(final Message message) { try { if(message instanceof ObjectMessage) { String responseOfCall=sendHttpPost(URL, PARAMS_FROM_MESSAGE); if(responseOfCall.startsWith("Success")) { //Everything is OK, do some stuff } else if(responseOfCall.startsWith("Failure")) { //Failure, do some other stuff } } catch(final Exception e) { e.printStackTrace(); mdbContext.setRollbackOnly(); } } } 公共类RequestSenderBean实现MessageListener { @资源 private MessageDrivenContext mdbContext; 公共请求SenderBean(){} 公共消息无效(最终消息) { 尝试 { if(ObjectMessage的消息实例) { String responseOfCall=sendHttpPost(URL,来自消息的参数); if(responseOfCall.startsWith(“成功”)) { //一切都好,做点什么吧 } else if(responseOfCall.startsWith(“失败”)) { //失败,做一些其他的事情 } } 捕获(最终异常e) { e、 printStackTrace(); mdbContext.setRollbackOnly(); } } }
这是基本的JMS/消息传递知识

队列实现“负载平衡”场景,即消息命中队列并被请求由一个使用者处理。增加使用者的数量会增加该队列处理的潜在吞吐量。队列上的每条消息将由一个且仅由一个使用者处理

主题提供发布-订阅语义:主题的所有使用者都将收到推送到主题的消息

考虑到这一点,一旦消息被释放并(以事务方式)传递给使用者,如果它是异步的(MDB就是这种情况),它决不会阻塞队列的其余部分

作为:

消息消耗量

消息传递产品本质上是异步的:消息的产生和使用之间没有基本的时间依赖关系。但是,JMS规范在更精确的意义上使用了这个术语。消息可以通过以下两种方式之一使用:

同步:订阅者或接收者通过调用receive方法显式地从目的地获取消息。receive方法可以阻止消息到达,或者如果消息未在指定的时间限制内到达,则可以超时

异步:客户端可以向使用者注册消息侦听器。消息侦听器类似于事件侦听器。每当消息到达目标时,JMS提供程序通过调用侦听器的onMessage方法来传递消息,该方法对消息的内容起作用。

因为您使用了一个定义为异步的
MessageListener
,所以您没有阻塞队列或其后续处理

此外,还提供了以下信息:

使用会话bean生成和同步接收消息

生成消息或同步接收消息的应用程序可以使用会话bean来执行这些操作

由于阻塞同步接收会占用服务器资源,因此在企业bean中使用此类接收调用不是一种良好的编程实践。相反,请使用定时同步接收,或使用消息驱动bean异步接收消息。有关阻塞和定时同步接收的详细信息,请参阅编写客户端以获取同步接收示例

至于消息失败,这取决于队列的配置方式。您可以设置错误队列(对于Glassfish或Weblogic等容器),将失败消息推送到该队列以供以后检查。在您的情况下,您使用的是
setRollbackOnly

7.1.2编码消息驱动Bean:MessageBean.java

消息驱动bean类MessageBean.java实现 方法setMessageDrivenContext、ejbCreate、onMessage和ejbRemove。 onMessage方法与TextListener.java的方法几乎相同, 将传入消息强制转换为文本消息并显示文本 唯一显著的区别是它调用 MessageDrivenContext.setRollbackOnly方法,以防出现异常。 此方法回滚事务,以便将消息 重新交付

我建议您阅读JavaEE教程以及这本书,其中详细介绍了消息传递概念,这也是产品/技术不可知的