Can you enable the logger org.apache.activemq.artemis.core.client.impl.ClientSessionFactoryImpl with the debug level and share the client logs?
Domenico On Wed, 29 Oct 2025 at 11:07, Illia <[email protected]> wrote: > Hi Domenico. > Unfortunately it didn't help. My consumer does not automatically reconnect > to the backup node on failover. > This is what I only see in logs: > *2025-10-29T11:33:32.502+02:00 INFO 3453475 --- [demo] [global-threads)] > o.apache.activemq.artemis.core.client : AMQ214036: Connection closure to > <some-host-here> has been detected: AMQ219015: The connection was > disconnected because of server shutdown [code=DISCONNECTED]* > > This is my test code for consumer: > > @Component > @Slf4j > public class EventHandler { > > @Autowired > private ConnectionFactory connectionFactory; > > private final List<ConsumerHolder> consumerHolders = new ArrayList<>(); > > @EventListener > public void onContextRefreshed(ContextRefreshedEvent event) throws > JMSException { > log.info("Start processing"); > Connection connection = connectionFactory.createConnection(); > Session jmsSession = connection.createSession(false, > Session.CLIENT_ACKNOWLEDGE); > > Queue queue = new ActiveMQQueue("some-adderes3::some-queue3"); > MessageConsumer consumer = jmsSession.createConsumer(queue); > > consumer.setMessageListener(msg -> { > try { > String text = ((TextMessage) msg).getText(); > System.out.println("💬 Received message: " + text); > } catch (Exception e) { > e.printStackTrace(); > } > }); > > connection.start(); > ConsumerHolder consumerHolder = new ConsumerHolder(); > consumerHolder.connection = connection; > consumerHolder.session = jmsSession; > consumerHolder.consumer = consumer; > consumerHolders.add(consumerHolder); > log.info("Finish processing"); > } > > class ConsumerHolder { > Connection connection; > Session session; > MessageConsumer consumer; > } > } > > This is configs for the factory I played with: > > factory.setRetryInterval(1000); > factory.setRetryIntervalMultiplier(1.5); > factory.setMaxRetryInterval(10000); > factory.setReconnectAttempts(2000); > factory.setInitialConnectAttempts(2000); > > > On UI I expect to see available consumer but it is not there: > [image: image.png] > > Could you please suggest what the reason is? > > Thanks! Best regards. > > ср, 29 окт. 2025 г. в 07:45, Domenico Francesco Bruscino < > [email protected]>: > >> In case your spring app is not reusing the existing connection, you should >> also set the InitialConnectAttempts param because it is 1 by default and 1 >> attempt may not be enough if the connection is created during the >> failover. >> >> Domenico >> >> On Wed, 29 Oct 2025 at 02:18, Illia <[email protected]> wrote: >> >> > Hi Justin. >> > Could you please help me with one more thing? >> > I am using the library that you mentioned but it seems that my consumer >> > doesn't automatically reconnect to a backup node on failover. Here is my >> > connection factory configuration: >> > >> > @Bean >> > public ConnectionFactory artemisConnectionFactory() { >> > // failover URL with two cluster nodes >> > String brokerUrl = >> > "(tcp://artemis-node-a:61616,tcp://artemis-node-b:61616)?ha=true"; >> > >> > // create the factory >> > ActiveMQConnectionFactory factory = new >> > ActiveMQConnectionFactory(brokerUrl); >> > >> > factory.setUser("artemis"); >> > factory.setPassword("artemis"); >> > >> > factory.setRetryInterval(1000); >> > factory.setRetryIntervalMultiplier(1.5); >> > factory.setMaxRetryInterval(10000); >> > factory.setReconnectAttempts(-1); >> > return factory; >> > } >> > >> > >> > I also tried to use spring library >> > *org.springframework.boot:spring-boot-starter-activemq* (which uses >> > activemq-client underneath) with next configuration: >> > >> > @Bean >> > public ConnectionFactory connectionFactory() { >> > ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory(); >> > >> > // Failover broker URL (auto-reconnect) >> > >> > >> factory.setBrokerURL("failover:(tcp://artemis-node-a:61616,tcp://artemis-node-b:61616)?randomize=false"); >> > >> > factory.setUserName("artemis"); >> > factory.setPassword("artemis"); >> > >> > return factory; >> > } >> > >> > >> > and the consumer successfully reconnects. >> > >> > Could you please let me know what is the reason why the consumer doesn't >> > automatically reconnect on failover with artemis-jakarta-client library? >> > >> > Thanks! Best regards. >> > >> > >> > пн, 27 окт. 2025 г. в 20:52, Justin Bertram <[email protected]>: >> > >> > > ActiveMQ Artemis provides the necessary JMS client implementation >> > > libraries. If you're using a relatively recent version of Spring this >> is >> > > the depenency you need to add in your Maven pom.xml: >> > > >> > > <dependency> >> > > <groupId>org.apache.activemq</groupId> >> > > <artifactId>artemis-jakarta-client</artifactId> >> > > <version>2.43.0</version> <!-- currently the latest release --> >> > > </dependency> >> > > >> > > More details are available in the documentation [1]. >> > > >> > > >> > > Justin >> > > >> > > [1] >> > > >> > > >> > >> https://activemq.apache.org/components/artemis/documentation/latest/client-classpath.html#the-client-classpath >> > > >> > > On Mon, Oct 27, 2025 at 12:10 PM Illia <[email protected]> >> wrote: >> > > >> > > > Hi Justin. >> > > > Thanks for your response. >> > > > >> > > > There is no specific reason why we decided to use Core API. >> > > > >> > > > Could you please suggest JMS API libraries that we can integrate to >> our >> > > app >> > > > instead of Core API? >> > > > >> > > > Thanks! Best regards. >> > > > >> > > > пн, 27 окт. 2025 г. в 18:02, Justin Bertram <[email protected]>: >> > > > >> > > > > You're using the Core API in your application. This is a low-level >> > API >> > > > > meant for applications that want to strictly manage their own >> > > resources. >> > > > I >> > > > > think this is the wrong API for your use-case. >> > > > > >> > > > > You're managing the creation of the queue(s) yourself, but you >> don't >> > > want >> > > > > to your application to manage the deletion of the queues as it >> would >> > > add >> > > > > unwanted complexity. Therefore, the broker is managing the >> deletion >> > of >> > > > the >> > > > > queue(s). However, the broker is deleting them in a manner that's >> > > causing >> > > > > problems for your application since your application is apparently >> > > > > expecting the queue to be there when it isn't. >> > > > > >> > > > > I recommend you simply use the JMS API and let the broker handle >> both >> > > the >> > > > > creation & deletion of the resources as needed. You're already >> using >> > > > Spring >> > > > > which has strong integration with JMS so you could likely simplify >> > your >> > > > > application a fair bit by switching. >> > > > > >> > > > > Is there a specific reason you're using the Core API rather than >> the >> > > JMS >> > > > > API? >> > > > > >> > > > > >> > > > > Justin >> > > > > >> > > > > On Fri, Oct 24, 2025 at 1:29 PM Illia <[email protected]> >> > wrote: >> > > > > >> > > > > > Hi Justin. >> > > > > > I have some kind of video conferencing app where I need to >> create >> > > many >> > > > > > addresses/queues for each session/call. >> > > > > > Setting the auto delete flag to false means that I will need to >> > clean >> > > > > > unused addresses and queues manually with the help of a >> scheduler >> > > which >> > > > > > complicates the solution. >> > > > > > >> > > > > > Is there any way to start taking into consideration auto delete >> > > delay? >> > > > So >> > > > > > when failover is done, the queue is not deleted automatically >> but >> > > only >> > > > > > after a specified time? >> > > > > > >> > > > > > Thanks! Best regards. >> > > > > > >> > > > > > чт, 23 окт. 2025 г. в 17:51, Justin Bertram < >> [email protected]>: >> > > > > > >> > > > > > > I tracked this behavior down to ARTEMIS-3525 [1]. On start the >> > > broker >> > > > > > will >> > > > > > > explicitly delete empty queues that are to be auto-deleted. >> > > > > > > >> > > > > > > That said, if auto-creation is enabled and you're using a >> > protocol >> > > > > where >> > > > > > > auto-creation is supported then the queue should be re-created >> > > when a >> > > > > > > message is sent to it or a consumer is created on it. >> > > > > > > >> > > > > > > Is there a particular reason that you don't want to delete >> queues >> > > > > > > immediately after failover when the queue auto-delete flag is >> set >> > > to >> > > > > > true? >> > > > > > > Have you considered setting the auto-delete flag to false so >> that >> > > > this >> > > > > > > doesn't happen? >> > > > > > > >> > > > > > > >> > > > > > > Justin >> > > > > > > >> > > > > > > [1] https://issues.apache.org/jira/browse/ARTEMIS-3525 >> > > > > > > >> > > > > > > On Wed, Oct 22, 2025 at 8:10 PM Illia < >> [email protected]> >> > > > wrote: >> > > > > > > >> > > > > > > > Hi Justin. >> > > > > > > > I have prepared a Java app for you. The link - >> > > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > >> > > >> > >> https://drive.google.com/file/d/1aLExH0nWTtWvdjFTw6KJIdid5wTXlJ9J/view?usp=sharing >> > > > > > > > Steps to reproduce the issue: >> > > > > > > > 1. Build Java app with *./mvnw clean package* >> > > > > > > > 2. Start docker compose *docker compose up* which will start >> > java >> > > > > > client >> > > > > > > > and 2 artemis nodes in replication mode (active and backup). >> > > > > > > > 3. After the application is started, an address with the >> name >> > > > > > > > "new-address" and a queue with the name "new-queue" are >> > created. >> > > > > > > > 4. Stop active node with *docker stop artemis-node-a* >> > > > > > > > 5. Go to *http://localhost:8162/console/artemis >> > > > > > > > <http://localhost:8162/console/artemis> *where you can >> observe >> > > > that >> > > > > > > > address was replicated and queue was not >> > > > > > > > [image: image.png] >> > > > > > > > [image: image.png] >> > > > > > > > >> > > > > > > > 6. The reason is that my queue is configured with >> autodelete: >> > > > > > > > [image: image.png] >> > > > > > > > 7. If you remove autoDelete and autoDeleteDeley lines and >> > repeat >> > > > > > > > everything from the beginning, you will notice that both >> > address >> > > > and >> > > > > > > queue >> > > > > > > > are successfully replicated. >> > > > > > > > >> > > > > > > > My goal is to not delete queues immediately after failover >> when >> > > the >> > > > > > queue >> > > > > > > > auto delete flag is set to true. Is it even possible? >> > > > > > > > >> > > > > > > > Thanks! Best regards. >> > > > > > > > >> > > > > > > > ср, 22 окт. 2025 г. в 06:07, Justin Bertram < >> > [email protected] >> > > >: >> > > > > > > > >> > > > > > > >> Nothing in the address-settings seems problematic. Can you >> > work >> > > up >> > > > > > some >> > > > > > > >> instructions or ideally an automated reproducer so that I >> can >> > > > > observe >> > > > > > > the >> > > > > > > >> same behavior that you described? >> > > > > > > >> >> > > > > > > >> >> > > > > > > >> Justin >> > > > > > > >> >> > > > > > > >> On Tue, Oct 21, 2025 at 4:52 PM Illia < >> > [email protected]> >> > > > > > wrote: >> > > > > > > >> >> > > > > > > >> > Hi Justin. >> > > > > > > >> > This my settings in broker.xml: >> > > > > > > >> > >> > > > > > > >> > <address-setting match="#"> >> > > > > > > >> > <dead-letter-address>DLQ</dead-letter-address> >> > > > > > > >> > <expiry-address>ExpiryQueue</expiry-address> >> > > > > > > >> > <redelivery-delay>0</redelivery-delay> >> > > > > > > >> > >> > > > > > > >> > >> > > > > > > >> > >> > > > > > > >> >> > > > > > > >> > > > > >> > > >> <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>false</auto-delete-queues> >> > > > > > > >> > <auto-delete-addresses>false</auto-delete-addresses> >> > > > > > > >> > >> > > > > > > >> > <!-- The size of each page file --> >> > > > > > > >> > <page-size-bytes>10M</page-size-bytes> >> > > > > > > >> > >> > > > > > > >> > <!-- When we start applying the address-full-policy, >> e.g >> > > > > paging >> > > > > > > --> >> > > > > > > >> > <!-- Both are disabled by default, which means we >> will >> > use >> > > > the >> > > > > > > >> > global-max-size/global-max-messages --> >> > > > > > > >> > <max-size-bytes>-1</max-size-bytes> >> > > > > > > >> > <max-size-messages>-1</max-size-messages> >> > > > > > > >> > >> > > > > > > >> > <!-- When we read from paging into queues (memory) >> --> >> > > > > > > >> > >> > > > > > > >> > <max-read-page-messages>-1</max-read-page-messages> >> > > > > > > >> > <max-read-page-bytes>20M</max-read-page-bytes> >> > > > > > > >> > >> > > > > > > >> > <!-- Limit on paging capacity before starting to >> throw >> > > > errors >> > > > > > --> >> > > > > > > >> > >> > > > > > > >> > <page-limit-bytes>-1</page-limit-bytes> >> > > > > > > >> > <page-limit-messages>-1</page-limit-messages> >> > > > > > > >> > </address-setting> >> > > > > > > >> > >> > > > > > > >> > >> > > > > > > >> > ср, 22 окт. 2025 г. в 00:15, Justin Bertram < >> > > > [email protected] >> > > > > >: >> > > > > > > >> > >> > > > > > > >> > > Can you provide the address settings that correspond to >> > this >> > > > > > queue? >> > > > > > > >> > > >> > > > > > > >> > > For what it's worth, setting the auto-delete >> message-count >> > > on >> > > > > the >> > > > > > > >> queue >> > > > > > > >> > to >> > > > > > > >> > > -1 is not normal as that means the broker will delete >> the >> > > > queue >> > > > > > > >> > regardless >> > > > > > > >> > > of the number of messages it contains. It might make >> sense >> > > > > > depending >> > > > > > > >> on >> > > > > > > >> > > your use-case, but folks typically don't want to delete >> > > their >> > > > > > > messages >> > > > > > > >> > > automatically. >> > > > > > > >> > > >> > > > > > > >> > > >> > > > > > > >> > > Justin >> > > > > > > >> > > >> > > > > > > >> > > On Tue, Oct 21, 2025 at 3:28 PM Illia < >> > > > [email protected]> >> > > > > > > >> wrote: >> > > > > > > >> > > >> > > > > > > >> > > > Hi team. Could you please help me with the next >> issue. >> > > > > > > >> > > > >> > > > > > > >> > > > My cluster consists of two nodes with replication >> mode >> > > (live >> > > > > and >> > > > > > > >> > backup) >> > > > > > > >> > > > that are configured to auto delete queues. >> > > > > > > >> > > > >> > > > > > > >> > > > When my active node fails, I see that only addresses >> are >> > > > > > > replicated >> > > > > > > >> to >> > > > > > > >> > > the >> > > > > > > >> > > > backup node but not queues. Seems that the reason is >> > that >> > > my >> > > > > > > queues >> > > > > > > >> are >> > > > > > > >> > > > configured for auto delete. Queue replication works >> fine >> > > > > without >> > > > > > > the >> > > > > > > >> > auto >> > > > > > > >> > > > delete flag. I tried to set up an auto delete delay >> but >> > it >> > > > > seems >> > > > > > > >> that >> > > > > > > >> > it >> > > > > > > >> > > > still doesn’t work with failover. >> > > > > > > >> > > > >> > > > > > > >> > > > My goal is to not delete queues immediately after >> > failover >> > > > > when >> > > > > > > the >> > > > > > > >> > queue >> > > > > > > >> > > > auto delete flag is set to true. >> > > > > > > >> > > > >> > > > > > > >> > > > Is there any way to do this? >> > > > > > > >> > > > >> > > > > > > >> > > > Here is my queue configuration in Java code: >> > > > > > > >> > > > >> > > > > > > >> > > > >> > > > > > > >> > > > >> > > > > > > >> > > > >> > > > > > > >> > > > >> > > > > > > >> > > > >> > > > > > > >> > > > >> > > > > > > >> > > > >> > > > > > > >> > > > *final QueueConfiguration queueConfig = >> > > > > > > >> > > > >> > > > > > > >> > > > >> > > > > > > >> > > >> > > > > > > >> > >> > > > > > > >> >> > > > > > > >> > > > > > >> > > > > >> > > > >> > > >> > >> QueueConfiguration.of(queueName).setAddress(addressName).setRoutingType(RoutingType.ANYCAST).setAutoDelete(true).setAutoDeleteDelay(30000L).setAutoDeleteMessageCount(-1L).setPurgeOnNoConsumers(false).setNonDestructive(false);* >> > > > > > > >> > > > >> > > > > > > >> > > > Thanks! Best regards. >> > > > > > > >> > > > >> > > > > > > >> > > >> > > > > > > >> > >> > > > > > > >> >> > > > > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > >> > > >> > >> >
