免责声明:RabbitMq和/或Spring Integration和/或Spring Cloud Stream中的Noobie。
我有以下课程:
@Component
public class RabbitMQChannelBindingFactory {
...
private org.springframework.cloud.stream.binder.rabbitRabbitMessageChannelBinder binder;
private org.springframework.cloud.stream.config.BindingServiceProperties bindingServiceProperties;
private org.springframework.cloud.stream.binding.BindingService bindingService;
private org.springframework.beans.factory.config.ConfigurableListableBeanFactory beanFactory;
private org.springframework.cloud.stream.binding.SubscribableChannelBindingTargetFactory bindingTargetFactory;
private org.springframework.amqp.rabbit.connection.ConnectionFactory rabbitConnectionFactory;
...
}
需要什么?
我有创建Exchange + Queue + Consumer的机制,也有销毁它们的机制。交换和队列的自动删除设置为true。
问题是什么?
破坏所有这三个元素的继承机制不起作用。
它仅删除Exchange。队列不会被删除,因为它仍然有一个使用者,我也可以在我的应用程序中看到它。
已经尝试了什么?
我尝试使用JVisualVM来获取客户标签的String实例,然后在层次结构中向上移动以删除使用者。
我在我的应用程序中更改了org.springframework.amqp.rabbit.listener.BlockingQueueConsumer,这样它将由类加载器首先加载。
我在内部添加了以下内容,以便跟踪在我的应用程序中创建的所有使用者:
public class BlockingQueueConsumer {
...
public static List<BlockingQueueConsumer> all = new ArrayList<>();
public BlockingQueueConsumer(...) {
...
all.add(this);
...
}
...
}
完成上一步后,我在RabbitMQChannelBindingFactory类中添加了另一个方法,以为所有使用者调用cancel方法,如下所示:
class RabbitMQChannelBindingFactory {
public void disconnect(...) {
BlockingQueueConsumer lastBlockingQueueConsumer =
BlockingQueueConsumer.all.get(BlockingQueueConsumer.all.size() - 1);
lastBlockingQueueConsumer.getConsumerTags()
.forEach(consumerTag -> basicCancel(lastBlockingQueueConsumer, consumerTag));
}
}
此时,在装有RabbitMQ控制台的浏览器上,我们可以看到队列已删除(除了Exchange和使用者)。
问题是什么?
我找不到将BlockingQueueConsumer连接到自动装配属性的方法。
例如我试过
public void deleteRabbitMQConsumer() {
RabbitTemplate rabbitTemplate = new RabbitTemplate(rabbitConnectionFactory);
rabbitTemplate.execute(channel -> {
if (channel instanceof ChannelN) {
ChannelN channelN = (ChannelN) channel;
return true;
}
return false;
});
}
但似乎ChannelN内没有消费者。
您能给我一个方向,首先要了解什么?
或有什么资源可以帮助我?
还是有人尝试过使用此自动装配的属性取消使用方的操作?
还是我需要添加其他自动装配属性?
我已经尝试过https://stackoverflow.com/a/27633771/13622666解决方案。
解决方案
@Component
public class RabbitMQChannelBindingFactory {
...
private org.springframework.cloud.stream.binder.rabbitRabbitMessageChannelBinder binder;
private void connectAndDisconnectConsumer(...) {
...
Binding<MessageChannel> messageChannelBinding =
binder.bindConsumer(exchangeName, "", channel, consumerProperties);
... // receive messages
messageChannelBinding.stop();
...
}
}
和堆栈跟踪:
messageChannelBinding.stop();
DefaultBinding#stop
AbstractEndpoint#stop()
AmqpInboundChannelAdapter#doStop
AbstractMessageListenerContainer#stop()
AbstractMessageListenerContainer#doStop
AbstractMessageListenerContainer#shutdown
SimpleMessageListenerContainer#doShutdown
BlockingQueueConsumer#basicCancel(boolean)
投票关闭。您不能滥用这样的Java类系统,而应该更加专注于学习所使用的库。可能有人已经问过您要寻找的解决方案。正如Gary所说:stop()
Spring Cloud Stream上只有一个绑定,它将停止a MessageListenerContainer
,这将取消队列中所有的使用者。自动删除的队列将从RabbitMQ中删除。没有理由破坏交流。尽管您可以通过进行操作AmqpAdmin.deleteExchange()
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句