我的应用程序使用嵌入了 TomEE Plus-8.0.0-M1 的 ActiveMQ。
无论是使用 resources.xml 明确定义的 javax.jms.ConnectionFactory 还是让 TomEE 动态生成一个,池连接用完的行为都是相同的。
连接超时的不同设置似乎没有效果:
connectionMaxIdleTime = 3 seconds
connectionMaxIdleTime = 15 minutes
如果 ExampleSessionBean.sendMessage() 被连续调用 11 次,Abandoned Connection 警告将记录在消息 1-10 上。在消息 #11 上,抛出 JMSRuntimeException: No Managed Connections Available。
然后,如果我等待几分钟,JMSContext 生产者就可以再次发送。
我的第一个想法是 JMSContext 中的底层连接需要关闭
jmsContext.close();
“如果 JMSContext 是容器管理(注入),则不得使用此方法。”
这里需要哪些程序或配置更改?
谢谢你,泰德小号
资源.xml
<?xml version="1.0" encoding="UTF-8"?>
<resources>
<Resource id="jmsConnectionFactory" type="javax.jms.ConnectionFactory">
connectionMaxIdleTime = 3 seconds
connectionMaxWaitTime = 5 seconds
poolMaxSize = 10
poolMinSize = 0
resourceAdapter = Default JMS Resource Adapter
transactionSupport = xa
</Resource>
</resources>
ExampleSessionBean.java
@Named
@LocalBean
@Stateless
public class ExampleSessionBean
{
@Resource(name = "jms/localNotificationQueue")
private Queue _localNotificationQueue;
@Inject
@JMSConnectionFactory("jmsConnectionFactory")
private JMSContext _jmsContext;
public void sendMessage(String message)
{
try
{
TextMessage textMessage =
_jmsContext.createTextMessage(message);
_jmsContext.createProducer().
setDeliveryMode(DeliveryMode.PERSISTENT).
send(_localNotificationQueue, textMessage);
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
警告 - 消息 1-10:(请原谅格式化。由于某种原因,SE 格式化程序不会格式化此文本块)
开始警告文本
警告:事务完成,但连接仍有关联的句柄:ManagedConnectionInfo: ... org.apache.openejb.resource.activemq.jms2.cdi.JMS2CDIExtension$InternalJMSContext.createProducer(JMS2CDIExtension.java:370), com.myorg.jms。 ExampleSessionBean.sendMessage(ExampleSessionBean.java:46),
...
结束警告文本
消息 #11 异常
javax.jms.JMSRuntimeException: No ManagedConnections available within configured blocking timeout ( 5000 [ms] ) for pool org.apache.geronimo.connector.outbound.SinglePoolConnectionInterceptor@12aff7fa
at org.apache.openejb.resource.activemq.jms2.JMS2.toRuntimeException(JMS2.java:83)
at org.apache.openejb.resource.activemq.jms2.JMSContextImpl.connection(JMSContextImpl.java:85)
at org.apache.openejb.resource.activemq.jms2.JMSContextImpl.session(JMSContextImpl.java:102)
at org.apache.openejb.resource.activemq.jms2.JMSContextImpl.getInnerProducer(JMSContextImpl.java:124)
at org.apache.openejb.resource.activemq.jms2.JMSContextImpl.createProducer(JMSContextImpl.java:302)
at org.apache.openejb.resource.activemq.jms2.cdi.JMS2CDIExtension$InternalJMSContext.createProducer(JMS2CDIExtension.java:370)
at com.myorg.jms.ExampleSessionBean.sendMessage(ExampleSessionBean.java:46)
...
更新:此行为已被复制并添加到TomEE 问题跟踪器中。