我遇到了OutOfMemoryError异常,我想我已经追溯到应用程序正在创建新的TopicConnections并重复关闭它们这一事实。
我要么需要一些有效的代码来缓存这些连接(最好不要重新发明轮子)或者更好,但我希望能够配置org.apache.activemq.jndi.ActiveMQInitialContextFactory
来提供org.apache.activemq.pool.AmqJNDIPooledConnectionFactory
而不是默认org.apache.activemq.ActiveMQConnectionFactory
。 (或以其他方式得到类似的结果)
目前,通过以下方式检索连接工厂:
Properties props = connProps;
if (connProps == null)
{
try
{
props = new Properties();
props = PropertiesUtility.loadResource("jms.properties");
}
catch (IOException e)
{
props = null;
}
}
// set up the connection and session
Context ctx = new InitialContext(props);
TopicConnectionFactory cf = (TopicConnectionFactory) ctx.lookup("ConnectionFactory");
和连接和会话创建如下:
myConnection = cf.createTopicConnection();
myConnection.start();
mySession = myConnection.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);
我找到了https://community.jboss.org/wiki/ShouldICacheJMSConnectionsAndJMSSessions,但我推测是因为我们使用自定义属性文件来定义我们的主题,当我尝试提取javax.naming.NameNotFoundException: JmsXA not bound
jndi资源时,我得到java:/JmsXA
。 / p>
jms.properties:
java.naming.factory.initial = org.apache.activemq.jndi.ActiveMQInitialContextFactory
java.naming.provider.url = tcp://localhost:61616
topic.topic1 = topic1
topic.topic2 = topic2
topic.topic3 = topic3
topic.topic4 = topic4
总而言之,我需要实现池化,但是因为我还没弄明白如何获得池连接工厂的实例而陷入困境。我可以自己做,但更愿意避免重新发明轮子(并在此过程中解决错误)。
另外 - 如果可能的话,最好将我的java类从底层的ActiveMQ类中抽象出来。
其他环境信息: 我们正在使用在JDK6下运行的JBoss AS 6.0.0,并按照以下说明替换(并完全删除)HornetQ的内置副本和ActiveMQ:http://activemq.apache.org/jboss-integration.html