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

HornetQ每个连接只允许一个会话

  •  0
  • user1556622  · 技术社区  · 11 年前

    我正在使用 HornetQ 在具有MDB的分布式事务环境中。我从JMS文档中了解到,我们不应该频繁地创建连接实例,而是应该在需要时重用连接并创建JMS会话。所以我编写了一个代码,创建JMS连接,然后重用它。但是在重用JMS连接对象时,我遇到了以下异常。

    无法创建会话:每个连接只允许一个会话。 参见J2EE规范,例如J2EE1.4第6.6节

    我读过一些关于这方面的博客,但它们都是针对seam框架的。

    这是我的代码

    public class DefaultService implements IMessageService {
      private static final long serialVersionUID = 1L;
      private static final Logger logger = LogManager.getLogger(DefaultService.class);
      private static final String connectionFactoryJndiName = "java:/JmsXA";
      private static volatile Connection connection = null;
      private Session session = null;
    
      @Override
      public void sendMessage(String destinationStr, Serializable object) {
          try {
    
              Destination destination = jmsServiceLocator.getDestination(destinationStr);
              ObjectMessage message = session.createObjectMessage();
              message.setObject(object);
              MessageProducer messageProducer = session.createProducer(destination);
              messageProducer.send(destination, message);
              messageProducer.close();
              logger.trace("Sent JMS Messagae for: " + object.getClass().getName());
          }
          catch (NamingException e) {
              throw new RuntimeException("Couldn't send jms message", e);
          }
          catch (JMSException e) {
              throw new RuntimeException("Couldn't send jms message", e);
          }
      }
    
      @Override
      public void close() {
          try {
              if (session != null) {
                  session.close();
              }
          }
          catch (Exception e) {
              logger.error("Couldn't close session", e);
          }        
      }
    
    
    }
    

    我正在使用 JBoss EAP 6 .

    我错过了这里的任何设置吗?

    1 回复  |  直到 10 年前
        1
  •  2
  •   Clebert Suconic    11 年前

    在JCA连接(即使用PooledConnectionFactory的连接)上,您应该只为每个连接创建一个会话。这是EE规范的一部分。(一直如此)。

    这是因为这些连接是共享的,如果每个连接使用多个会话,则不可能将它们放回池中。

    如果您切换到非池连接工厂(用于远程客户端的连接工厂),您将使其按您希望的方式工作,但您将错过来自应用程序服务器的池。EE组件通常寿命很短,打开/关闭JMS连接(更准确地说是任何连接)是一项昂贵的操作。