spring集成和持久对象

时间:2010-07-08 09:46:45

标签: java spring-integration

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

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

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

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

更新

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

由MVC控制器调用的Service类中的一个:

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);
}

1 个答案:

答案 0 :(得分:0)

如果你能逃脱它,我也会将位置创建委托给第二个线程。这样,工作单元的两个部分都可以在同一个事务中发生,而且您不必担心编排。

  1. 网络主题:接收请求
  2. 网络主题:发送工作信息
  3. 网络主题:返回回复
  4. 服务主题:创建职位
  5. 服务主题:通过地址丰富职位
  6. 3到4,5之间没有订购保证。然后,客户端可以检查位置是否在单独的请求中正确创建。

    一个重要的考虑因素是使工作具有幂等性,因此如果事情向南发展,你可以重新发送信息,而不会有重复的风险。