我试图在分布式微服务中使用带有弹簧WebSocketMessageBroker
的RabbitMq。
我正在使用的设置是
在WebSocketMessageBroker中,我使用以下配置,取自文档:
@Configuration
@EnableWebSocketMessageBroker
public class WebsocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/push").setAllowedOrigins("*").withSockJS();
}
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableStompBrokerRelay("/queue/", "/topic/", "/app");
registry.setApplicationDestinationPrefixes("/app");
registry.setPathMatcher(new AntPathMatcher("."));
}
}
鉴于此配置,应该MyMicroservice
发布什么交换/队列,以便将消息代理到Stomp服务?
我尝试了以下内容(在发布方面 - 在MyMicroservice中)
@Configuration
@SpringBootApplication
@EnableRabbit
public class Config {
public static final String WEB_QUEUE = "/topic/myNotificationTopic";
public static final String WEB_EXCHANGE = "web.exchange";
@Bean
Queue webQueue() {
return new Queue(WEB_QUEUE, false);
}
@Bean
TopicExchange webExchange() {
return new TopicExchange(WEB_EXCHANGE);
}
@Bean
Binding binding(Queue webQueue, TopicExchange webExchange) {
return BindingBuilder.bind(webQueue).to(webExchange).with(WEB_QUEUE);
}
}
@Component
public class ExamplePublisher {
@Autowired
private AmqpTemplate amqpTemplate;
public void sendMessage() {
amqpTemplate.convertAndSend(Config.WEB_QUEUE, "Hello, world");
}
}
但是,该消息似乎不会通过WebSocket连接进行代理。
要明确,我的问题是:
答案 0 :(得分:2)
您的解释并不清楚为什么要使用Spring AMQP进行STOMP交互,尽管无论如何都可以。
如果您要直接从Java发送STOMP消息到目标目标,我建议您查看Spring Messaging中的StompClient
支持。
使用Spring AMQP(或只是AMQP协议),你应该遵循一些RabbitMQ STOMP适配器rules:
主题目的地
对于将每封邮件的副本传递给所有活动订阅者的简单主题目标,可以使用
/topic/<name>
形式的目标。主题目标支持AMQP主题交换的所有路由模式。发送到没有活动订阅者的主题目标的消息将被丢弃。
AMQP 0-9-1语义
对于
SEND
帧,邮件会以路由密钥amq.topic
发送到<name>
交换。对于
SUBSCRIBE
帧,创建一个自动删除的非持久队列,并使用路由键amq.topic
绑定到<name>
交换。将根据队列创建订阅。
请注意,您最初应该subscription
,否则您的邮件将在没有订阅者的情况下丢失。