[
https://issues.apache.org/jira/browse/ARTEMIS-3424?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17401271#comment-17401271
]
Endre Stølsvik commented on ARTEMIS-3424:
-----------------------------------------
When I code, I have the "entire JVM" in debug logging - typically only
silencing loglines that come on a pretty fast schedule. I actually like to see
how the internals of products I use work and behave. Thus I get these messages
and wonder why they are there.
Would it not be possible to just elide at least the exception logging (i.e. log
a line, but not the exception)? I mean, who does this exception really benefit
- if it already is deemed low importance enough to just be debug-logged. The
people that would be interested in it, would probably know from where it came
just by the logline, not needing the stacktrace.
IMO, any exception logged is worrisome - someone thought this is important
enough to include the stacktrace to be able to figure out how this situation
came into existence.
Well, at least you now know that there are at least one person that develops
with full debug, and gets a bit worried by "spurious exceptions" being logged,
even if on debug level! :)
> 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)