如何配置spring以正确关闭ActiveMQ会话或连接?

时间:2019-07-02 10:09:01

标签: java spring activemq

ActiveMQ Producer

一个Java生产者使用spring连接池来管理100个MQ连接。默认情况下,每个MQ连接可以打开500个会话。

产生50000条消息后,将使用所有连接和会话。

  • 从spring连接池中获取新连接(首先从该池中获取连接,然后创建一个新会话)会非常慢。
  • 关闭连接将需要很长时间。
  • ActiveMQ服务器将使用大量内存。

我想知道:

  • 如何删除或重用连接创建的会话?
  • 何时关闭MQ连接?

我尝试了以下参数:idleTimeout + expiryTimeout + timeBetweenExpirationCheckMillis,但是:

  • 系统很长时间很忙时。整个系统将越来越慢。 ActiveMQ将使用越来越多的内存。
  • 当系统非常繁忙时,然后突然变得空闲,然后突然变得非常忙。 timeBetweenExpirationCheckMillis不够快,无法关闭所有连接。连接池将尝试关闭所有超时连接(idleTimeout或expiryTimeout),然后打开一个新连接。整个系统将停留10-20分钟。

我试图禁用kahadb持久性,但不起作用。

更新1:ActiveMQ连接池配置

<bean id="targetConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
  <property name="brokerURL" value="failover:(tcp://activemq:61616)" />
</bean>

<bean id="connectionFactory" class="org.apache.activemq.pool.PooledConnectionFactory">
  <property name="connectionFactory" ref="targetConnectionFactory" />
  <property name="maxConnections" value="100" />
  <property name="idleTimeout" value="30000" />
  <property name="expiryTimeout" value="60000" />
  <property name="maximumActiveSessionPerConnection" value="500" />
  <property name="timeBetweenExpirationCheckMillis" value="30000" />
</bean>

<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
    <property name="connectionFactory" ref="connectionFactory"/>
    <property name="receiveTimeout" value="10000"/>
</bean>

更新2:测试代码

package just.a.test;

import javax.jms.Destination;
import net.sf.json.JSONObject;
import org.springframework.jms.core.JmsTemplate;

@Component
public final class TestHandlerImpl{

    @Autowired
    private JmsTemplate jmsTemplate;

    @Autowired
    private Destination testQueue;

    public void sendMessage(File binaryFile){
            //read file, get one msg
            JSONObject msg = processBinaryFile(binaryFile);

            //send msg to queue
            sendMessageToQueue(testQueue, msg.toString());
        }
    }

    protected void sendMessageToQueue(Destination destination, final String msg) {
        //this code will get one connection from pool
        //create a new session
        //and send the message
        jmsTemplate.send(destination, new MessageCreator() {
            public Message createMessage(Session session) throws JMSException {
                return session.createTextMessage(msg);
            }
        });
    }
}

Update3:

现在,我必须修改activemq-all.jar和common-pool.jar以使整个系统稳定。 我认为这是不对的。

0 个答案:

没有答案