该应用程序具有占用大量CPU资源的长进程,当前该进程在客户端请求时在一台服务器(EJB方法)上串行运行。
从理论上讲,理论上可以将流程分为N个块并并行执行,只要可以收集所有并行作业的输出并将其合并在一起,然后再将其发送回启动该流程的客户端即可。我想使用这种并行化来优化性能。
如何使用EJB实现这种并行化?我知道我们不应该在EJB方法中创建线程。相反,我们应该发布消息(每个作业一个),以供消息驱动bean(MDB)使用。但这将不再是同步调用。在这种情况下,同步是一项要求,因为我需要先收集所有作业的输出,然后再将其发送回客户端。
有解决方案吗?
这个特殊问题已经多次出现,我将总结出有几种可能的解决方案,我只建议其中一种。
使用commonj API中的WorkManager。它允许在Java EE容器中使用托管线程,并且经过专门设计以适合您的用例。如果您使用的是WebSphere或WebLogic,则服务器中已经提供了这些API。对于其他人,您将必须自己提供第三方解决方案。
WorkManager信息
相关问题 为什么不鼓励生成线程