代码之家  ›  专栏  ›  技术社区  ›  Thomas Einwaller

spring集成和持久对象

  •  1
  • Thomas Einwaller  · 技术社区  · 16 年前

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

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

    Spring集成在这方面效果很好,不过我遇到的问题是,如果并行运行的服务要加快速度,则在数据库中保存位置条目时会发生冲突。

    在Spring集成中,有没有处理持久对象的最佳实践?我是否应该尝试锁定对象,直到主请求得到处理?

    更新:

    基本上,我有两种方法来操作position对象(伪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调用:

    void getAddressForPosition(Position) {
      position.setAddress(/* get address via http request from openstreet or google */);
      positionDao.save(position);
    }
    
    1 回复  |  直到 16 年前
        1
  •  0
  •   iwein    16 年前

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

    1. web线程:接收请求
    2. web线程:发送工作消息
    3. web线程:返回响应
    4. 服务线程:创建位置
    5. 服务线索:用地址充实职位

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

    一个重要的考虑因素是使功幂等,这样,如果情况恶化,就可以重新发送消息,而不必冒重复的风险。