ActiveMQTextMessages从主题中使用后将保留在内存中

时间:2018-07-11 13:23:04

标签: memory activemq messages

所以我有问题。我在具有主题的应用程序中运行嵌入式apache.activemq.broker。我有一个生产者,它向该主题发送小消息,而消费者则消费它们。 问题在于,应用程序的内存占用量会不断增长,直到几天后会占用数GB的内存。我使用JProfiler进行了内存分析,并注意到很多ActiveMQTextMessage类型的实例都保留在内存中。 这就是我设置经纪人的方式

        BrokerService brokerService = new BrokerService();
        brokerService.setUseJmx(false);
        brokerService.setUseLocalHostBrokerName(false);
        brokerService.addConnector(tenantConfiguration.getConnectionString());
        brokerService.setBrokerName(tenantConfiguration.getBrokerComponentIdentifier());
        brokerService.setPersistenceAdapter(persistenceAdapterFromConnectionString);

        SystemUsage systemUsage = new SystemUsage();
        brokerService.setSystemUsage(systemUsage);
        brokerService.setDestinationPolicy(createDestinationPolicyForBrokerService());

这是我设置目标政策的方式

private PolicyMap createDestinationPolicyForBrokerService() {
    PolicyMap policyMap = new PolicyMap();

    List<PolicyEntry> policyEntries = new ArrayList<>();

    ConstantPendingMessageLimitStrategy constantPendingMessageLimitStrategy = new ConstantPendingMessageLimitStrategy();
    constantPendingMessageLimitStrategy.setLimit(10);

    PolicyEntry queuePolicyEntry = new PolicyEntry();
    queuePolicyEntry.setPrioritizedMessages(true);
    queuePolicyEntry.setGcInactiveDestinations(true);
    queuePolicyEntry.setInactiveTimoutBeforeGC(86400);
    queuePolicyEntry.setQueue(">");
    queuePolicyEntry.setPendingMessageLimitStrategy(constantPendingMessageLimitStrategy);

    PolicyEntry topicPolicyEntry = new PolicyEntry();
    topicPolicyEntry.setTopic(">");
    topicPolicyEntry.setGcInactiveDestinations(true);
    topicPolicyEntry.setInactiveTimoutBeforeGC(5000);
    topicPolicyEntry.setPendingMessageLimitStrategy(constantPendingMessageLimitStrategy);
    topicPolicyEntry.setUseCache(false);

    policyEntries.add(queuePolicyEntry);
    policyEntries.add(topicPolicyEntry);

    policyMap.setPolicyEntries(policyEntries);
    return policyMap;
}

这是邮件传出引用之一的屏幕截图 Message

这是我单击“显示GC根目录的路径”时的图像 Gc root

编辑: 这是我设置DurableConsumer

的方法
private NMSConnectionFactory _connnectionFactory;
private IConnection _connection;
private ISession _session;

 public void Start()
        {
            _connection = _connnectionFactory.CreateConnection(queueUser, queuePwd);
            _connection.Start();
            _session = _connection.CreateSession(AcknowledgementMode.AutoAcknowledge);
            if (!string.IsNullOrEmpty(TopicName))
            {
                   _topicConsumer = _session.CreateDurableConsumer(SessionUtil.GetTopic(_session, TopicName), ConsumerName, null, false);
                _topicConsumer.Listener += TopicConsumerOnListener;
            }
        }

这就是我们如何将消息发布到主题

 public void PublishMessage(string message)
    {
        using (var connection = _connnectionFactory.CreateConnection(user, pwd))
        {
            try
            {
                connection.Start();
                ActiveMQTopic topic = new ActiveMQTopic(TopicName);
                using (var session = connection.CreateSession())
                using (var producer = session.CreateProducer(topic))
                {
                    var textMessage = producer.CreateTextMessage(message);
                    producer.Send(textMessage);
                }
            }
            catch (Exception exception)
            {
                Console.WriteLine(exception);
            }
        }
    }

有人知道为什么消费完邮件后为什么不删除邮件吗?

谢谢

1 个答案:

答案 0 :(得分:0)

通过将我自己的clientId添加到主题连接中解决了该问题

_connection = _connnectionFactory.CreateConnection(queueUser, queuePwd);
_connection.ClientId = "MY CLIENT ID";
_connection.Start();

这样,重新启动时就不会创建新的使用者行。