用于在应用程序之间委派任务的Java企业体系结构

用于在应用程序之间委派任务的Java企业体系结构,java,jakarta-ee,architecture,scheduling,message-queue,Java,Jakarta Ee,Architecture,Scheduling,Message Queue,在我的环境中,我需要安排长时间运行的任务。我有一个应用程序,它只向客户端显示当前正在运行的任务列表,并允许安排新的任务。还有应用程序B,它执行实际的艰苦工作 因此,应用程序A需要在应用程序B中安排任务。它们唯一的共同点是数据库。最简单的方法似乎是添加一个包含任务列表的表,让appb每隔一段时间查询该表并执行新计划的任务 然而,这似乎不是正确的做法。乍一看,企业环境中的作业工具似乎是消息队列。应用程序A向队列发送带有任务描述的消息,应用程序B从队列读取消息并执行任务。在这种情况下,应用程序A是否可

在我的环境中,我需要安排长时间运行的任务。我有一个应用程序,它只向客户端显示当前正在运行的任务列表,并允许安排新的任务。还有应用程序B,它执行实际的艰苦工作

因此,应用程序A需要在应用程序B中安排任务。它们唯一的共同点是数据库。最简单的方法似乎是添加一个包含任务列表的表,让appb每隔一段时间查询该表并执行新计划的任务

然而,这似乎不是正确的做法。乍一看,企业环境中的作业工具似乎是消息队列。应用程序A向队列发送带有任务描述的消息,应用程序B从队列读取消息并执行任务。在这种情况下,应用程序A是否可以获取所有已调度任务的状态(持久队列?),而不创建一个类似于上面提到的表,应用程序B将向其中写入已完成任务的状态?还请注意,可能有多个app A实例,每个实例都需要了解所有实例的所有任务

“表方法”的缺点是我需要DB轮询

“消息队列方法”的缺点是,我在基础设施中引入了一个新的通信通道(另一个可能失败的事情)

你觉得怎么样?还有其他想法吗? 提前感谢您的建议:)

===============================

最后,我决定采用以下方法:这个问题有两个方面:一个是A和B之间的沟通,另一个是获取有关任务的信息

对于通信来说,正确的作业工具是JMS。要获得数据,正确的工具是数据库。 因此,我将让应用程序A在“任务”表中添加一个新行来描述任务(我可以稍后查询此表以获得所有任务的列表)。然后,A将通过JMS向B发送消息,只需说“您有工作要做”。B将完成工作并更新表中的任务状态


谢谢大家的回复

您在企业体系结构中拥有丰富的经验。使用这些,它们可以在JavaEE容器(如Glassfish)中使用。可以序列化消息,以确保即使服务器在队列中重新启动,消息也会被传递。您甚至不需要关心这些是如何实现的。

您在企业体系结构中有。使用这些,它们可以在JavaEE容器(如Glassfish)中使用。可以序列化消息,以确保即使服务器在队列中重新启动,消息也会被传递。您甚至不需要关心这些是如何实现的。

另一种选择是将B作为服务,例如,将控制和状态接口作为REST或SOAP接口公开。在这种情况下,A将只是作为B的客户端应用程序。B将其状态存储在数据库中。A是一个只与B通信的无状态应用程序


顺便说一句,使用Spring Remote,您可以公开一个接口,并使用JMS、REST、SOAP或RMI中的任何一个作为传输层,以后可以根据需要进行更改。

另一个选项是将B作为服务,例如,将控制和状态接口公开为REST或SOAP接口。在这种情况下,A将只是作为B的客户端应用程序。B将其状态存储在数据库中。A是一个只与B通信的无状态应用程序


顺便说一句,使用SpringRemote,您可以公开一个接口,并使用JMS、REST、SOAP或RMI中的任何一种作为传输层,以后可以根据需要进行更改。

您需要考虑您的部署环境,包括现在和将来可能的更改

您实际上看到了两个问题,这两个问题都可以通过多种方式解决,这取决于您能够获得多少基础设施,也取决于您愿意引入多少基础设施,但为您的问题“调整”设计也很重要

当你正确地考虑使用数据库和消息传递时,你需要考虑这些项目是否对你的域名来说是多余的,只有你和其他知道你的域名的人才能真正的回答这个问题。 我的建议是看看你所在地区已经在使用什么。如果您已经有了可以构建的数据库基础结构,那么在数据库中监视任务活动和调度作业并不是一个坏主意。但是,如果您必须运行自己的数据库,获得新的硬件,并且没有足够的支持资源,那么引入数据库可能不是一个明智的选择,您可以考虑一种更简单但可能更脆弱的方法,让您的流程编写文件来安排作业和报告任务

同时,不要认为DB或JMS的引入天生容易出错。正确实施它们是稳定且经验证的技术,将使您的系统具有可扩展性和可管理性


正如@kan所说,使用公开web服务接口也是一个有用的选择

您需要考虑您的部署环境,包括现在和将来可能发生的变化

您实际上看到了两个问题,这两个问题都可以通过多种方式解决,这取决于您能够获得多少基础设施,也取决于您愿意引入多少基础设施,但为您的问题“调整”设计也很重要

当你正确地考虑使用数据库和消息传递时,你需要考虑这些项目是否对你的域名来说是多余的,只有你和其他知道你的域名的人才能真正的回答这个问题。 我的建议是看看你所在地区已经在使用什么。如果您已经有了可以构建的数据库基础结构,那么在数据库中监视任务活动和调度作业并不是一个坏主意。但是,如果您必须运行自己的数据库,获得新的硬件,则没有足够的支持资源