JMS问题在JBoss 5.2 EAP上使用分区作业进行Spring批处理

时间:2016-12-08 21:20:01

标签: spring-integration spring-batch-admin

我们正在使用Spring Batch和我们的项目广泛分区工作。有时我们会看到分区作业因为丢失消息而导致“挂起”的问题。远程分区全部完成,但父步骤保持在STARTED状态。我们的配置使用1个连接工厂来读取来自队列(入站网关)的消息,使用不同的群集连接来发送分区消息(出站网关)。原因是JBoss消息传递不能在集群周围统一分发消息,而客户端连接工厂提供了这种功能。

Redhat进来,坦率地向Spring和配置扔泥巴。以下是他们的报告摘录

Spring JMSTemplate代码使用了几种反模式,比如创建新连接,会话,生成器只是为了发送消息,然后关闭连接。此外,当收到消息时,它每次都可以创建一个消费者, 收到消息,然后关闭消费者。这可能导致负载下的性能不佳。反模式的使用不仅会导致性能不佳,还会耗尽操作系统资源,例如 线程和文件句柄,因为某些连接资源是异步释放的。此外,对于非持久主题订阅者,您最终可能会丢失消息,因为在结束之间收到任何消息 下一个消费者的最后一个和开放将会丢失。有一个地方可以接受使用Spring JMSTemplate在应用服务器内部使用JCA托管连接工厂(通常在“java:/ JmsXA”)并且仅在您发送消息时有效。 JCA托管连接工厂缓存连接,因此实际上不会每次都创建它们。但是,使用JCA托管连接工厂不会解决消费者的问题,因为它们不会被缓存。 总之,Spring JMSTemplate除了在具有JCA托管连接工厂(java:/ JmsXA)的应用程序服务器中使用它的非常具体的用例之外不能安全使用,并且仅在这种情况下发送消息 (不要用它来消费消息)。 在应用程序服务器外部的JMS客户端应用程序中使用它永远不会安全,并且使用标准连接工厂(例如“ConnectionFactory”,“ClusteredConnectionFactory”,“jms / RemoteConnectionFactory”等)是 永远不安全;使用它来接收消息永远不会安全。要使用Spring安全地接收消息,请考虑将MessageListenerContainers [7]与MessageDriven Pojos [8]一起使用。 最后,请注意遇到的问题基于JMS反模式,因此不是JBoss EAP特有的问题。例如,请参阅有关ActiveMQ [9]的类似讨论。 除了通过JCA托管连接工厂发送消息的一个可接受的用例外,Red Hat不支持将Spring JMSTemplate与JBoss Messaging一起使用。

建议

●对于Spring JMS,通常使用JBoss EAP中配置的JCA托管连接工厂。不要使用Spring配置的连接工厂。使用JNDI模板从JBoss将连接工厂引入Spring。这将摆脱大多数Spring JMS问题。 ●对批处理作业使用标准JMS而不是Spring JMS。 Spring是一个非标准的(可能是JMS的次标准实现)。标准JMS使用一些发件人池来发送消息,并在发送消息后关闭会话。在侦听器端,标准JMS使用侦听分布式队列或主题的工作池。每个Web服务器都将JMS侦听器部署为singleton,并使用标准的java observer 通知任何希望回电的来电者。

JMS连接工厂在JBoss中配置并通过JNDI加载。

您能否就其评估提供反馈意见?

1 个答案:

答案 0 :(得分:0)

为避免每次发送创建新连接/会话的开销,您需要将提供商的连接工厂包装在CachingConnectionFactory中。它为发送和缓存会话,生产者,消费者重用相同的连接。