4

我在尝试将 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 执行线程成为事务的一部分。有什么我可以申请的解决方法吗?

谢谢!

4

1 回答 1

1

这是一个有点旧的线程,但也许有人也遇到了这个问题。github中有一个关于这个的问题

原因是,hystrix 将运行在单独的线程中,这与之前的事务所在的位置不同。所以惰性的事务和序列化将不起作用。

并且“线程”也是推荐的执行策略。所以如果你想同时使用 hystrix 和 transaction,你应该在 2 级调用中使用它们。比如,在一级服务功能中,使用事务,在二级服务功能中,使用hystrix并调用一级事务功能。

于 2017-05-17T10:46:55.980 回答