You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@activemq.apache.org by "Justin Bertram (Jira)" <ji...@apache.org> on 2021/08/18 17:13:00 UTC
[jira] [Resolved] (ARTEMIS-3424) Unnecessary exception
"ActiveMQQueueExistsException: Binding already exists LocalQueueBinding"
when creating queue consumers
[ 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)