创建可靠的JMS客户端?

时间:2014-02-23 09:05:29

标签: java jms

考虑使用JMS将消息发送到远程JMS队列的独立Java main()程序(无Java EE容器)。

据我所知,如果远程队列由于某种原因不可用(网络问题,服务器关闭,队列已满......),messageProducer.send(msg)会抛出异常。

我是否必须自己实现重试逻辑,或者JMS-api会以某种方式为我解决这个问题吗?

  TextMessage message = session.createTextMessage();
  message.setJMSDeliveryMode(DeliveryMode.PERSISTENT);
  MessageProducer mp = session.createProducer(topic);
  mp.send(message); // Throws JMSException. How to retry, local storage etc?

5 个答案:

答案 0 :(得分:1)

您必须自己实施重试逻辑。请注意,如果连接失败,则无法再使用,您需要创建一个新连接才能重试。

答案 1 :(得分:1)

我想补充一点,通常使用客户端连接,您甚至不仅要实现重试逻辑,还要实现更多,因为您无法确定发送失败的步骤。 你可能会把你的消息成功发送但是服务器没有发送给你关于那个的说明,然后你得到了异常但消息就在那里......这是一个有点虚构的例子,但仍然......

我建议你实现一些协调的事务,你使用事务从一个源(例如文件系统或数据库)获取消息,然后将其发送到队列。如果一切都很酷,你提交jms会话,然后提交源(例如文件系统)操作。 这可能是一个HA事务,或者只是伪HA - 如我所描述的那样协调,它更轻量级并且仍然提供一些容差。

然后,为了实现重试逻辑,您可以从数据传递(db的文件系统)上对资源进行简单的轮询,因此下次轮询失败的消息(如果它已回滚) - 您只需再次获取它像往常一样使用它。

答案 2 :(得分:1)

如果网络blip等连接存在问题,WebSphere MQ等JMS提供程序具有自动重新连接功能,如果在执行API期间出现连接问题,JMS客户端会尝试重新连接。例如,如果在执行Send API期间连接到JMS提供程序中断,则JMS客户端会尝试重新连接到JMS提供程序,如果建立了连接,则会将消息发送给提供程序。重新连接尝试对JMS应用程序是透明的,这意味着应用程序不知道重新连接。

如果队列已满,则应用程序必须处理异常并采取适当的措施。

答案 3 :(得分:0)

如果您使用的是WebLogic for JMS,则可以使用JMS SAF客户端从客户端获得可靠的传送。更多信息可以在Weblogic SAF client

找到

答案 4 :(得分:0)

这取决于您的客户端运行的时间。如果它就像一个桌面应用程序,即它运行一段时间,您可以使用客户端上的本地队列,并配置一个桥接器来处理可靠的,一次只能转发到远程队列。如果它是一个只调用一次并且退出的脚本,那么你将不得不为自己处理重试,幂等性等等......也许你最好还是进行同步调用。