Gri*_*nis 4 java spring rabbitmq spring-rabbit rabbitmq-exchange
我尝试使用 TopicExchange 来屏蔽消息。
配置:
<rabbit:connection-factory id="connectionFactory" host="localhost" username="guest" password="guest"/>
<rabbit:template id="rabbitTemplate" connection-factory="connectionFactory"/>
<rabbit:queue name="sample.queue"/>
<rabbit:admin id="rabbitAdmin" connection-factory="connectionFactory" />
<bean id="rabbitListenerContainerFactory"
class="org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory">
<property name="connectionFactory" ref="connectionFactory"/>
</bean>
<rabbit:annotation-driven container-factory="rabbitListenerContainerFactory"/>
<rabbit:listener-container connection-factory="connectionFactory" />
Run Code Online (Sandbox Code Playgroud)
成分:
@Component
public class JmsComponent {
private final Logger log = LoggerFactory.getLogger(JmsComponent.class);
private final TopicExchange exchange = new TopicExchange("sample.exchange");
@Autowired
private RabbitTemplate rabbitTemplate;
@Autowired
private Queue queue;
private String received;
public void send(String msg) {
rabbitTemplate.convertAndSend("sample.queue", new SimpleMessage(msg));
}
public void bindToKey(String keyMask) {
BindingBuilder.bind(queue).to(exchange).with(keyMask);
rabbitTemplate.setExchange(exchange.getName());
}
public void sendByKey(String key, String msg) {
rabbitTemplate.convertAndSend(exchange.getName(), key, new SimpleMessage(msg));
}
@RabbitListener(queues = "sample.queue")
public void handle(SimpleMessage message) {
log.info("================ Received " + message.getMsg());
received = message.getMsg();
}
public String getReceived() {
return received;
}
Run Code Online (Sandbox Code Playgroud)
当我使用发送时(在包括 TopicExchange 之前) - 一切正常。消息被直接发送到队列,handle() 已收到它。但是对于 TopicExchange ......我尝试使用它:
@Test
public void bind() throws InterruptedException {
jmsComponent.bindToKey("qq");
jmsComponent.sendByKey("qq", "message");
Thread.sleep(5000);
Assert.isTrue("message".equals(jmsComponent.getReceived()));
}
Run Code Online (Sandbox Code Playgroud)
测试总是失败,但在日志中我看到了这个 - DEBUG osamqp.rabbit.core.RabbitTemplate - Publishing message on exchange [sample.exchange], routingKey = [qq] 怎么了???谢谢
这个...
BindingBuilder.bind(queue).to(exchange).with(keyMask);
Run Code Online (Sandbox Code Playgroud)
...除了创建一个Binding对象然后把它扔掉之外什么都不做。您需要获取该Binding对象并呼叫declareBinding管理员。您还需要申报交换。
由于您的上下文中有管理员;最简单的方法是将 加入<rabbit:exchange/>上下文(连同绑定)。请参阅文档。
<rabbit:queue id="myQueue" name="sample.queue"/>
<topic-exchange name="sample.exchange">
<bindings>
<binding queue="myQueue" pattern="bucket.#"/>
</bindings>
</topic-exchange>
Run Code Online (Sandbox Code Playgroud)
顺便说一下,主题交换旨在通过关键模式进行路由;如果您只想使用固定密钥路由/绑定,qq那么使用直接交换。请参阅RabbitMQ 教程。
| 归档时间: |
|
| 查看次数: |
7825 次 |
| 最近记录: |