java - 在 EJB 2 session Bean 中实现单例功能

标签 java ejb websphere-8 ejb-2.x

我正在开发一个处理采购订单的应用程序。
该应用程序基于 EJB1 构建并在 IBM Websphere 上运行。
我有一个需要解决的场景/问题。

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

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

最佳答案

答案实际上取决于订单存在的位置/存储方式,以及有多少并发运行的服务器实例可能能够启动订单处理。

如果订单仅存在于内存中(似乎不太可能),或者只有一个应用程序服务器进程正在运行来执行此功能,那么您只需向无状态 session bean 类添加一个静态字段并对其进行同步即可。这将提供类似于 EJB 3.x 单例 bean 的功能。

但是,如果同一个应用程序同时在多个应用程序服务器实例上运行,那么即使是单例 bean 也无法为您工作,因为每个服务器仍然有一个实例,因此无法跨进程同步。在这种情况下,您确实需要让无状态 bean 获取存储订单的内容的锁。例如,如果您的订单存储在 DB2 数据库的行中,那么您可以将另一个表添加到仅包含一行的同一数据库中,并且无状态 Bean 在处理订单之前需要获取该行的行锁。这提供了跨进程的同步(假设所有应用程序服务器实例都访问同一共享数据库)。

关于java - 在 EJB 2 session Bean 中实现单例功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46211592/

相关文章:

java - 在初始化静态变量期间调用 Singleton EJB

java - 在 EJB-Hibernate 环境中使用 JDBC

java - 相同的字段名称导致系统错误

datasource - Quartz 计划作业无法访问 Websphere 中的数据源

ssl - 在 Maximo/Jython 中下载 SetupTools 失败并出现 HTTP 错误 403 SSL is required

java - java中美国各州的地理定位(纬度/经度)

Java 邮件不工作

java - 服务器连接 channel 的 mq 连接过多,这些连接不是由队列创建的

java - 防止专注于创建 Activity

java - AES解密NodeJs中的文件