加载时编织 (AspectJ):Hystrix 中断事务传播

@EnableLoadTimeWeaving我在与 AspectJ + @Transactional+的组合中遇到问题@HystrixCommand。


所以,我已经像这样配置了加载时编织:


@EnableLoadTimeWeaving(aspectjWeaving = ENABLED)

@EnableCaching(mode = AdviceMode.ASPECTJ)

@EnableTransactionManagement(mode = AdviceMode.ASPECTJ)

加上仪器配置。


我有一个 bean A,@Transactional在其中用和方法注释,用 注释@HystrixCommand。


然后我有一个 bean B,也用 注释@Transactional,但是有propagation = Propagation.MANDATORY,这意味着它需要现有事务,否则失败。这个 bean 中还有一个方法,用@HystrixCommand.


最终,当我从 bean A 的方法调用 bean B 的方法时,我得到:No existing transaction found for transaction marked with propagation 'mandatory'。


我找了几个小时的问题:一切似乎都配置正确,所以我几乎放弃了。然后我只是试图@HystrixCommand从方法中删除。瞧:事务传播开始正常工作,异常消失了。


所以我想知道:为什么会@HystrixCommand中断事务传播?它与我使用加载时编织的事实有某种关系吗?还是预期的行为?有人可以阐明一下吗?


慕桂英3389331
浏览 92回答 1
1回答

宝慕林4294392

HystrixCommands您所说的问题可能与在隔离线程中执行的事实有关:默认和推荐的设置是使用线程隔离 (THREAD) 运行 HystrixCommands,使用信号量隔离 (SEMAPHORE) 运行 HystrixObservableCommands。在线程中执行的命令具有额外的保护层,以防止超出网络超时所能提供的延迟。通常,只有当调用量如此之大(每个实例每秒数百次)以至于单独线程的开销太高时,您才应该为 HystrixCommands 使用信号量隔离;这通常只适用于非网络呼叫。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java