当前位置: 首页 > 知识库问答 >
问题:

Spring JMS侦听器中的事务管理

韦思淼
2023-03-14

我有一个spring JMS侦听器,它正在侦听队列。一旦消息到达输入队列,它就会对消息进行某些处理,并将消息放入多个其他队列进行进一步处理(我们可以将这些其他队列称为输出队列)。在将消息发布到其他输出队列时,如果将消息发布到其中一个输出队列可能会由于任何原因而失败,我希望确保在失败之前完成的其他发布回滚到输出队列。基本上我想确保它是原子操作。在侦听器/容器上是否有任何注释/配置可用于在单个事务中实现这一点。?

这是我正在使用的配置

<jms:listener-container acknowledge="transacted" cache="session" connection-factory="jmsSecurityFactory" concurrency="1" container-type="default" container-class="abc.xyz">
<jms:listener id="listenerId" destination="inputQueue" ref="" />
</jms:listener-container>
<beans:bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<beans:property name="sessionTransacted" value="true"></beans:property>
<beans:property name="connectionFactory" ref="inCachingConnectionFactory"></beans:property>
</beans:bean>
<beans:bean id="inCachingConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
    <beans:property name="targetConnectionFactory" ref="jmsSecurityFactory" />
</beans:bean>
<beans:bean id="jmsSecurityFactory"
    class="org.springframework.jms.connection.UserCredentialsConnectionFactoryAdapter">
    <beans:property name="targetConnectionFactory" ref="jmsConnectionFactory" />
    <beans:property name="username" value=" " />
    <beans:property name="password" value=" " />
</beans:bean>
<beans:bean id="jmsConnectionFactory" class="com.ibm.mq.jms.MQQueueConnectionFactory">
    <beans:property name="hostName" value="${mq.conn.hostName}" />
    <beans:property name="port" value="${mq.conn.hostPort}" />
    <beans:property name="queueManager" value="${mq.conn.queueManager}" />
    <beans:property name="channel" value="${mq.conn.channel}" />
    <beans:property name="transportType" value="${mq.conn.transportType}" />
    <beans:property name="useConnectionPooling" value="true"></beans:property>
</beans:bean>

看起来JMS模板和侦听器容器都引用同一个连接工厂bean(jmsConnectionFactory)

共有1个答案

方安怡
2023-03-14

在侦听器容器上设置确认="事务处理";同一线程上的任何下游操作,使用JmsTemboard(配置有相同的连接工厂)将使用容器的会话,任何失败都将导致所有JMS操作回滚。会话将由容器在成功时提交。

 类似资料:
  • 我有一个Spring Boot应用程序作为Spring JMS侦听器。我配置了多个数据源管理器一个用于Oracle,另一个用于DB2。 每当我启动应用程序时,jms侦听器容器都在寻找一个事务管理器bean,并在找到两个bean时给出以下错误。 我不想维护JMS事务。我如何实现它,或者我们如何禁用jms事务特性? 下面是我在我的主Spring Boot类上添加的注释。我也在使用Spring Data

  • 问题内容: 我使用的是Hibernate事件监听器,喜欢在插入,删除和更新期间执行一些操作。现在,我想使用JPA侦听器执行此操作,因为如果我想从Hibernate迁移到任何其他JPA提供程序,则我的侦听器应该可以工作。Hibernate侦听器为我提供了从中获取事务并检查其提交还是回滚的功能。JPA侦听器仅向我提供实体对象。现在如何在JPA侦听器中获取事务或会话或实体管理器?提前致谢!!我正在使用J

  • 我使用Hibernate事件监听器(如)在插入、删除和更新过程中执行一些操作。现在我想使用JPA listener来完成这一工作,因为如果我想从Hibernate转移到任何其他JPA提供程序,我的listener应该可以工作。Hibernate listener给我,我可以从中获取事务并检查它是提交的还是回滚的。JPA侦听器只为我提供实体对象。现在我如何在JPA侦听器中获得事务或会话或实体管理器?

  • 我在我的一个工作流应用程序中使用了Camunda BPMN2.0。在我的一个服务任务中,我在start事件中创建了一个执行侦听器,在create事件中创建了一个任务侦听器。我不确定在开始时同时分配这些是否合适。如果是正确的,它们中的哪一个将首先执行--执行监听器或任务监听器,分别在start或create事件中执行?

  • 要运行Kafka,需要在文件。有两种设置我不理解。 有人可以解释侦听器和广告侦听器属性之间的区别吗? 留档说: 侦听器:套接字服务器侦听的地址。 和 advertised.listeners:主机名和端口代理将向生产者和消费者做广告。 我什么时候必须使用哪个设置?

  • 我的代码使用jQuery。我有一个密码输入框,我想要得到输入的密码任何时候。 下面是我的代码: 我确信这是一个正确的代码,因为当我在浏览器的控制台中输入它时,它可以工作,但当我重新加载页面时,它就不工作了 我能做什么?