首页 > 其他分享 >119、商城业务---订单服务---创建业务交换机、队列等

119、商城业务---订单服务---创建业务交换机、队列等

时间:2023-02-24 00:11:27浏览次数:46  
标签:String exchange springframework --- 交换机 org import 119 stock

1、导入依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>

2、编写连接rabbitmq的配置

3、开启rabbitmq功能

4、rabbitmq使用json序列化机制并设置回调

package com.gulimall.ware.config;

import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.annotation.PostConstruct;

@Configuration
public class MyRabbitConfig {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    /**
     * json序列化格式
     * @return
     */
    @Bean
    public MessageConverter messageConverter(){
        return new Jackson2JsonMessageConverter();
    }

    /**
     * 定制RabbitTemplate
     */
    @PostConstruct //在MyRabbitConfig对象创建完成后执行这个方法
    public void initRabbitTemplate(){
        //设置确认回调
        rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {
            /**
             * 1、只要消息抵达Broker就ack=true
             * correlationData:当前消息的唯一关联数据(这个是消息的唯一id)
             * ack:消息是否成功收到
             * cause:失败的原因
             */
            @Override
            public void confirm(CorrelationData correlationData, boolean ack, String cause) {
                System.out.println("confirm...correlationData["+correlationData+"]==>ack:["+ack+"]==>cause:["+cause+"]");
            }
        });

        //设置消息发送到队列的回调(只有发送失败才会回调)
        rabbitTemplate.setReturnCallback(new RabbitTemplate.ReturnCallback() {
            /**
             * 只要消息【没有】投递给指定的队列,就触发这个失败回调
             * message:投递失败的消息详细信息
             * replyCode:回复的状态码
             * replyText:回复的文本内容
             * exchange:当时这个消息发给哪个交换机
             * routingKey:当时这个消息用哪个路邮键
             */
            @Override
            public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {
                System.out.println("Fail Message["+message+"]==>replyCode["+replyCode+"]" +
                        "==>replyText["+replyText+"]==>exchange["+exchange+"]==>routingKey["+routingKey+"]");
            }
        });
    }
}

5、编写创建队列、交换机、绑定的配置类

package com.gulimall.ware.config;

import org.springframework.amqp.core.*;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;
import java.util.Map;

/**
 * 创建队列、交换机、绑定
 */
@Configuration
public class MyRabbitMqConfig {
    /**
     * 监听消息【这个方法的编写是为了重启ware服务后能发现没有下面的交换机、队列、绑定,他就会自己创建】
     */
    @RabbitListener(queues = "stock.release.stock.queue")
    public void listener(Message message){
        //不做任何处理
    }

    /**
     * 交换机
     * @return
     */
    @Bean
    public Exchange stockEventExchange(){
        //String name, boolean durable, boolean autoDelete, Map<String, Object> arguments
        return new TopicExchange("stock-event-exchange",true, false);
    }

    /**
     * 普通队列
     */
    @Bean
    public Queue stockReleaseStockQueue(){
        //String name, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments
        return new Queue("stock.release.stock.queue", true, false, false);
    }

    /**
     * 死信队列
     * @return
     */
    @Bean
    public Queue orderDelayQueue(){
        /**
         * 配置参数
         * x-dead-letter-exchange: stock-event-exchange
         * x-dead-letter-routing-key: order.release
         * x-message-ttl: 60000
         */
        Map<String, Object> arguments = new HashMap<>();
        arguments.put("x-dead-letter-exchange", "stock-event-exchange");//死信路由到order-event-exchange交换机
        arguments.put("x-dead-letter-routing-key", "stock.release");//死信路由键
        arguments.put("x-message-ttl", 120000);//消息过期时间(2min)

        /**
         * String name, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments
         */
        Queue queue = new Queue("stock.delay.queue", true, false, false, arguments);
        return queue;
    }

    /**
     * 绑定
     */
    @Bean
    public Binding stockReleaseBinding(){
        /**
         * String destination, DestinationType destinationType, String exchange, String routingKey, Map<String, Object> arguments
         */
        return new Binding("stock.release.stock.queue", Binding.DestinationType.QUEUE, "stock-event-exchange", "stock.release.#", null);
    }

    /**
     * 绑定
     */
    @Bean
    public Binding stockDelayBinding(){
        /**
         * String destination, DestinationType destinationType, String exchange, String routingKey, Map<String, Object> arguments
         */
        return new Binding("stock.delay.queue", Binding.DestinationType.QUEUE, "stock-event-exchange", "stock.locked", null);
    }
}

标签:String,exchange,springframework,---,交换机,org,import,119,stock
From: https://www.cnblogs.com/morehair/p/17149955.html

相关文章

  • 18、实体类对象比对-JSON
    实体类对象相互比较-JSON方式:在实际开发中,我们经常需要比较同一个自定义类型的两个不同对象的属性值是否相等,采用JSON方式比较可快速有效实现相关需求。JSONobject是FastJ......
  • 算法刷题-杨辉三角-JAVA
    0x00引言为获取一个良好的算法思维,以及不再成为一个脚本小子,争取每天一道算法题,培养自己的逻辑思维,温顾各类型语言语法知识。题解只写自己理解的解法,其他解法不再增加。......
  • ES6-ES11 箭头函数的实践与应用
    视频<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>......
  • misc----练习------2023.2.22
    ------------恢复内容开始------------1,心仪的公司---攻防世界打开发现是一个叫webshell的流量包,打开用httpcontains"shell"过滤,得到一个jpeg的流量,点开划到最下即有fl......
  • Spark系列 - (3) Spark SQL
    3.SparkSQL3.1Hive、Shark和SparksqlHive:Hadoop刚开始出来的时候,使用的是hadoop自带的分布式计算系统MapReduce,但是MapReduce的使用难度较大,所以就开发了Hive。Hive......
  • 小case-基于chatgpt的微信自动回复
    微信自动回复基于聊天api的importpyautoguiimportpyperclipimportkeyboardimportrequestsimporttimeprint('程序即将开始,请打开微信!')#检测是否有新消息......
  • ES6-ES11 箭头函数以及声明特点
    视频<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>......
  • ES6-ES11 模板字符串
    视频<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>......
  • 蓝桥杯2022年第十三届省赛真题-回忆迷宫 (暴力加深搜)
    题目描述爱丽丝刚从一处地下迷宫中探险归来,你能根据她对于自己行动路径的回忆,帮她画出迷宫地图吗? 迷宫地图是基于二维网格的。爱丽丝会告诉你一系列她在迷宫中的......
  • 35-DRF框架-生成接口文档
    #注意:只能是ApiView及子应用#1.安装coreapi库#2.主应用中配置路径url(r'^docs/',include_docs_urls(title='接口文档'))#3.主应用中settings.py配置......