Java 通过JMS对任务进行排队

Java 通过JMS对任务进行排队,java,jms,message-queue,spring-jms,weblogic11g,Java,Jms,Message Queue,Spring Jms,Weblogic11g,我想向comunity提出一个问题,并就我一直在思考的策略获得尽可能多的反馈,旨在解决项目中的一些性能问题 背景: 我们有一个重要的流程,执行4个步骤 实体状态更改及其持久性 如果1结束,则可以。实体将导出到CSV文件中 如果2结束,则可以。实体将导出到另一个CSV中。这一个有更多的信息 如果3结束就可以了。最后一个CSV通过邮件发送 步骤1和步骤2是相互关联的,它们是至关重要的 步骤3和4并不重要。甚至不在乎他们是否成功结束 1-2的表现还不错,但在某些escenarios中3-4的速度实在太

我想向comunity提出一个问题,并就我一直在思考的策略获得尽可能多的反馈,旨在解决项目中的一些性能问题

背景:

我们有一个重要的流程,执行4个步骤

  • 实体状态更改及其持久性
  • 如果1结束,则可以。实体将导出到CSV文件中
  • 如果2结束,则可以。实体将导出到另一个CSV中。这一个有更多的信息
  • 如果3结束就可以了。最后一个CSV通过邮件发送
  • 步骤1和步骤2是相互关联的,它们是至关重要的

    步骤3和4并不重要。甚至不在乎他们是否成功结束

    1-2的表现还不错,但在某些escenarios中3-4的速度实在太慢了。主要原因是步骤3

    如果我们按顺序执行所有步骤,有时步骤3会导致超时。客户端没有收到任何关于步骤1和2(重要的步骤)的响应,用户也不知道发生了什么

    这个案例让我在JMS队列中思考,以便将最后2个步骤委托给另一个应用程序/流程。从业务逻辑中取消分配通知。第二次出口和邮寄将在可行的情况下处理,可能并行处理。我还可以将它分成两个队列:导出、邮件通知

    我们的webapp运行在WebLogic11集群中,因此我可以使用它的实现

    你觉得这个策略怎么样?WebLogicJMS实现有什么好处吗?我应该检查另一个实现吗?ActiveMQ,RabbitMQ

    我还考虑了使用spring任务来提示系统实现

    在这一点上,我必须在春季批点。它的使用是有限的。我们已经有太多的工作专注于重要的数据整合过程,分配更多工作的时间窗口是有限的。再加上一次尝试大量处理所有项目的影响

    如果我们能找到一种使用SpringBatch多线程的方法,也许我们可以,但我们还没有找到将oír需求融入这种策略的方法


    提前谢谢你,请原谅我的英语。我保证继续努力:-)

    < P>一个要考虑的问题是数据完整性。如果步骤n失败,是否需要反转步骤n-1?您是否需要了解任何排序依赖关系?您是向相同的CSV还是不同的CSV写信?如果相同,则可能存在争用问题

    现在,回到原来的问题。我将考虑java执行器,使用4个固定大小的池,并将任务通过池迁移成功:

  • 将步骤1提交到池1,获得一个未来返回,用于检查是否完成
  • 当步骤1完成时,您将步骤2提交到池2
  • 当步骤2完成时,您现在可以将结果返回给调用者。对这一点的调用一直在等待(可能有一个超时,因此它不会永远挂起),但现在关键任务已经完成
  • 返回到客户端后,将步骤3提交到池3
  • 步骤3完成后,将步骤提交到池4
  • 池本身虽然大小固定,但池1/2可以更大以获得最大吞吐量(并尽快返回到您的客户机),池3/4可以更小,但仍然足够大以完成工作

    您可以使用JMS做一些类似的事情,但问题是类似的:您需要有多个侦听器或每个侦听器有多个线程,以便能够以适当的速度进行处理。您可以在没有池的情况下同步执行步骤1/2,但执行者提供的一些线程管理功能无法实现。您仍然需要将步骤3/4“安排”到JMS队列中,并且仍然需要侦听器来处理它们


    在这里,从服务器宕机中恢复的能力是关键,但Executors/ExecutorService没有持久性,因此我肯定会考虑JMS(然后我会将所有内容排队,甚至是前两步),但根据您的使用情况,这可能会有点过头。

    是的,一种事件驱动的方法,其中消息总线使集成听起来不错。它们是异步的,因此您不会有超时。当然,您需要使用一个主题。当服务器中的邮件太多时,WLS会出现一些内存问题,可能另一台服务器可以更好地分离关注点和资源。

    谢谢Scott。除了步骤2之外,不存在需要注意的完整性数据问题。如果步骤2结束OK表示CHNGES已正确存储,则可以使用最后2个步骤取消通知过程。我喜欢Java执行器的想法。这很像我对JMS的想法。链接队列。正如您所指出的,需要一组“看门狗”,检查每个队列/池中发生的情况,并向前或向后进行重试。我将检查我们是否真的需要持久化这些任务,或者它们是否可以在运行时执行。排队也带来了不便。就像队列服务器宕机一样。你的再次Scottnp,总的来说,假设限制不会影响年轻,这是一个相当好的方法!你指出了我们环境中的一个重要弱点。几个共享lib和webapps一起运行。我将试着测量我们需要多少记忆。