【问题标题】:JMS Message Sending After JMS Server Restart During Runtime运行时 JMS 服务器重新启动后发送 JMS 消息
【发布时间】:2012-07-08 14:15:01
【问题描述】:

我遇到了关于 JMS 的问题。问题是,我有一个应用程序,它正在尝试通过 JMS 发送消息,但是在 JMS 服务器重新启动后,它会在服务器停机时抛出异常。它没有重新连接。

不重启JMS服务器完全没问题,我使用的是weblogic 10.x。

是不是JMS配置的问题?

谢谢

【问题讨论】:

标签: java spring jms weblogic reconnect


【解决方案1】:

你能发布你的代码你是如何发送消息的吗?

如果您尝试在 JMS 服务器关闭时发送消息,您可能会遇到异常,并且必须处理该异常。当您下次尝试发送消息时,当 JMS 服务器重新启动并运行时,您可能会从连接工厂创建一个新连接。然后将发生重新连接:

// Let's say, you inject CF and Dest.
@Resource(lookup = "jms/ConnectionFactory")
private static ConnectionFactory cf;

@Resource(lookup = "jms/MyQueue")
private static Destination dest;

public void sendMessage(){ // called every time you need to send a message.
   try{
     Connection con = cf.createConnection(); // will reconnect, otherwise pooled.
     Session sess = con.createSession(false,Session.AUTO_ACKNOWLEDGE);
     MessageProducer prod = sess.createProducer(dest);
     Message msg = sess.createTextMessage("Hello, World");
     prod.send(msg);
     sess.close();
     con.close();
   }catch(Exception e){
     // handle errors 
   }
}

但是,Weblogic JMS 中有一些内置的故障转移/重新连接功能,请查看此页面:

Oracle code listing and documentation about reconnecting JMS producers

【讨论】:

  • 我有 4 个 jms 服务器,我的应用程序将它们用作循环发送。在另一台机器中,还有另外 4 个。因此,如果我的机器出现故障,它会切换另一个。在失败的情况下,它将尝试所有 8 个 jms 服务器发送消息。但问题是,例如,我正在关闭我的第一台机器,然后它运行第二台机器,然后我打开我的第一台机器并关闭第二台机器,但即使它是打开的,它也会给出异常。那么有没有办法知道,在发送之前我的服务器当时还可以吗?
  • 每次需要发送消息时都创建新连接是不好的做法。
  • 嗯.. 不是真的。当您需要发送另一条消息时关闭连接并再次打开它们是您处理此处所述问题的唯一方法:服务器重新启动时重新连接。那就是 - 除非您在 catch 语句中重新连接登录,但这很混乱。这个想法是将“重用”部分委托给 JEE 应用服务器或池/缓存连接工厂。周围有一些,比如 Spring CachingConnectionFactory。甚至 spring JmsTemplate 也会为每条消息创建一个新的连接+会话以应对重新连接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-25
  • 2015-06-07
  • 2015-02-02
  • 2015-07-21
  • 1970-01-01
  • 2012-11-10
  • 2014-02-02
相关资源
最近更新 更多