现在我设法让地址自动删除(基于这个问题),我无法弄清楚是什么阻止了我的生产者重新创建地址。
当没有生产者将数据推送到特定地址时,我需要它来自动删除。现在,当最后一个消费者断开连接时,地址被删除,生产者不会重新创建地址。
下面是生产者代码。这只是一个简单的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编程来做到这一点,使用类似于我的另一个问题,在那里我阅读了可用的地址,并删除那些不再相关的地址。
目前,使用设置长延迟
共1个答案
匿名用户
我相信这是一个目前没有涵盖的边缘案例。
当您创建一个命名生产者(例如使用javax. jms.Session.createProducer(目标)
)或使用匿名生产者向目标发送消息(例如使用javax.jms.MessageProducer.send(目标,消息)
)时,客户端会检查目标是否存在。如果目标不存在,那么如果正确的自动创建设置为true
,客户端将创建它。然后客户端缓存此信息,这样它就不必在每次向有问题的目标发送消息时都进行检查,因为每次检查都会非常耗时。当然,不检查意味着目的地可能会消失,客户端不会知道。
当您重新启动应用程序并再次创建生产者时,地址会重新创建。
不清楚为什么当没有生产者主动向其推送消息时,您需要删除地址。一般来说,我会说您的用例不适合自动删除。自动删除实际上是为涉及一次性或短暂目的地的用例设计的。内存中的地址定义消耗很少的资源,所以一般来说,保留它是可以的。我建议您禁用自动删除(默认情况下)以暂时缓解此问题。
相关问题
- Android:在模块jefied-play-services-测量和jefied-play-services-测量-impl中发现重复类
- 在Hashmap中查找匹配的键/值对
- 如何迭代Hashmap并与同一Hashmap中的其他键进行组合以比较它们的对象
- HashCode-如果相等的对象碰巧在同一个桶中散列会发生什么?
- 如何防止对数组中类对象的重复引用?
- 如何以及何时在HashMap中完成重新散列
- 在hashmap或hashtable中重新散列的成本
- HashMap如何识别内部数组中的哪些位置包含元素?
- 当HashMap增加其大小时,HashMap中值的索引会发生什么?
- @BeforeClass在ktor测试类中不工作
- Jest vanilla JavaScript JSDOM刷新失败,切换beforeAll到before每一个后的第二次测试中断
- 在笑话中,定义全局变量是否与在BeforeAll中定义相同?
- 静态编程语言中@BeforeAll的正确解决方法是什么
- 线程“main”java. lang.NoClassDefFoundError中的异常:在Intellij[Spring boot]中
- 线程“main”java. lang.NoClassDefFoundError中的异常:org/apache/log4j/ProvisionNode
- 异步管道会自动取消订阅可观察,如果我改变可观察?
- 异步管道是否从服务中定义并从组件变量指向的可观察对象取消订阅?
- 结合主体时不更新在模板中的异步管道可观察
- 组件中的Angular 2重复订阅
- AngularJS-$销毁是否删除事件侦听器?