TomEE Embedded ActiveMQ使用JMSContext:配置的阻塞超时内没有ManagedConnections(5000 [ms])

问题描述 投票:1回答:1

我的应用程序使用嵌入了TomEE Plus-8.0.0-M1的ActiveMQ。

无论使用resources.xml显式定义的javax.jms.ConnectionFactory还是让TomEE动态生成一个连接,用完池连接的行为都是相同的。

连接超时的不同设置似乎没有效果:

connectionMaxIdleTime = 3 seconds
connectionMaxIdleTime = 15 minutes

如果按顺序调用ExampleSessionBean.sendMessage()11次,则会在消息1-10上记录Abandoned Connection警告。在消息#11上,抛出JMSRuntimeException:No Managed Connections Available。

然后,如果我等待几分钟,JMSContext生成器就能再次发送。

我的第一个想法是JMSContext中的底层连接需要关闭

jmsContext.close();

但是来自Interface JMSContext

“如果JMSContext是容器管理的(注入),则不得使用此方法。”

这需要哪些程序或配置更改?

谢谢Ted 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>

example session bean.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 issues tracker

java jms activemq tomee-8 jmscontext
1个回答
0
投票

我放弃了JMSContext并回到手动管理连接。即使在加载100条消息时,所有功能都按预期运行。

example session bean.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) {}
            }
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.