huiselele 发表于 2017-12-8 21:39:37

(转) RabbitMQ学习之spring整合发送同步消息(注解实现)

  http://blog.csdn.net/zhu_tianwei/article/details/40918477
  上一篇文章通过xml配置rabbitmq的rabbitTemplate,本节将使用注解的形式实现同步消息的发送。
  1.注解配置AnnotationConfiguration.Java



view plain copy
print?
[*]package cn.slimsmart.rabbitmq.demo.spring.sync;
[*]
[*]import org.springframework.amqp.core.AmqpAdmin;
[*]import org.springframework.amqp.core.Queue;
[*]import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
[*]import org.springframework.amqp.rabbit.connection.ConnectionFactory;
[*]import org.springframework.amqp.rabbit.core.RabbitAdmin;
[*]import org.springframework.amqp.rabbit.core.RabbitTemplate;
[*]import org.springframework.context.annotation.Bean;
[*]import org.springframework.context.annotation.Configuration;
[*]
[*]import com.rabbitmq.client.AMQP;
[*]
[*]@Configuration
[*]public class AnnotationConfiguration {
[*]
[*]    //指定队列名称 routingkey的名称默认为Queue的名称,使用Exchange类型为DirectExchange
[*]    protected String springQueueDemo = "spring-queue-demo";
[*]
[*]    //创建链接
[*]    @Bean
[*]    public ConnectionFactory connectionFactory() {
[*]      CachingConnectionFactory connectionFactory = new CachingConnectionFactory("192.168.36.102");
[*]      connectionFactory.setUsername("admin");
[*]      connectionFactory.setPassword("admin");
[*]      connectionFactory.setPort(AMQP.PROTOCOL.PORT);
[*]      return connectionFactory;
[*]    }
[*]
[*]    //创建rabbitAdmin 代理类
[*]    @Bean
[*]    public AmqpAdmin amqpAdmin() {
[*]      return new RabbitAdmin(connectionFactory());
[*]    }
[*]
[*]    //创建rabbitTemplate 消息模板类
[*]    @Bean
[*]    public RabbitTemplate rabbitTemplate() {
[*]      RabbitTemplate template = new RabbitTemplate(connectionFactory());
[*]      //The routing key is set to the name of the queue by the broker for the default exchange.
[*]      template.setRoutingKey(this.springQueueDemo);
[*]      //Where we will synchronously receive messages from
[*]      template.setQueue(this.springQueueDemo);
[*]      return template;
[*]    }
[*]
[*]    //
[*]    // Every queue is bound to the default direct exchange
[*]    public Queue helloWorldQueue() {
[*]      return new Queue(this.springQueueDemo);
[*]    }
[*]
[*]    /*
[*]    @Bean
[*]    public Binding binding() {
[*]      return declare(new Binding(helloWorldQueue(), defaultDirectExchange()));
[*]    }*/
[*]
[*]    /*   
[*]    @Bean
[*]    public TopicExchange helloExchange() {
[*]      return declare(new TopicExchange("hello.world.exchange"));
[*]    }*/
[*]
[*]    /*
[*]    public Queue declareUniqueQueue(String namePrefix) {
[*]      Queue queue = new Queue(namePrefix + "-" + UUID.randomUUID());
[*]      rabbitAdminTemplate().declareQueue(queue);
[*]      return queue;
[*]    }
[*]   
[*]    // if the default exchange isn't configured to your liking....
[*]    @Bean Binding declareP2PBinding(Queue queue, DirectExchange exchange) {
[*]      return declare(new Binding(queue, exchange, queue.getName()));
[*]    }
[*]   
[*]    @Bean Binding declarePubSubBinding(String queuePrefix, FanoutExchange exchange) {
[*]      return declare(new Binding(declareUniqueQueue(queuePrefix), exchange));
[*]    }
[*]   
[*]    @Bean Binding declarePubSubBinding(UniqueQueue uniqueQueue, TopicExchange exchange) {
[*]      return declare(new Binding(uniqueQueue, exchange));
[*]    }
[*]   
[*]    @Bean Binding declarePubSubBinding(String queuePrefix, TopicExchange exchange, String routingKey) {
[*]      return declare(new Binding(declareUniqueQueue(queuePrefix), exchange, routingKey));
[*]    }*/
[*]
[*]}
  2.消费者代码Consumer.java



view plain copy
print?
[*]package cn.slimsmart.rabbitmq.demo.spring.sync;
[*]
[*]import org.springframework.amqp.core.AmqpTemplate;
[*]import org.springframework.context.ApplicationContext;
[*]import org.springframework.context.annotation.AnnotationConfigApplicationContext;
[*]
[*]public class Consumer {
[*]    public static void main(String[] args) {
[*]      ApplicationContext context = new AnnotationConfigApplicationContext(AnnotationConfiguration.class);
[*]      AmqpTemplate amqpTemplate = context.getBean(AmqpTemplate.class);
[*]      System.out.println("Received: " + amqpTemplate.receiveAndConvert());
[*]    }
[*]}
  3.生产者代码Producer.java



view plain copy
print?
[*]package cn.slimsmart.rabbitmq.demo.spring.sync;
[*]
[*]import org.springframework.amqp.core.AmqpTemplate;
[*]import org.springframework.context.ApplicationContext;
[*]import org.springframework.context.annotation.AnnotationConfigApplicationContext;
[*]
[*]public class Producer {
[*]    public static void main(String[] args) {
[*]      ApplicationContext context = new AnnotationConfigApplicationContext(AnnotationConfiguration.class);
[*]      AmqpTemplate amqpTemplate = context.getBean(AmqpTemplate.class);
[*]      amqpTemplate.convertAndSend("Hello World");
[*]      System.out.println("Sent: Hello World");
[*]    }
[*]}
  运行生产者向队列中发送一条消息,再运行消费者消费消息。
  另外,声明一个队列代码如:



view plain copy
print?
[*]ApplicationContext context =new AnnotationConfigApplicationContext(AnnotationConfiguration.class);
[*]      AmqpAdmin amqpAdmin = context.getBean(AmqpAdmin.class);
[*]      Queue helloWorldQueue = new Queue("create.world.queue");
[*]      amqpAdmin.declareQueue(helloWorldQueue);
页: [1]
查看完整版本: (转) RabbitMQ学习之spring整合发送同步消息(注解实现)