我正在处理处理采购订单的应用程序。
该应用程序建立在EJB1上并在IBM WebSphere上运行。
我有一个需要解决的方案/问题。
有一个Stateless Session Bean
处理一堆订单(通常订单数量约为5K)。我想使此功能同步。
即,如果一个用户激活订单处理,则没有其他用户能够启动该过程,直到第一次处理完成为止。
由于某些约束,我无法将其升级到EJB3。
有没有有效解决这个问题的方法?
我希望任何提供的解决方案也需要更少的代码更改。
答案确实取决于订单的存在/存储方式,以及有多少同时运行的服务器实例可以启动订单处理。
如果仅在内存中存在订单(似乎不太可能),或者只有一个应用程序服务器进程运行以执行此功能,那么您只需在无状态的会话bean类中添加静态字段并在其上同步即可。这将提供类似于EJB 3.x单顿豆的功能。
但是,如果此相同的应用程序在多个应用程序服务器实例上同时运行,那么即使是单人bean也不适合您,因为每个服务器仍然有一个实例,因此跨进程没有同步。在这种情况下,您确实需要让无状态的豆子获得存储订单的东西的锁定。例如,如果您的订单存储在DB2数据库的行中,则可以仅使用一行将另一个表添加到同一数据库中,并且无状态的Bean需要在该行的行锁定之前获得该行的行才能处理订单之前。这提供了跨进程的同步(假设所有应用程序服务器实例都访问相同的共享数据库)。