[
https://issues.apache.org/jira/browse/ARTEMIS-3424?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17401283#comment-17401283
]
Justin Bertram commented on ARTEMIS-3424:
-----------------------------------------
bq. Would it not be possible to just elide at least the exception logging (i.e.
log a line, but not the exception)?
This certainly would be _possible_, but I don't think it would be helpful to
developers when a truly unexpected exception arises.
bq. 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.
The stack-trace benefits developers who are debugging issues. Obviously in this
case the exception is well-known, but there's always the possibility of an
unexpected exception for which a stack-trace would be critical for diagnosing.
bq. IMO, any exception logged is worrisome...
This perspective is not necessarily shared by the ActiveMQ developers. The
ActiveMQ Artemis code-base logs many stack-traces at {{DEBUG}} and {{TRACE}} in
situations that are not necessarily an error.
bq. ...someone thought this is important enough to include the stacktrace to be
able to figure out how this situation came into existence.
In my opinion this is the nature of all {{DEBUG}} logging.
> 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)