我有一个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(); } } }
这是基本的JMS/消息传递知识。
队列实现了“负载平衡”场景,即消息到达队列并被分配给一个使用者处理。增加使用者的数量会增加队列处理的潜在吞吐量。队列中的每条消息将由一个且仅一个使用者处理。
主题提供发布-订阅语义:主题的所有使用者都将接收推送到主题的消息。
消息消耗
消息传递产品本质上是异步的:消息的产生和使用之间没有基本的时序依赖关系。但是,JMS规范在更精确的意义上使用了这个术语。可以通过以下两种方式使用消息:
同步:订阅者或接收者通过调用receive方法显式地从目标获取消息。receive方法可以阻塞直到消息到达,或者如果消息没有在指定的时间限制内到达,则可以超时。
使用会话bean生成和同步接收消息
生成消息或同步接收消息的应用程序可以使用会话bean来执行这些操作。在一个应用程序中使用JMS API和会话Bean的示例使用一个无状态会话Bean将消息发布到一个主题。
因为阻塞的同步接收会占用服务器资源,所以在企业bean中使用这样的接收调用不是一个好的编程实践。相反,使用定时同步接收,或者使用消息驱动的bean异步接收消息。有关阻塞和定时同步接收的详细信息,请参见编写同步接收示例的客户端。
消息驱动的bean类MessageBean.java实现了方法setMessageDrivenContext、ejbCreate、onMessage和EJBRemove。onMessage方法几乎与TextListener.java的方法相同,它将传入消息强制转换为TextMessage并显示文本。唯一显著的区别是,它在发生异常时调用MessageDrivenContext.SetRollBackOnly方法。此方法回滚事务,以便重新传递消息。
我建议您阅读Java EE教程以及Enterprise Integration Patterns book,这本书详细介绍了消息传递概念,这也是与产品/技术无关的。
根据使用JMS 1.1的官方文档,ActiveMQ 5.15是否可以与JMS 2.0配合使用。将ActiveMQ 5.15与JMS 2.0配合使用有何意义。如果ActiveMQ 5.15 JMS 2.0不是一种可行的方法,那么Artemis是一个很好的替代品吗?Artemis是否足够稳定,可以用于生产级企业应用程序?
我有一个Spring JMS应用程序,它有一个JMS侦听器,在应用程序启动时连接到活动的MQ队列。这个JMS侦听器是an应用程序的一部分,该应用程序接收消息,用内容丰富消息,然后将消息传递给同一个ActiveMQ代理上的主题。 SessionTransact设置为true。我没有执行任何数据库事务,所以我没有@Transactional设置。从我所读到的内容来看,SessionTransact属性
我在JBoss7 JMS集群上运行Spring webapp时遇到了一个问题。 exampleListener.java如下所示: 当我启动live服务器时,消息由ExampleListener处理--这是可以的。当我启动备份服务器时,我得到了错误javax.naming.NameNotFoundException beacause在JNDI下没有公开--这时只有主服务器在工作,它不是集群。当li
否定确认的行为是将接收消息的可见性超时更改为0。其中,在为JMS创建SQS工厂时,NACK_TIMEOUT的值是不可配置的。 https://github.com/awslabs/amazon-sqs-java-messaging-lib/blob/master/src/main/java/com/amazon/sqs/javamessaging/acknowledge/NegativeAckno
RabbitMQ使用AMQP协议(而是实现AMQP协议) Java客户端需要使用AMQP协议客户端库来连接/使用RabbitMQ JMS API在这里的作用是什么?JMS API应使用AMQP客户端库连接到RabbitMQ? 通常我们使用JMS来连接RabbitMQ、ActiveMQ等消息代理。那么这里使用的默认协议是什么,而不是AMQP? 上面的一些可能是哑巴。:-)但我想把头缠在上面。