TomEE Embedded ActiveMQ с использованием JMSContext: ManagedConnections недоступны в течение настроенного времени блокировки (5000 [мс]) - PullRequest
1 голос
/ 24 марта 2019

Мое приложение использует 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 .

1 Ответ

0 голосов
/ 25 марта 2019

Я отказался от JMSContext и вернулся к ручному управлению соединением. Все функции, как ожидается, даже при загрузке с сотнями сообщений.

ExampleSessionBean.java

@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) {}
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...