我想实现Spring AMQP示例,以使用侦听器发送和接收Java对象。我尝试过:
发送Java对象
ConnectionFactory connectionFactory = new CachingConnectionFactory("localhost");
AmqpAdmin admin = new RabbitAdmin(connectionFactory);
admin.declareBinding(BindingBuilder.bind(new Queue(QUEUE_PROCESSING_TRANSACTION, false)).to(new TopicExchange(EXCHANGE_PROCESSING)).with(ROUTING_KEY_PROCESSING_TRANSACTION));
AmqpTemplate template = new RabbitTemplate(connectionFactory);
TransactionsBean obj = new TransactionsBean();
obj.setId(Long.valueOf(111222333));
接收并发送回另一个Java对象:
ConnectionFactory connectionFactory = new CachingConnectionFactory("localhost");
AmqpAdmin admin = new RabbitAdmin(connectionFactory);
admin.declareBinding(BindingBuilder.bind(new Queue(QUEUE_PROCESSING_TRANSACTION, false))
.to(new TopicExchange(EXCHANGE_PROCESSING)).with(ROUTING_KEY_PROCESSING_TRANSACTION));
AmqpTemplate template = new RabbitTemplate(connectionFactory);
TransactionsBean obj = (TransactionsBean) template.receiveAndConvert(QUEUE_PROCESSING_TRANSACTION);
System.out.println(" !!!!!!! Received id " + obj.getTransaction_id());
SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
container.setQueues(new Queue(QUEUE_PROCESSING_TRANSACTION, false));
container.setMessageListener(new MessageListener() {
@Override
public void onMessage(Message message) {
// Receive here Java object and send back another object
}
});
您能告诉我如何通过简单的侦听器扩展没有复杂注释的代码吗?
答案 0 :(得分:2)
最简单的方法是使用@RabbitListener
-使用Spring Boot时更容易,因为他将连接基础结构bean(模板,管理等)。
@SpringBootApplication
public class So51009346Application {
public static final String QUEUE_PROCESSING_TRANSACTION = "q1";
public static void main(String[] args) {
SpringApplication.run(So51009346Application.class, args);
}
@Bean
public ApplicationRunner runner(RabbitTemplate template) {
return args -> {
ReplyObject reply = (ReplyObject) template.convertSendAndReceive("ex", "rk", new RequestObject());
System.out.println(reply);
};
}
@Bean
public Queue queue() {
return new Queue(QUEUE_PROCESSING_TRANSACTION);
}
@Bean
public TopicExchange te() {
return new TopicExchange("ex");
}
@Bean
public Binding binding() {
return BindingBuilder.bind(queue()).to(te()).with("rk");
}
}
class RequestObject implements Serializable {
private static final long serialVersionUID = 1L;
}
class ReplyObject implements Serializable {
private static final long serialVersionUID = 1L;
}
@Component
class Listener {
@RabbitListener(queues = So51009346Application.QUEUE_PROCESSING_TRANSACTION)
public ReplyObject process(RequestObject ro) {
return new ReplyObject();
}
}
如果由于某种原因不想使用该批注,则可以使用MessageListenerAdapter连接容器...
@SpringBootApplication
public class So51009346Application {
public static final String QUEUE_PROCESSING_TRANSACTION = "q1";
public static void main(String[] args) {
SpringApplication.run(So51009346Application.class, args);
}
@Bean
public ApplicationRunner runner(RabbitTemplate template) {
return args -> {
ReplyObject reply = (ReplyObject) template.convertSendAndReceive("ex", "rk", new RequestObject());
System.out.println(reply);
};
}
@Bean
public SimpleMessageListenerContainer container(ConnectionFactory cf, Listener listener) {
SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(cf);
container.setQueueNames(QUEUE_PROCESSING_TRANSACTION);
container.setMessageListener(new MessageListenerAdapter(listener, "process"));
return container;
}
@Bean
public Queue queue() {
return new Queue(QUEUE_PROCESSING_TRANSACTION);
}
@Bean
public TopicExchange te() {
return new TopicExchange("ex");
}
@Bean
public Binding binding() {
return BindingBuilder.bind(queue()).to(te()).with("rk");
}
}
class RequestObject implements Serializable {
private static final long serialVersionUID = 1L;
}
class ReplyObject implements Serializable {
private static final long serialVersionUID = 1L;
}
@Component
class Listener {
public ReplyObject process(RequestObject ro) {
return new ReplyObject();
}
}
您当然可以使用适配器自己连接容器,如您所提出的问题,但是通常最好让Spring作为@Bean
来管理它,否则您将错过一些功能(例如事件发布)对于失败,请闲置容器)。适配器获得对您的请求/回复侦听器的引用以及要调用的方法名称。