我在将@EnableLoadTimeWeaving与AspectJ + @Transactional + @HystrixCommand结合使用时遇到问题。

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

@EnableLoadTimeWeaving(aspectjWeaving = ENABLED)
@EnableCaching(mode = AdviceMode.ASPECTJ)
@EnableTransactionManagement(mode = AdviceMode.ASPECTJ)


加上仪器配置。

我有一个用@Transactional注释的bean A和其中用@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中断事务传播?这与我使用加载时编织的事实有某种关系吗?还是预期的行为?有人可以阐明它吗?

最佳答案

您要说明的问题可能与HystrixCommands在独立的thread中执行的事实有关:


  默认值和建议的设置是使用线程隔离(THREAD)运行HystrixCommands,使用信号隔离(SEMAPHORE)运行HystrixObservableCommands。
  
  在线程中执行的命令具有额外的保护层,可防止网络超时所提供的延迟。
  
  通常,只有在调用量如此之大(每个实例每秒数百个)以至于各个线程的开销过高时,才需要对HystrixCommands使用信号隔离。这通常仅适用于非网络呼叫。

关于java - 加载时编织(AspectJ):Hystrix中断了事务传播,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57217248/

10-13 09:13