在尝试将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隔离策略从线程改为信号量,工作正常,因为它是相同的线程,但我理解这不是解决问题的正确方法。
所以我的问题是,如何让Hystrix执行线程成为事务的一部分。有什么我可以应用的解决方法吗?
谢谢!
发布于 2017-05-17 18:46:56
这是一个有点老的线程,但也许有人也遇到了这个问题。github中有一个关于这方面的issue。
原因是,hystrix将在单独的线程中运行,这与前一个事务所在的位置不同。因此,lazy的事务和序列化将不起作用。
“线程”也是推荐的执行策略。所以如果你想同时使用hystrix和transaction,你应该在2级调用中使用它们。例如,在第一级服务功能中,使用事务,而在第二级服务功能中,使用hystrix调用第一级事务功能。
https://stackoverflow.com/questions/29290382
复制相似问题