5

入站网关:

<int-http:inbound-gateway   id="inbound.gateway"
                            request-channel="transactional.channel.input"
                            reply-channel="channel.output"
                            error-channel="channel.error"
                            request-payload-type="java.lang.String"
</int-http:inbound-gateway>

建议定义:

<tx:advice id="advice">
    <tx:attributes>
        <tx:method name="send" propagation="REQUIRES_NEW" rollback-for="MyClassException"/>
    </tx:attributes>
</tx:advice>

建议配置:

<aop:config>
    <aop:advisor advice-ref="advice" pointcut="bean(transactional.channel.input)"/>
</aop:config>

需要交易的链:

<int:chain input-channel="transactional.channel.input" output-channel="non.transactional.channel.input>
    <int:service-activator ref="v1.registerUser.service" method="registerUser"/>
    <int:service-activator ref="v1.saveObject.service" method="saveObject"/>
</int:chain>

需要事先执行事务以获取在最后一个事务链步骤中生成的对象 id 的链:

<int:chain input-channel="non.transactional.channel.input" output-channel="channel.output">
    <int:service-activator  ref="v1.getObjectId.service" method="getObjectId"/>
    <int:object-to-json-transformer/>
</int:chain>

有了这个简化的上下文,当我访问 getObjectId 服务中的 id 时,事务还没有执行。

所以事务似乎是在入站网关输出级别提交的。

4

2 回答 2

9

在不编写任何 Java 代码的情况下,还有一个惊人的技巧:

<channel id="input"/>

<aop:config>
    <aop:advisor advice-ref="txAdvice" pointcut="bean(input)"/>
</aop:config>

<tx:advice id="txAdvice">
    <tx:attributes>
     <tx:method name="send"/>
    </tx:attributes>
</tx:advice>

有了这个,您所有的直接单线程消息流都将被包装到发送到通道输入的消息上的 TX

于 2013-09-20T10:22:40.633 回答
4

如果它是一个注入到您的代码中的 MessagingGateway,您可以简单地在网关处启动您的事务,并且由于所有通道都是直接的,因此整个流程将在同一个事务中运行。只需使用上下文(和事务管理器)注释您的网关方法@Transactional并将其添加<tx:annotation-driven/>或添加到您的上下文中。@EnableTransactionManagement

或者,如果您想要交易中的其他内容,您甚至可以更早开始交易......

@Transactional
public void foo() {
    ...
    Object reply = myGateway.exchange(Object foo);
    ...
}

只需确保foo()从另一个 bean 调用,以便包含的类foo()被包装在事务代理中(通过 @EnableTransactionManagement 或<tx:annotation-driven/>)。

如果是http入站网关@Transaction等网关,在入站网关后面加al网关,开始事务。(添加一个refsa的服务激活器,<gateway/>它交换Message<?>并用 注释@Transactional)。

于 2013-09-19T21:54:04.053 回答