Как установить Durable Subscriber в DefaultMessageListenerContainer весной?

Производитель сообщения не отправляет сообщение как постоянное, и когда я пытаюсь использовать сообщение через MessageListener, и происходит любое исключение (время выполнения), оно повторяется определенное количество раз (по умолчанию 6 со стороны AMQ), и сообщение теряется.

Причина в том, что, поскольку производитель не устанавливает режим доставки как постоянный, после определенного количества попыток повторной попытки DLQ не создается, и сообщение не перемещается в DLQ. Из-за этого я потерял сообщение.

Мой код выглядит так:

@Configuration
@PropertySource("classpath:application.properties")
public class ActiveMqJmsConfig {

@Autowired
private AbcMessageListener abcMessageListener;

public DefaultMessageListenerContainer purchaseMsgListenerforAMQ(
    @Qualifier("AMQConnectionFactory") ConnectionFactory amqConFactory) {

    LOG.info("Message listener for purchases from AMQ : Starting");
    DefaultMessageListenerContainer defaultMessageListenerContainer =
        new DefaultMessageListenerContainer();

    defaultMessageListenerContainer.setConnectionFactory(amqConFactory);

    defaultMessageListenerContainer.setMaxConcurrentConsumers(4);

    defaultMessageListenerContainer
        .setDestinationName(purchaseReceivingQueueName);

    defaultMessageListenerContainer
        .setMessageListener(abcMessageListener);

    defaultMessageListenerContainer.setSessionTransacted(true);

    return defaultMessageListenerContainer;
}

 @Bean
@Qualifier(value = "AMQConnectionFactory")
public ConnectionFactory activeMQConnectionFactory() {

    ActiveMQConnectionFactory amqConnectionFactory =
        new ActiveMQConnectionFactory();

    amqConnectionFactory
        .setBrokerURL(System.getProperty(tcp://localhost:61616));
    amqConnectionFactory
        .setUserName(System.getProperty(admin));
    amqConnectionFactory
        .setPassword(System.getProperty(admin));

    return amqConnectionFactory;

}

}

@Component
public class AbcMessageListener implements MessageListener {
 @Override
public void onMessage(Message msg) {
//CODE implementation
}

}

Проблема:- Установив идентификатор клиента на уровне соединения (Connection.setclientid("String")), мы можем подписаться как надежный подписчик, даже если сообщение не является постоянным. Таким образом, если приложение выдает исключение времени выполнения, после определенного числа попыток повторной попытки для очереди будет создан DLQ, а сообщение будет перемещено в DLQ.

Но в DefaultMessageListenerContainer соединение не предоставляется клиенту. я думаю, что он поддерживается самим классом как пул.

Как я могу достичь длительной подписки в DefaultMessageListenerContainer?

1 ответ

Вместо этого вы можете установить идентификатор клиента для контейнера:

/**
 * Specify the JMS client ID for a shared Connection created and used
 * by this container.
 * <p>Note that client IDs need to be unique among all active Connections
 * of the underlying JMS provider. Furthermore, a client ID can only be
 * assigned if the original ConnectionFactory hasn't already assigned one.
 * @see javax.jms.Connection#setClientID
 * @see #setConnectionFactory
 */
public void setClientId(@Nullable String clientId) {
    this.clientId = clientId;
}

а также

/**
 * Set the name of a durable subscription to create. This method switches
 * to pub-sub domain mode and activates subscription durability as well.
 * <p>The durable subscription name needs to be unique within this client's
 * JMS client id. Default is the class name of the specified message listener.
 * <p>Note: Only 1 concurrent consumer (which is the default of this
 * message listener container) is allowed for each durable subscription,
 * except for a shared durable subscription (which requires JMS 2.0).
 * @see #setPubSubDomain
 * @see #setSubscriptionDurable
 * @see #setSubscriptionShared
 * @see #setClientId
 * @see #setMessageListener
 */
public void setDurableSubscriptionName(@Nullable String durableSubscriptionName) {
    this.subscriptionName = durableSubscriptionName;
    this.subscriptionDurable = (durableSubscriptionName != null);
}
Другие вопросы по тегам