提问者:小点点

一旦自动删除,生产者程序将不会在Artemis中重新创建地址


现在我设法让地址自动删除(基于这个问题),我无法弄清楚是什么阻止了我的生产者重新创建地址。

当没有生产者将数据推送到特定地址时,我需要它来自动删除。现在,当最后一个消费者断开连接时,地址被删除,生产者不会重新创建地址。

下面是生产者代码。这只是一个简单的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,客户端将创建它。然后客户端缓存此信息,这样它就不必在每次向有问题的目标发送消息时都进行检查,因为每次检查都会非常耗时。当然,不检查意味着目的地可能会消失,客户端不会知道。

当您重新启动应用程序并再次创建生产者时,地址会重新创建。

不清楚为什么当没有生产者主动向其推送消息时,您需要删除地址。一般来说,我会说您的用例不适合自动删除。自动删除实际上是为涉及一次性或短暂目的地的用例设计的。内存中的地址定义消耗很少的资源,所以一般来说,保留它是可以的。我建议您禁用自动删除(默认情况下)以暂时缓解此问题。