我正在使用以下DefaultMessageListenerContainer創建一個持久訂閱,即使在停機時間也能收到消息,這非常有效。是否有可能使用spring jms停止並重新啓動持久訂閱?
@Bean
ConnectionFactory connectionFactory() {
SingleConnectionFactory connectionFactory = new SingleConnectionFactory(new ActiveMQConnectionFactory(
AMQ_BROKER_URL));
connectionFactory.setClientId(CLIENT_ID);
return connectionFactory;
}
@Bean
DefaultMessageListenerContainer container(final MessageListener messageListener,
final ConnectionFactory connectionFactory) {
return new DefaultMessageListenerContainer() {
{
setMessageListener(messageListener);
setConnectionFactory(connectionFactory);
setDestinationName(JMS_TARGET);
setPubSubDomain(true);
setSessionTransacted(true);
setSubscriptionDurable(true);
setDurableSubscriptionName(SUBSCRIPTION_ID);
setConcurrentConsumers(1);
}
};
}
問題是:當我不再需要它時,刪除訂閱的最佳方法是什麼?是否有可能暫時刪除訂閱(並錯過一些消息),但以後再啓用它?
到目前爲止工作的唯一方法是關閉DMLC並在之後退出調用。
dmlc.shutdown();
Connection connection = connectionFactory.createConnection();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
session.unsubscribe(SUBSCRIPTION_ID);
這是一個合理的解決方案嗎?如何重新啓動訂閱?
我已經看到this answer但我真的不知道該怎麼做?或者,以完全不同的方式訂閱和取消訂閱會更好嗎?
感謝您的詳細解答。我同意您對un - /一次又一次地訂閱,但我很好奇它是如何工作的,它不會每天都進行操作,因此問題依然存在:手動取消/訂閱的最佳方式是什麼?您的建議「只」取消訂閱,但由於getSession需要JmsR,所以我仍然遇到這個問題esourceHolder實例。此外,雖然我無法測試您的解決方案,但我想我也會因爲消費者仍然活躍而出現錯誤。這就是爲什麼我需要在「我的提議」之前調用dmlc.shutdown()。 – Ingo
由於您正在創建一個全新的會話(它將獲得自己的客戶端ID),因此您仍然必須修改您的方法,因此您不會從發出訂閱的同一個會話中取消訂閱:您的舊訂閱將保持活動狀態 – SirRichie
你確定嗎? clientId在connectionFactory中設置,因此我認爲會話將獲得相同的clientId。不過,我怎樣才能獲得最初的會話呢?如前所述,我需要一個JmsResourceHolder實例,對吧? – Ingo