我已经配置了RabbitMQ集群,并在RabbitMQ上通过这样的配置使用Spring Cloud Stream:
if (this.assignments && this.assignments[i] && this.assignments[i].User && user === this.assignments[i].User.id)
和application.yml
import org.springframework.cloud.stream.annotation.Input;
import org.springframework.messaging.SubscribableChannel;
public interface FileChangedSink {
String INPUT = "fileChanged";
@Input(INPUT)
SubscribableChannel fileChanged();
}
版本:
spring:
cloud:
stream:
bindings:
fileChanged:
destination: file.changed
binder: stream_rabbit
consumer:
max-attempts: 1
binders:
stream_rabbit:
type: rabbit
environment:
spring:
rabbitmq:
host: ${RABBITMQ_HOST}
port: ${RABBITMQ_NODE_PORT_NUMBER}
username: ${RABBITMQ_DEFAULT_USER}
password: ${RABBITMQ_DEFAULT_PASS}
virtual-host: ${RABBITMQ_DEFAULT_VHOST}
通常,此配置可以正常运行,但是最近我遇到了这样的异常:
Spring Boot Version: 1.5.10.RELEASE
spring-cloud-starter-stream: 1.3.2.RELEASE
spring-cloud-starter-stream-rabbit: 1.3.3.RELEASE
注意:此错误是随机的,通常我的配置可以正常运行。
从错误中我可以了解到,在流尝试连接到队列之前并没有创建队列。
所以我的问题是它如何发生以及如何预防这种情况?
答案 0 :(得分:2)
不再支持Boot 1.5.x;最新版本1.5.22于8月发布。
您需要将队列参数x-queue-master-locator
设置为client-local
,以确保在与应用程序连接的节点上创建匿名队列。
从spring-amqp 2.1版(由Spring Boot 2.1和活页夹2.2使用)开始,框架自动完成此操作。
在早期版本中,您可以使用代理上的策略为匿名队列设置主定位器。
https://github.com/spring-cloud/spring-cloud-stream-binder-rabbit/issues/245
编辑
政策的屏幕截图: