如果骆驼DSL被标记为transacted(),那么我们真的需要在Spring服务方法中添加@Transactional注释吗?
我真的很想知道Camel和Spring Transaction的互动。
我们将不胜感激任何帮助。
答案 0 :(得分:0)
不,通常您无需注释任何方法@Transactional
即可使骆驼式交易正常。
Camel和Spring TransactionManager之间的主要交互是,如果将Camel配置为将事务处理委托给Spring txManager,则它会这样做。换句话说:Camel使用Spring txManager(如果可用),但是您也可以使用其他txManager。
对于此委托,不需要@Transactional
批注。相反,您必须配置Spring txManager并将骆驼路线标记为transacted()
。
但是,您的问题为假设留有余地。您想用什么方法注释@Transactional
?包含路线的方法?路由调用的托管bean的方法?一种完全不依赖骆驼路线的方法?
交易的Camel route围绕整个路径(1)或更具体的unit of work创建交易范围。
让我们举个例子:从JMS队列读取,转换数据并写入其他多个JMS队列的路由。如果您标记了已处理的路由,并且在发送最后一条消息时发生错误,则事务将回滚并且不发送任何消息。
由于事务作用域,在事务成功完成之前,不会提交已经“发送”(发送)的消息。回滚后,代理将重新传递相同的消息(传入)并通过路由再次进行处理。
请注意,骆驼路线 可以在路线中没有transacted()
标记(2)的情况下进行交易。
但是,由于Camel是关于集成的,因此您通常具有“混合环境”,例如JMS到数据库。甚至更糟的是,您在路由期间执行HTTP请求。如果以后发生错误,则无法“撤消”这些调用。
因此,在骆驼世界中,交易可以提供很多帮助,但通常还远远不够。您必须实施补偿,才能真正回滚中止的路由处理。
如果您使用事务处理的路由,请确保写Route tests来模拟路由处理中的错误,并检查回滚是否按预期工作。
好吧,这些是关于骆驼和交易的一些高级想法。如果您想更深入,请阅读我在评论中推荐的骆驼书:-)
脚注:
(1)当路由包含有状态组件或EIP(例如aggregator,resequencer等)时,它们会在骆驼路由内部引入事务边界。在这种情况下,事务作用域在第一个有状态组件处结束。结果,这些组件通常提供可选的持久性,以提供保存状态的可能性。
为明确这种交易边界,我通常不会在此类组件之后的同一条路线中继续操作,而是创建一个新组件并将有状态组件的结果消息发送到新路由。
(2)例如,对于使用JMS本地事务的JMS使用者。