Мое приложение использует ActiveMQ, встроенный в TomEE Plus-8.0.0-M1.
Поведение исчерпанных пулов соединений одинаково, независимо от использования явно определенного javax.jms.ConnectionFactory с использованием ресурсов.xml или позволить TomEE сгенерировать его на лету.
Различные настройки времени ожидания соединения, похоже, не действуют:
connectionMaxIdleTime = 3 seconds
connectionMaxIdleTime = 15 minutes
Если ExampleSessionBean.sendMessage () вызывается 11 раз последовательно, Сообщения об отказе от подключения регистрируются в сообщениях 1-10.В сообщении № 11 выдается исключение JMSRuntimeException: нет доступных управляемых соединений.
Затем, если я подожду несколько минут, производитель JMSContext сможет отправить снова.
Моей первой мыслью было, чтобазовое соединение в JMSContext необходимо было закрыть с помощью
jmsContext.close();
, но с Интерфейс JMSContext
"Этот метод нельзя использовать, если JMSContext управляется контейнером (injected). "
Какие программные изменения или изменения конфигурации здесь необходимы?
Спасибо, Тед 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>
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 .