从生产者角度: 首先在项目的pom文件当中导入amqp坐标,然后在application.yml文件中加入rabbitmq的相关ip,port,账户和密码,然后是标记队列交换机,队列和路由键。然后在启动类中创建@Bean将前面的交换机,队列和路由键进行创建并绑定。
application.yml中进行如下配置 mq: pay: exchange: seckillorder: exchange.seckillorder queue: seckillorder: queue.seckillorder routing: key: queue.seckillorder @Autowired private Environment env; @Bean public DirectExchange basicExchange(){ return new DirectExchange(env.getProperty("mq.pay.exchange.seckillorder"), true,false); } /*** * 创建队列 * @return */ @Bean(name = "queueOrder") public Queue queueOrder(){ return new Queue(env.getProperty("mq.pay.queue.seckillorder"), true); } /**** * 队列绑定到交换机上 * @return */ @Bean public Binding basicBinding(){ return BindingBuilder.bind(queueOrder()).to(basicExchange()).with(env.getProperty("mq.pay.routing.key")); } 然后可以在controller中运用rabbitmqtemplate进行信息的传送;例子如下: template.convertAndSend(exchange,routingkey,JSON.toJSONString(map));从消费者的角度: 新建一个类,具体配置如下:
@Component @RabbitListener(queues = "${mq.pay.queue.seckillorder}") public class SeckillMessageListener { @Autowired private SeckillOrderService seckillOrderService; @RabbitHandler public void getMessage(String message){ try { Map<String, String> resultMap = JSON.parseObject(message,Map.class); //通讯标识->success String return_code = resultMap.get("return_code"); //out_trade_no->订单号 String outTradeNo = resultMap.get("out_trade_no"); //自定义数据 String attach = resultMap.get("attach"); Map<String,String> attachMap= JSON.parseObject(attach,Map.class); if(return_code.equals("SUCCESS")){ //result_code 业务结果->success fail->删除订单->存入mysql->回滚库存 String result_code = resultMap.get("result_code"); if(result_code.equals("SUCCESS")){ //改订单状态 seckillOrderService.updatePayStatus(attachMap.get("username"),resultMap.get("transaction_id"),resultMap.get("time_end")); }else { seckillOrderService.deleteOrder(attachMap.get("username")); } } } catch (Exception e) { e.printStackTrace(); } } }除此之外其他的配置基本跟生产者相同,所以就不一一展示,唯一区别就是生产者可以配置多个队列,多个路由键,而消费者只需要监听自己队列的消息即可。
当然在正式的开发中一般是手动去rabbitmq的管理账号里面添加相关数据。