代码之家  ›  专栏  ›  技术社区  ›  Ittai

如何使用jms.Connection.setExceptionListner释放资源并重新连接?

  •  1
  • Ittai  · 技术社区  · 15 年前


    假设我有一个 Connection 每JVM(作为单例实现)作为文档的派生,建议使用一个 连接

    从文件中:

    ... 连接是相对的 重量级物体。大多数客户都会 通常创建一个连接,一个或 更多的会话,以及一些消息

    我在决定怎么处理我的 Sessions , Producers 和 Consumers ExceptionListener 那是在 连接 水平。
    据我所知,它们不再可用是非常合理的 JMSException 被抛出,但我不确定一旦触发上述侦听器,应该怎么做。
    会议 保存在 ThreadLocal<Session> 它也保存在一个单独的单元中。
    MySessionSingleton.closeSession() 但这只会关闭 Session 它绑定到引发异常的线程,而不是所有其他线程

    我看到有一个可能的解决方案,我不愿意模仿,那就是为每个Producer\Consumer建立一个连接和一个会话,这样我就可以控制上面的所有内容。


    伊泰

    会议
    这种联系是那个决定的衍生。

    2 回复  |  直到 15 年前
        1
  •  0
  •   mjn anonym    15 年前

    另外,可以将全局标志设置为消息处理程序循环等的信号。

        2
  •  0
  •   Martijn Verburg    15 年前

    i、 e.使用ConnectionFactory来获得连接,并创建会话以及用户和生产者。

    public void notify(String errorOccurrence)
    {
        Connection connection = null;
    
        try
        {
            connection = connectionFactory.createConnection();
    
            Session session = connection.createSession(true, 
                              javax.jms.Session.AUTO_ACKNOWLEDGE);
    
            TextMessage message = session.createTextMessage(errorOccurrence);
    
            MessageProducer messageProducer = 
                                session.createProducer(errorOccurrenceChannel);
    
            messageProducer.send(message);
        }
        catch (JMSException e)
        {
            handleJmsExcption(e);
        }
        finally
        {
            if (connection != null)
            {
                try
                {
                    connection.close();
                }
                catch (JMSException e)
                {
                    handleJmsExcption(e);
                }
            }
        }
    }