始终只确保ActiveMQ主题中的最后10条消息

时间:2010-02-08 10:16:29

标签: java jms messaging activemq

我们在ActiveMQ中遇到一个问题,即我们有大量的消息没有放弃主题。 主题设置为非持久性,非持久性。 我们的Activemq.xml文件是

<beans>

  <broker xmlns="http://activemq.apache.org/schema/core" useJmx="false" persistent="false">

<!--
    <persistenceAdapter>
      <journaledJDBC journalLogFiles="5" dataDirectory="../data"/>
    </persistenceAdapter>
-->

        <transportConnectors>
            <transportConnector uri="vm://localhost"/>
        </transportConnectors>

  </broker>

</beans>

我们在messaging-config.xml中的主题定义是

<destination id="traceChannel">

    <properties>

        <network>
        <session-timeout>10</session-timeout>
    </network>

        <server>
            <message-time-to-live>10000</message-time-to-live>
            <durable>false</durable>
            <durable-store-manager>flex.messaging.durability.FileStoreManager</durable-store-manager>
        </server>

        <jms>
            <destination-type>Topic</destination-type>
            <message-type>javax.jms.ObjectMessage</message-type>
            <connection-factory>ConnectionFactory</connection-factory>
            <destination-jndi-name>dynamicTopics/traceTopic</destination-jndi-name>
            <delivery-mode>NON_PERSISTENT</delivery-mode>
            <message-priority>DEFAULT_PRIORITY</message-priority>
            <acknowledge-mode>AUTO_ACKNOWLEDGE</acknowledge-mode>
            <transacted-sessions>false</transacted-sessions>
            <initial-context-environment>
                <property>
                    <name>Context.INITIAL_CONTEXT_FACTORY</name>
                    <value>org.apache.activemq.jndi.ActiveMQInitialContextFactory</value>
                </property>
                <property>
                    <name>Context.PROVIDER_URL</name>
                    <value>tcp://localhost:61616</value>
                </property>
            </initial-context-environment>
        </jms>
    </properties>

    <channels>
        <channel ref="rtmps" />
    </channels>

    <adapter ref="trace" />

</destination>

我想要实现的是,在任何时候只有最后10条消息在主题上,因为让它在一夜之间运行会导致超过150K的主题消息,即使它只能保持一个非常小的数字。 / p>

4 个答案:

答案 0 :(得分:4)

据我所知,应该删除发送到没有订阅者的非持久主题的消息。只有当前注册的消费者才能收到消息副本。

如何检查该主题是否包含这些150K消息?通过JMX?

无论您的非持久主题不应缓存这些150K消息,您可以使用代理策略限制每个消费者存储的消息量:

<broker>
...    
  <pendingMessageLimitStrategy>
    <constantPendingMessageLimitStrategy limit="10"/>
  </pendingMessageLimitStrategy>
...
</broker>

答案 1 :(得分:1)

我不确定你想要的东西可以归档。 你可以做几件事:

首先,您可以花点时间了解您的消息:

public ITopicPublisher CreateTopicPublisher(string selector)
        {
            try
            {
                IMessageProducer producer = m_session.CreateProducer(m_topic);
                ActiveMQPublisher publisher = new ActiveMQPublisher(producer);

                // here we put a time to live to 1min for eg
                TimeSpan messageTTL = TimeSpan.FromMilliseconds(60000);
                publisher.TimeToLive = messageTTL;

                if (!String.IsNullOrEmpty(selector))
                {
                    publisher.IsSelector = true;
                    publisher.Selector = selector;
                }
                return publisher;
            }
            catch (Exception ex)
            {
                Logger.Exception(ex);
                throw;
            }
        }

您仍然会在早上收到150k消息,但只要有一位消费者连接到您的主题,过期消息就会消失。

您可能还想查看驱逐策略(Eviction Strategy

编辑:我刚刚意识到一件事。你说“让它在一夜之间运行会产生超过150K的主题信息,即使它只能保持一个非常小的数字。”在主题中,您没有必须拾取的消息概念。如果没有人订阅主题,则发送的消息将被丢弃。 “加入的消息”仍然会增加一个。 如果您只想发送“最后10条消息”,也许您应该使用队列而不是主题?

答案 2 :(得分:1)

不知道它是否有效,还没有机会测试它,但请在这里查看constantPendingMessageLimitStrategy http://activemq.apache.org/slow-consumer-handling.html

祝你好运 克劳迪奥

答案 3 :(得分:0)

从这篇文章来看,事情并不那么清楚

  • 基于我的解析和努力尝试添加此...它需要更多的上下文,所以我在下面添加了它,以便那些可能不想通过ActiveMQ谷歌斗争的人..
  • 这是我 activemq.xml 中的内容,而我根本没有看到这项工作,所以我希望能从其他人那里得到一些见解能指出我正确的方向。

    <destinationPolicy>
      <policyMap>
        <policyEntries>
          <policyEntry topic=">"
                       topicPrefetch="10"/>
          <policyEntry topic=">"
                       producerFlowControl="false"/>
          <policyEntry topic=".>"
                       >
            <messageEvictionStrategy>
              <oldestMessageEvictionStrategy/>
            </messageEvictionStrategy>
    
            <pendingMessageLimitStrategy>
              <constantPendingMessageLimitStrategy limit="10"/>
            </pendingMessageLimitStrategy>
          </policyEntry>
        </policyEntries>
      </policyMap>
    </destinationPolicy>