在这种情况下,消息将从Amqp队列中拉出并写入到数据库中-但是,在计划的DB批处理运行期间,该数据库不可用并且我们无法写入,因此我们希望消息保留在在这些窗口中排队。
我正在尝试确定解决此问题的最佳方法-只需在@RabbitListener方法中引发异常以(重复)重新排队消息,或使用Spring调度程序尝试停止/启动侦听器(我知道SimpleMessageListenerContainer具有停止/启动方法)。
关于最佳(或更好)方法的任何建议吗?
答案 0 :(得分:0)
要考虑的另一种方法是侦听器的回复功能。
查看AbstractRabbitListenerContainerFactory
JavaDoc:
/**
* Set a {@link RetryTemplate} to use when sending replies; added to each message
* listener adapter.
* @param retryTemplate the template.
* @since 2.0.6
* @see #setReplyRecoveryCallback(RecoveryCallback)
* @see AbstractAdaptableMessageListener#setRetryTemplate(RetryTemplate)
*/
public void setRetryTemplate(RetryTemplate retryTemplate) {
this.retryTemplate = retryTemplate;
}
/**
* Set a {@link RecoveryCallback} to invoke when retries are exhausted. Added to each
* message listener adapter. Only used if a {@link #setRetryTemplate(RetryTemplate)
* retryTemplate} is provided.
* @param recoveryCallback the recovery callback.
* @since 2.0.6
* @see #setRetryTemplate(RetryTemplate)
* @see AbstractAdaptableMessageListener#setRecoveryCallback(RecoveryCallback)
*/
public void setReplyRecoveryCallback(RecoveryCallback<?> recoveryCallback) {
this.recoveryCallback = recoveryCallback;
}
您是对的:您也可以使用start()/stop()
。
因此,您需要注入一个RabbitListenerEndpointRegistry
bean并使用它:
/**
* Return the {@link MessageListenerContainer} with the specified id or
* {@code null} if no such container exists.
* @param id the id of the container
* @return the container or {@code null} if no container with that id exists
* @see RabbitListenerEndpoint#getId()
* @see #getListenerContainerIds()
*/
public MessageListenerContainer getListenerContainer(String id) {
要根据您的逻辑访问@RabbitListener
和stop()
或start()
的适当的侦听器容器。