2017-09-14 117 views
0

我正在处理采购订单的应用程序。
此应用程序构建于EJB1上并在IBM Websphere上运行。
我有一个需要解决的场景/问题。EJB 2中的Ashiving Singleton功能会话Bean

有一个Stateless Session Bean其中处理大量的订单(通常订单数量约为5K)。我想让这个功能同步。
即,如果其中一个用户激活订单处理,则在第一次处理完成之前,没有其他用户应该能够发起该过程。

由于一些限制,我无法将其升级到EJB3。
有没有任何有效的方法来解决这个问题?
我希望在任何提供的解决方案需要更少的代码改变以及..

回答

1

答案真的取决于其中存在的订单/他们是如何存储,以及有多少并发运行的服务器实例也许能够启动顺序处理。

如果订单仅存在于内存中(看起来不太可能)或者只有一个应用程序服务器进程正在运行以执行此功能,那么您可以为无状态会话Bean类添加一个静态字段并对其进行同步。这将提供类似于EJB 3.x单例bean的功能。但是,如果同一应用程序在多个应用程序服务器实例上同时运行,那么即使是单例bean也不适合您,因为每个服务器仍有一个实例,因此跨进程间没有同步。在这种情况下,您确实需要让无状态bean获得存储订单的锁。例如,如果您的订单存储在DB2数据库的行中,那么您可以仅使用一行将另一个表添加到同一个数据库,并且无状态bean需要获得该行的行锁才能处理订单。这提供了跨进程的同步(假定所有应用程序服务器实例正在访问相同的共享数据库)。

+0

否不存在多个服务器实例。只有一个。关于订单,它们将作为未处理的订单存储在数据库中。管理员用户将每天或几天批量处理它们。处理实际上将记录从一个表移动到另一个表。但是单击一个调用EJB方法的按钮。它有点耗时的过程,可能需要3-4分钟。我想避免的是另一个管理员用户启动流程,而一个启动的流程将持续进行。 –

+0

所以,像向无状态bean添加一个静态字段,然后在该方法中对其进行同步那样简单的事情应该能够做到。 'private static final Object syncObj = new Object();' – Tracy

相关问题