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

在Apache Camel中使用事务跨直接路由共享JMS deadLetterChannel

云星波
2023-03-14

我有一个Camel路由,它从jboss JMS队列读取消息发送到两个直接路由,其中一个直接路由成功地处理了消息并发送到另一个JMS队列,另一个直接路由处理消息失败。

我的期望是,原始交换移动到死信通道,第一个直接路由不应该提交,使用回滚将消息发送到JMS队列。

我尝试过许多可能性,但没有一个成功。下面我提供了骆驼路线。好心帮帮我。

 <bean id="jmsConnectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean">
        <property name="jndiTemplate" ref="jndiTemplate"/>
        <property name="jndiName" value="jms/RemoteConnectionFactory"/>
    </bean>

    <bean id="jmsTransactionManager" class="org.springframework.jms.connection.JmsTransactionManager">
        <property name="connectionFactory" ref="jmsConnectionFactory"/>
    </bean>

    <bean id="jmsConfig" class="org.apache.camel.component.jms.JmsConfiguration">
        <property name="connectionFactory" ref="jmsConnectionFactory"/>
    </bean>

    <bean id="jmsConfigTx" class="org.apache.camel.component.jms.JmsConfiguration">
        <property name="connectionFactory" ref="jmsConnectionFactory"/>
        <property name="transactionManager" ref="jmsTransactionManager"/>
        <property name="transacted" value="true"/>
    </bean>

    <bean id="jms" class="org.apache.camel.component.jms.JmsComponent">
        <property name="configuration" ref="jmsConfig"/>
    </bean>

    <bean id="jmstx" class="org.apache.camel.component.jms.JmsComponent">
        <property name="configuration" ref="jmsConfigTx"/>
    </bean>

    <bean id="successProcessor" class="com.test.SuccessTestProcessor"/>
    <bean id="errorProcessor" class="com.test.ErrorTestProcessor"/>
    <bean id="deadChannelProcessor" class="com.test.DeadChannelTestProcessor"/>

    <bean id="myDeadLetterErrorHandler" class="org.apache.camel.builder.DeadLetterChannelBuilder">
        <property name="deadLetterUri" value="direct:error_channel"/>
    </bean>

    <camelContext xmlns="http://camel.apache.org/schema/spring">
        <route id="route-one" errorHandlerRef="myDeadLetterErrorHandler">
            <from uri="jmstx:queue:JMS_IN"/>
            <transacted/>
            <to uri="direct:success-route"/>
            <to uri="direct:error-route"/>
        </route>

        <route id="direct-success-route">
            <from uri="direct:success-route"/>
            <process ref="successProcessor"/>
            <to uri="jmstx:queue:JMS_OUT_1"/>
        </route>

        <route id="direct-error-route">
            <from uri="direct:error-route"/>
            <process ref="errorProcessor"/>
            <to uri="jmstx:queue:JMS_OUT_2"/>
        </route>

        <route id="direct_error_channel">
            <from uri="direct:error_channel"/>
            <process ref="deadChannelProcessor"/>
            <to uri="jmstx:queue:ERROR"/>
        </route>
    </camelContext>

共有1个答案

东云
2023-03-14
<-- error -->

<bean id="jmsConfigTx" class="org.apache.camel.component.jms.JmsConfiguration">
    <property name="connectionFactory" ref="jmsConnectionFactory"/>
    <property name="transactionManager" ref="jmsTransactionManager"/>
    <property name="transacted" value="true"/>
</bean>

in the above code snippet  already Transactionfactory refers to the jmsConnectionFactory internally , is there any need to write one more property to refer jmsConnectionFactory .
 类似资料:
  • 本文向大家介绍Docker容器跨主机通信中直接路由方式详解,包括了Docker容器跨主机通信中直接路由方式详解的使用技巧和注意事项,需要的朋友参考一下 概述 就目前Docker自身默认的网络来说,单台主机上的不同Docker容器可以借助docker0网桥直接通信,这没毛病,而不同主机上的Docker容器之间只能通过在主机上用映射端口的方法来进行通信,有时这种方式会很不方便,甚至达不到我们的要求,因

  • 问题内容: 我有一个Python脚本作为守护程序运行。在启动时,它产生5个进程,每个进程都连接到Postgres数据库。现在,为了减少数据库连接的数量(最终将变得非常大),我试图找到一种在多个进程之间共享单个连接的方法。为此,我正在研究API。但是,我不确定如何使用该API在各个进程之间传递对象。谁能告诉我该怎么做? 为了解决这个问题,我也开放其他想法。 我之所以不考虑将连接作为构造函数的一部分传

  • 我正在尝试在我的nginx服务器上设置vue路由器。我遇到的问题是,如果我直接在浏览器中输入url,我的路线就不起作用。 我尝试了vue路由器文档中描述的服务器配置,以及建议的堆栈溢出类似配置。我当前的nginx位置配置如下: 所做的就是将任何路径重定向到我的根组件(path:),而不是。这确实有意义,并且似乎只重定向到索引文件。我如何重定向直接链接的到路由在我的VueJS应用程序? 以下是我的v

  • 问题内容: 我有一个v3的撰写文件,其中有3个服务共享/使用相同的卷。在使用群模式时,我们需要创建额外的容器和卷来管理整个集群中的服务。 我打算使用NFS服务器,以便单个NFS共享将直接安装在群集内的所有主机上。 我发现以下两种实现方法,但是它需要在Docker主机上执行额外的步骤- 在主机上使用“ fstab”或“ mount”命令挂载NFS共享,然后将其用作Docker服务的主机卷。 使用Ne

  • 问题内容: 这篇文章是JPA的延续。如何在持久化后从数据库获取值 当我执行以下命令时,我将遵循以下异常,该如何解决呢? DAOImpl 代码 applicationContext.xml 问题答案: 我猜这里的问题是,尽管您已经为事务管理器定义了bean,但是您没有注释启用弹簧事务的create()方法。 还要删除该语句,因为现在所有事务管理都将在spring之前完成,如果您保留该语句不变,则将再

  • 我的路线如下 我知道(A)处的JMS消费者将在每次轮询时分叉JMS事务,并附加到线程。(B)中的事务处理节点也将在交换到达那里并连接到线程后分叉JPA事务。 请在下面找到我的问题: > < li >能否将两个不同的事务附加到一个线程上(如上所示)? < li >如果是,哪一个应该被停职? < li> 上述路由的提交和回滚顺序应该是什么? 注:我没有从骆驼在行动第二版中找到任何明显的答案,所以请指导