Мой Java-код:
ArtemisContext artemisContext = WrapperContext.getInstance().getArtemisContext();
ClientSession session = artemisContext.getSession();
String myQueue = WrapperContext.getInstance().getMyId();
try {
session.createQueue(myQueue, RoutingType.ANYCAST, myQueue,false);
} catch (Exception e) {
//ignore
}
ClientConsumer consumer = session.createConsumer(myQueue);
consumer.setMessageHandler(message -> {
ActiveMQBuffer bodyBuffer = message.getBodyBuffer();
byte[] bytes = new byte[bodyBuffer.readableBytes()];
try {
bodyBuffer.readFully(bytes);
} catch (IOException e) {
e.printStackTrace();
}
String msg = new String(bytes);
message.getBodyBuffer().writeBytes(msg.getBytes());
log.info("=====comsume:" + msg);
listenerHandler.handler(msg);
});
WrapperContext.getInstance().getArtemisContext().setConsumer(consumer);
Когда я запускаю свое Java-приложение, я вызываю этот код и создаю очередь в ActiveMQ Artemis следующим образом:
И мой broker.xml
для ActiveMQ Artemis:
<address-settings>
<!-- if you define auto-create on certain queues, management has to be auto-create -->
<address-setting match = "activemq.management#">
<dead-letter-address>DLQ</dead-letter-address>
<expiry-address>ExpiryQueue</expiry-address>
<redelivery-delay>0</redelivery-delay>
<!-- with -1 only the global-max-size is in use for limiting -->
<max-size-bytes>-1</max-size-bytes>
<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-create-jms-queues>true</auto-create-jms-queues>
<auto-create-jms-topics>true</auto-create-jms-topics>
</address-setting>
<!--default for catch all-->
<address-setting match = "#">
<dead-letter-address>DLQ</dead-letter-address>
<expiry-address>ExpiryQueue</expiry-address>
<redelivery-delay>0</redelivery-delay>
<!-- with -1 only the global-max-size is in use for limiting -->
<max-size-bytes>-1</max-size-bytes>
<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-create-jms-queues>true</auto-create-jms-queues>
<auto-create-jms-topics>true</auto-create-jms-topics>
<auto-delete-addresses>true</auto-delete-addresses>
<auto-delete-addresses-delay>0</auto-delete-addresses-delay>
<auto-delete-queues>true</auto-delete-queues>
<auto-delete-queues-delay>0</auto-delete-queues-delay>
</address-setting>
</address-settings>
Я настроил очереди автоматического удаления как true. Я думал, что очередь автоматически удалит его, когда я выключу свой сервис. Но после того, как я отключил сервис, очередь все еще существует, хотя сообщений в ней нет, а потребитель равен 0, а Durable=false
Сначала я подумал, что это из-за RoutingType.MULTICAST
, поэтому поменял его на ANYCAST
, но результат остался тот же.
Так что-то не так с моим кодом или что-то не так с конфигурацией?
Моя версия ActiveMQ Artemis — 2.17.0.
Брокер будет автоматически удалять только те очереди, которые были помечены как автоматически созданные. Очередь, которую вы создаете, не помечается как созданная автоматически, поскольку вы создаете ее вручную (т. е. брокер не создает ее автоматически для вас) и вы не настраиваете ее как созданную автоматически. Попробуйте сделать это вместо этого:
session.createQueue(myQueue, RoutingType.ANYCAST, myQueue, null, false, true);
Также я настоятельно рекомендую вам обновиться до последней версии. Версия 2.17.0 была выпущена в начале 2021 года более трех лет назад. С тех пор вышло 15 выпусков с множеством исправлений ошибок и новыми функциями (включая новый createQueue
API, более гибкий и понятный).