Java 使用JMSContext查看嵌入式ActiveMQ:在配置的阻塞超时(5000[ms])内没有可用的ManagedConnections
我的应用程序正在使用嵌入TomEE Plus-8.0.0-M1的ActiveMQ 无论使用resources.xml使用显式定义的javax.jms.ConnectionFactory,还是让TomEE动态生成连接,池连接耗尽的行为都是相同的 不同的连接超时设置似乎没有效果:Java 使用JMSContext查看嵌入式ActiveMQ:在配置的阻塞超时(5000[ms])内没有可用的ManagedConnections,java,jms,activemq,tomee-8,jmscontext,Java,Jms,Activemq,Tomee 8,Jmscontext,我的应用程序正在使用嵌入TomEE Plus-8.0.0-M1的ActiveMQ 无论使用resources.xml使用显式定义的javax.jms.ConnectionFactory,还是让TomEE动态生成连接,池连接耗尽的行为都是相同的 不同的连接超时设置似乎没有效果: connectionMaxIdleTime = 3 seconds connectionMaxIdleTime = 15 minutes 如果按顺序调用ExampleSessionBean.sendMessage()11
connectionMaxIdleTime = 3 seconds
connectionMaxIdleTime = 15 minutes
如果按顺序调用ExampleSessionBean.sendMessage()11次,则会在消息1-10中记录放弃的连接警告。在消息#11上,抛出JMSRuntimeException:没有可用的托管连接
然后,如果我等待几分钟,JMSContext生产者可以再次发送
我的第一个想法是JMSContext中的底层连接需要用
jmsContext.close();
但是从
“如果JMSContext是容器管理(注入)的,则不得使用此方法。”
此处需要进行哪些编程或配置更改
谢谢,,
泰德S
resources.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>
警告-消息1-10:(请原谅格式化。SE formatter由于某些原因不会格式化此文本块)
开始警告文本
警告:事务已完成,
但连接仍有关联的句柄: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)
...
更新:此行为已被复制并添加到。我放弃了JMSContext并返回手动管理连接。即使在加载100秒的消息时,所有功能也与预期一致 示例SessionBean.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();
}
}
}
@Named
@LocalBean
@Stateless
public class ExampleSessionBean
{
@Resource(name = "jms/localNotificationQueue")
private Queue _localNotificationQueue;
@Resource(mappedName = "jmsConnectionFactory")
private ConnectionFactory _connectionFactory;
public void sendMessage(String message)
{
Connection connection = null;
Session session = null;
MessageProducer messageProducer = null;
try
{
connection =
_connectionFactory.createConnection();
connection.start();
session =
connection.createSession();
messageProducer =
session.createProducer(null);
messageProducer.setDeliveryMode(DeliveryMode.PERSISTENT);
TextMessage textMessage = session.createTextMessage(message);
messageProducer.send(_localNotificationQueue,
textMessage);
}
catch (Exception e)
{
// TODO Handle exception
}
finally
{
if (connection != null)
{
try
{
connection.close();
}
catch (JMSException e) {}
}
}
}
}
我修复了多个分支中的一系列错误:)