我在尝试将Hystrix集成到现有的Spring Boot应用程序时遇到以下问题。我正在使用带有spring数据的引导(jpa存储库)。应用程序的结构非常简单, 我们有资源 - >服务 - >库。
我启用了Hystrix支持并注释了一个返回实体的服务方法,如下所示:
@HystrixCommand(fallback="getDealsFallback")
public Page<Deal> getDeals(...) {
// Get the deals from the Index Server.
return indexServerRepository.findDealsBy(...);
}
public Page<Deal> getDealsFallback(...) {
// If IndexServer is down, query the DB.
return dealsRepository.findDealsBy(...);
}
所以这可以按预期工作,当我将实体返回给客户端时,真正的问题实际存在。我正在使用OpenEntityManagerInViewFilter,所以我可以用它的关系序列化我的模型。 当我在服务方法中使用@HystrixCommand时,在尝试序列化时会出现LazyInitializatioException。
我知道原因(或者至少我怀疑是什么问题),因为Hystrix正在另一个线程中执行 所以不是交易的一部分。将Hystrix隔离策略从THREAD更改为SEMAPHORE,因为它的相同线程正常工作,但我知道这不是解决问题的正确方法。
所以我的问题是,如何让Hystrix执行线程成为事务的一部分。我可以申请任何解决方法吗?
谢谢!
答案 0 :(得分:1)
这是一个有点旧的线索,但也许有人遇到这个问题。 github中有一个issue。
原因是,hystrix将在单独的线程中运行,这与前一个事务的位置不同。因此,懒惰的事务和序列化将不起作用。
'THREAD'也是推荐的执行策略。因此,如果您想同时使用hystrix和事务,则应在2级调用中使用它们。比如,在第一级服务功能中,使用事务,在二级服务功能中,使用hystrix并调用第一级事务功能。