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

Mule在异常后不回滚JMS消息

南门星河
2023-03-14

我的流使用基于cron表达式的消息,我故意添加了一个groovy代码来抛出异常以测试JMS回滚。回滚不会将消耗的消息返回队列中。我在这里错过了什么吗?

这里是mule流,它应该在遇到异常后回滚mule消息。

<jms:activemq-connector name="jmsConnector" specification="1.1" brokerURL="tcp://localhost:61616" />
<jms:endpoint name="testqueue" queue="test.queue" connector-ref="jmsConnector" />

<flow name="quartzBasedDelivery">
    <quartz:inbound-endpoint jobName="deliveryJob" cronExpression="0 0/1 * * * ?">
        <quartz:endpoint-polling-job>
            <quartz:job-endpoint ref="testqueue" />
        </quartz:endpoint-polling-job>
    </quartz:inbound-endpoint>
    <logger message="QUARTZ found message for delivery #[payload]" level="INFO" />
    <scripting:component>
               <scripting:script engine="groovy">
                    throw new java.lang.RuntimeException();
                </scripting:script>
    </scripting:component>
    <file:outbound-endpoint path="/test/out" outputPattern="message-[function:dateStamp].txt" />
    <logger message="Message deliverd" level="INFO" />
</flow>

<flow name="copyFile">
    <file:inbound-endpoint  path="/test/in"/>
    <byte-array-to-string-transformer /> 
    <logger message="COPYFILE found message for test queue #[payload]" level="INFO" />
    <jms:outbound-endpoint queue="test.queue"/> 
</flow>

这是此流引发的异常-

    Exception stack is:
1. null (java.lang.RuntimeException)
  sun.reflect.NativeConstructorAccessorImpl:-2 (null)
2. java.lang.RuntimeException (javax.script.ScriptException)
  org.codehaus.groovy.jsr223.GroovyScriptEngineImpl:323 (http://java.sun.com/j2ee/sdk_1.3/techdocs/api/javax/script/ScriptException.html)
3. Failed to invoke ScriptComponent{quartzBasedDelivery.component.559022270}. Component that caused exception is: ScriptComponent{quartzBasedDelivery.component.559022270}. Message payload is of type: String (org.mule.component.ComponentException)
  org.mule.component.AbstractComponent:148 (http://www.mulesoft.org/docs/site/current3/apidocs/org/mule/component/ComponentException.html)
********************************************************************************
Root Exception stack trace:
java.lang.RuntimeException
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)

共有1个答案

冉德元
2023-03-14

在您的情况下,JMS消息不会通过回滚异常策略重新传递到原始队列,因为您有一个Quartz入站endpoint,它不是事务性的或可靠的。您可以配置捕获异常策略,并显式重新传递消息。在这些场景中要小心,因为你可以创建一个无限循环。

来源:回滚异常策略

 类似资料:
  • 我们有一个场景,在捕获异常之后,我们使用Mule(我知道是3.4版——旧版)回滚JMS事务。ActiveMQ应该在提交事务之前将消息保留在队列上(以使其持久化),或者在Mule启动回滚后,根据回滚设置重新传递消息。 然而,似乎在回滚之后,消息不会被重新传递,而是位于队列连接上“阻止”进一步的消息。就好像没有收到回滚消息一样。有人知道为什么不退还吗? 从日志中提取:

  • 我正在使用Spring JpaRepository在我的一个应用程序屏幕中实现CRUD。作为其中的一部分,我正在开发一个功能,用户可以保存所有汽车实体或没有(应该回滚)到数据库。我不确定如何使用Spring Boot、Spring Rest和Spring JPA实现此功能。 下面是我的源代码。 除此之外,我还得到了一个类似 请帮帮我。谢谢你。

  • 这很好,但并不总是在代码中抛出运行时异常。因此,我挖掘并发现如下所示的rollbackFor; 现在,我必须更改所有代码,以使用RollBackfor更改@Transactional。但是还有其他方法可以将所有@transaction advice属性更改为rollbackFor=exception.class吗?

  • 问题内容: 我在下面使用HIbernate和Spring和JPA。当引发PersistenceException时,我想捕获它并返回错误消息,以便它不会传播到调用者。 但是我得到一个异常,说我需要在异常之后回滚事务,但是当我捕获到异常并且不想重新抛出该异常时,如何回滚它呢? 问题答案: 似乎没有办法回退由Spring ORM管理的失败事务。问题中显示的代码是服务类。将其持久性例程提取到单独的DAO

  • 我在tomcat服务器中使用具有多个数据源配置的JTA原子事务。有时我会遇到以下异常: JTA事务意外回滚(可能是由于超时);嵌套的异常是javax。交易回滚异常:事务被设置为仅回滚 出现这种异常的原因是什么?