现在我设法让地址自动删除(基于这个问题),我无法弄清楚是什么阻止了我的生产者重新创建地址。
当没有生产者将数据推送到特定地址时,我需要它来自动删除。现在,当最后一个消费者断开连接时,地址被删除,生产者不会重新创建地址。
下面是生产者代码。这只是一个简单的Java函数,它从XML消息中读取一个值并将其用作地址名称。它基本上是根据XML消息本身中的名称将消息排序为不同的主题:
/////////////////////////////////////
//Constructor to establish connection
/////////////////////////////////////
public ActiveMQ(String amq_url) throws JMSException, NamingException{
jndi_env = new Hashtable<String, Object>();
jndi_env.put(InitialContext.INITIAL_CONTEXT_FACTORY, "org.apache.activemq.artemis.jndi.ActiveMQInitialContextFactory");
jndi_env.put(InitialContext.PROVIDER_URL, amq_url);
ic = new InitialContext(jndi_env);
connectionFactory = (ConnectionFactory) ic.lookup("ConnectionFactory");
this.connection = (ActiveMQConnection) connectionFactory.createConnection();
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
}
/////////////////////////////////////
//Switch address to publish to
/////////////////////////////////////
public void useAddress(String addressName) throws JMSException, NamingException{
if (producer != null) producer.close();
this.address= (Destination) ic.lookup("dynamicTopics/"+addressName);
this.producer = session.createProducer(address);
}
让这行代码再次创建地址的唯一方法是重新启动生产者程序或Artemis服务器。我已经尝试过让逻辑完全关闭所有内容并重新打开它(会话、连接等),但这并没有修复它。这里有我缺少的设置吗?我在留档中找不到任何东西来说明为什么生产者没有重新创建地址。任何帮助都将不胜感激!
broc. xml
(与其他问题相同):
<address-setting match="#">
<dead-letter-address>DLQ</dead-letter-address>
<expiry-address></expiry-address>
<redelivery-delay>0</redelivery-delay>
<expiry-delay>10</expiry-delay>
<max-size-bytes>-1</max-size-bytes>
<max-size-messages>-1</max-size-messages>
<message-counter-history-day-limit>10</message-counter-history-day-limit>
<address-full-policy>PAGE</address-full-policy>
<auto-create-queues>true</auto-create-queues>
<auto-create-addresses>true</auto-create-addresses>
<auto-delete-queues>true</auto-delete-queues>
<auto-delete-addresses>true</auto-delete-addresses>
<auto-delete-created-queues>true</auto-delete-created-queues>
<auto-delete-queues-message-count>-1</auto-delete-queues-message-count>
</address-setting>
编辑:所以真的没有一个简单的方法可以单独在阿尔特弥斯中进行设置。根据贾斯汀下面的回答,我认为我需要的最好的解决方案是关闭自动删除设置,并通过java编程来做到这一点,使用类似于我的另一个问题,在那里我阅读了可用的地址,并删除那些不再相关的地址。
目前,使用设置长延迟
我相信这是一个目前没有涵盖的边缘案例。
当您创建一个命名生产者(例如使用javax. jms.Session.createProducer(目标)
)或使用匿名生产者向目标发送消息(例如使用javax.jms.MessageProducer.send(目标,消息)
)时,客户端会检查目标是否存在。如果目标不存在,那么如果正确的自动创建设置为true
,客户端将创建它。然后客户端缓存此信息,这样它就不必在每次向有问题的目标发送消息时都进行检查,因为每次检查都会非常耗时。当然,不检查意味着目的地可能会消失,客户端不会知道。
当您重新启动应用程序并再次创建生产者时,地址会重新创建。
不清楚为什么当没有生产者主动向其推送消息时,您需要删除地址。一般来说,我会说您的用例不适合自动删除。自动删除实际上是为涉及一次性或短暂目的地的用例设计的。内存中的地址定义消耗很少的资源,所以一般来说,保留它是可以的。我建议您禁用自动删除(默认情况下)以暂时缓解此问题。