1

我正在尝试使用 spring 集成来解耦更长的运行操作,以更快地将响应返回给用户。

该请求在我们的数据库中创建了一个 gps 位置条目。我想做一个http请求,通过反向地理编码服务获取该gps位置的地址。这可能需要几秒钟,所以我想稍后/并行。

Spring Integration 对此非常有效,尽管我遇到的问题是,如果并行运行的服务要快,则在将位置条目保存在数据库中时会发生冲突。

是否有关于如何在 Spring Integration 中处理持久对象的最佳实践?我是否应该尝试锁定对象,直到处理主请求?

更新:

基本上我有两种方法来操作我的位置对象(伪 Java 代码):

一个在 MVC 控制器调用的服务类中:

void createPosition(float longitude, float latitude) {
  Position position = new Position(longitude, latitude);
  positionDao.save(position);
  locationChannel.send(new GenericMessage<Position>(position));
}

并且位于由附加到 locationChannel 的 ServiceActivator 调用的 Service 类中:

void getAddressForPosition(Position) {
  position.setAddress(/* get address via http request from openstreet or google */);
  positionDao.save(position);
}
4

1 回答 1

0

如果你能侥幸成功,我也会将位置创建委托给第二个线程。这样,工作单元的两个部分都可以在同一个事务中发生,您无需担心编排。

  1. 网络线程:接收请求
  2. 网络线程:发送工作消息
  3. 网络线程:返回响应
  4. 服务线程:创建位置
  5. 服务线程:用地址丰富位置

在 3 到 4,5 之间没有订购保证。然后客户可以在单独的请求中检查位置是否正确创建。

一个重要的考虑因素是使工作具有幂等性,因此如果事情不顺利,您可以重新发送消息而不会冒重复的风险。

于 2010-07-08T20:19:18.180 回答