我们在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>
答案 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.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>