[
https://issues.apache.org/jira/browse/ARTEMIS-3424?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Justin Bertram resolved ARTEMIS-3424.
-------------------------------------
Resolution: Information Provided
> Unnecessary exception "ActiveMQQueueExistsException: Binding already exists
> LocalQueueBinding" when creating queue consumers
> ----------------------------------------------------------------------------------------------------------------------------
>
> Key: ARTEMIS-3424
> URL: https://issues.apache.org/jira/browse/ARTEMIS-3424
> Project: ActiveMQ Artemis
> Issue Type: Improvement
> Reporter: Endre Stølsvik
> Priority: Minor
>
> While working with embedded Artemis (employing the in-vm acceptor), I found
> these worrisome debug exceptions that consistently came up:
> {{ActiveMQQueueExistsException: AMQ229018: Binding already exists
> LocalQueueBinding [address=Test.queue...]}}
> After having scratched my head for a good while, it occurred to me to check
> on a default install of an Artemis broker on command line, after having
> adjusted the logging. And lo and behold, they also appear there.
>
> {code:java}
> 2021-08-18 17:39:22,936 DEBUG
> [org.apache.activemq.artemis.core.protocol.core.ServerSessionPacketHandler]
> Sending exception to client:
> ActiveMQQueueExistsException[errorType=QUEUE_EXISTS message=AMQ229018:
> Binding already exists LocalQueueBinding [address=Test.queue,
> queue=QueueImpl[name=Test.queue, postOffice=PostOfficeImpl
> [server=ActiveMQServerImpl::serverUUID=abc2a8cb-f37b-11eb-bfbc-60f2623f9c33],
> temp=false]@7ad901eb, filter=null, name=Test.queue,
> clusterName=Test.queueabc2a8cb-f37b-11eb-bfbc-60f2623f9c33]]
> at
> org.apache.activemq.artemis.core.postoffice.impl.SimpleAddressManager.addBinding(SimpleAddressManager.java:91)
> [artemis-server-2.17.0.jar:2.17.0]
> at
> org.apache.activemq.artemis.core.postoffice.impl.WildcardAddressManager.addBinding(WildcardAddressManager.java:95)
> [artemis-server-2.17.0.jar:2.17.0]
> at
> org.apache.activemq.artemis.core.postoffice.impl.PostOfficeImpl.addBinding(PostOfficeImpl.java:873)
> [artemis-server-2.17.0.jar:2.17.0]
> ...
> {code}
> To me, this seems like just noise of the type that makes you wonder, even
> though they are emitted on debug.
> It seems like a similar situation have been tackled earlier, in ARTEMIS-1707,
> but that was ActiveMQAddressExistsException, while this is
> ActiveMQQueueExistsException.
> Here's a class that exhibits the situation. Note that it evidently works just
> fine, both of the consumers receiving exactly half of the messages:
>
> {code:java}
> import java.util.concurrent.CountDownLatch;
> import java.util.concurrent.TimeUnit;
> import javax.jms.Connection;
> import javax.jms.Message;
> import javax.jms.MessageConsumer;
> import javax.jms.MessageProducer;
> import javax.jms.Queue;
> import javax.jms.Session;
> import javax.jms.TextMessage;
> import org.apache.activemq.artemis.api.core.QueueConfiguration;
> import org.apache.activemq.artemis.api.core.RoutingType;
> import org.apache.activemq.artemis.api.core.SimpleString;
> import org.apache.activemq.artemis.core.config.Configuration;
> import org.apache.activemq.artemis.core.config.CoreAddressConfiguration;
> import org.apache.activemq.artemis.core.config.impl.ConfigurationImpl;
> import org.apache.activemq.artemis.core.server.embedded.EmbeddedActiveMQ;
> import org.apache.activemq.artemis.core.settings.impl.AddressSettings;
> import org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory;
> public class Test_MatsTestBroker {
> // @Test
> public void test() throws Exception {
> String brokerUrl = "vm://test";
> // String brokerUrl = "tcp://localhost:61616";
> EmbeddedActiveMQ broker = brokerUrl.startsWith("vm")
> ? createArtemisBroker(brokerUrl)
> : null;
> ActiveMQConnectionFactory connectionFactory = new
> ActiveMQConnectionFactory(brokerUrl);
> Connection connection = connectionFactory.createConnection();
> int numberOfMessages = 50;
> CountDownLatch countDownLatch = new CountDownLatch(numberOfMessages);
> Thread thread1 = new Thread(() -> consumer(connection,
> countDownLatch), "EndreXY 1");
> Thread thread2 = new Thread(() -> consumer(connection,
> countDownLatch), "EndreXY 2");
> thread1.start();
> thread2.start();
> connection.start();
> Session session = connection.createSession(false,
> Session.AUTO_ACKNOWLEDGE);
> Queue queue = session.createQueue("Test.queue");
> MessageProducer producer = session.createProducer(queue);
> for (int i = 0; i < 50; i++) {
> TextMessage textMessage = session.createTextMessage("Message " +
> i);
> producer.send(textMessage);
> }
> boolean await = countDownLatch.await(10, TimeUnit.SECONDS);
> // Assert.assertTrue("Counted down correctly, received all messages",
> await);
> connection.close();
> if (broker != null) {
> broker.stop();
> }
> }
> private void consumer(Connection con, CountDownLatch countDownLatch) {
> try {
> Session session = con.createSession(false,
> Session.AUTO_ACKNOWLEDGE);
> Queue queue = session.createQueue("Test.queue");
> MessageConsumer consumer = session.createConsumer(queue);
> while (true) {
> Message msg = consumer.receive(10_000);
> countDownLatch.countDown();
> if (msg instanceof TextMessage) {
> TextMessage txtMsg = (TextMessage) msg;
> System.out.println("Received message!" +
> txtMsg.getText());
> }
> if (msg == null) {
> break;
> }
> }
> }
> catch (Exception e) {
> System.out.println("Got exception when receiving.");
> }
> }
> public static void main(String... args) throws Exception {
> System.setProperty(MatsTestBroker.SYSPROP_MATS_TEST_BROKER,
> MatsTestBroker.SYSPROP_MATS_TEST_BROKER_VALUE_ARTEMIS);
> new Test_MatsTestBroker().test();
> System.out.println("Done!");
> }
> public static EmbeddedActiveMQ createArtemisBroker(String brokerUrl) {
> Configuration config = new ConfigurationImpl();
> try {
> config.setSecurityEnabled(false);
> config.setPersistenceEnabled(false);
> config.addAcceptorConfiguration("in-vm", brokerUrl);
> // :: Configuring for separate DLQs, with pattern (which is
> default) "DLQ." as prefix.
> config.addAddressesSetting("#",
> new AddressSettings()
>
> .setDeadLetterAddress(SimpleString.toSimpleString("DLQ"))
> .setMaxDeliveryAttempts(3)
> .setAutoCreateQueues(true) // default true
> .setAutoCreateAddresses(true) // default true
> .setAutoCreateDeadLetterResources(true) //
> CHANGED! default false
>
> .setDeadLetterQueuePrefix(SimpleString.toSimpleString("DLQ.")) // default
> "DLQ."
>
> .setDeadLetterQueueSuffix(SimpleString.toSimpleString("")) // default ""
>
> .setExpiryAddress(SimpleString.toSimpleString("ExpiryQueue")));
> // :: This is just trying to emulate the default config from
> default broker.xml - inspired by Spring
> // Boot which also got problems with default config in embedded
> mode being a tad lacking.
> //
> https://github.com/spring-projects/spring-boot/pull/12680/commits/a252bb52b5106f3fec0d3b2b157507023aa04b2b
> config.addAddressConfiguration(
> new CoreAddressConfiguration()
> .setName("DLQ")
> .addRoutingType(RoutingType.ANYCAST)
> .addQueueConfiguration(new
> QueueConfiguration("DLQ")
> .setRoutingType(RoutingType.ANYCAST)));
> config.addAddressConfiguration(
> new CoreAddressConfiguration()
> .setName("ExpiryQueue")
> .addRoutingType(RoutingType.ANYCAST)
> .addQueueConfiguration(new
> QueueConfiguration("ExpiryQueue")
> .setRoutingType(RoutingType.ANYCAST)));
> }
> catch (Exception e) {
> throw new AssertionError("Can't config the Artemis
> Configuration.", e);
> }
> EmbeddedActiveMQ server = new EmbeddedActiveMQ();
> server.setConfiguration(config);
> try {
> server.start();
> }
> catch (Exception e) {
> throw new AssertionError("Can't start the Artemis Broker.", e);
> }
> return server;
> }
> }
> {code}
>
>
--
This message was sent by Atlassian Jira
(v8.3.4#803005)