使用消息中间件RabbitMQ的一点点体会

使用消息中间件rabbitMQ的一点点理解--》topic方式

对交换机和队列进行统一管理

可以通过创建一个接口的方式,在接口中定义交换机与队列名称,如下图:

/**
 * @author
 * @Date 
 * 对队列和交换机进行统一管理
 */
public interface ProductRabbitConfig {

    String QUEUE_NAME_PRODUCTADD="productAdd";

    String EXCHANGE_NAME1="exchange1";

    String PRODUCT_SEARCH_EXCHANGE="product_search_exchange";

    String QUEUE_NAME_PRODUCTDEL="productDel";

    String USER_CART_EXCHANGE = "user_cart_exchange";

    String QUEUE_NAME_MERGECART = "mergecart";
}

消息中间件主要有两个角色

生产者

首先是生产者,在生产者中,通过rabbitTemplate的convertAndSend()方法发送异步消息至对列中, 具体实现如下:
首先需要在pom文件中引入依赖

		<!--引入中间件的依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>

然后需要在生产者中配置交换机。

@Component
public class RabbitMQConfig {

    @Bean
    public TopicExchange getExchange(){
        return new TopicExchange(ProductRabbitConfig.PRODUCT_SEARCH_EXCHANGE,true,false);
    }
}

交换机配置完成后,再在生产者的方法中,发送消息到队列

rabbitTemplate.convertAndSend(ProductRabbitConfig.USER_CART_EXCHANGE,"merge_cart",request);

至此,生产者中的事已经完成了。

消费者

与生产者一样,首先需要引入rabbitMQ的依赖,如上。
其次,创建一个配置文件,与生产者不同的是,消费者需要声明队列,交换机以及将两者绑定在一起。

@Configuration
public class RabbitMQConfig {

    @Bean
    public Queue getQueue(){
        return new Queue(ProductRabbitConfig.QUEUE_NAME_PRODUCTADD,false,false,false);
    }

    @Bean
    public TopicExchange getExchange(){
        return new TopicExchange(ProductRabbitConfig.PRODUCT_SEARCH_EXCHANGE,true,false);
    }

    @Bean
    public Binding bind(Queue getQueue,TopicExchange exchange){
        return BindingBuilder.bind(getQueue).to(exchange).with("product.add");
    }

    @Bean
    public Queue getDelQueue(){
        return new Queue(ProductRabbitConfig.QUEUE_NAME_PRODUCTDEL,false,false,false);
    }

    @Bean
    public Binding bind1(Queue getDelQueue,TopicExchange exchange){
        return BindingBuilder.bind(getDelQueue).to(exchange).with("product.del");
    }
}

这里需要注意的是:
1,一个交换机可以绑定多个队列,但是在绑定时,因为没有给@bean指定名称,所以默认按照方法名称自动注入队列,比如方法名称是getQueue,那么在spring眼里,自动注入的队列名称就是getQueue,所以如果需要配置多条队列时,绑定交换机时需要注意队列不要弄错了!!
2,创建交换机时,durable(持久化),autodelete(自动删除)参数一定要和生产者中对应的交换机参数一致,否则会报错.

最后,建议再在创建一个单独用来处理消息队列的类,这样会比较清晰

@Component
public class ProductComsumer {

    @Reference
    private ISearchService searchService;


    @RabbitListener(queues = ProductRabbitConfig.QUEUE_NAME_PRODUCTADD)
    @RabbitHandler
    public void recv(Long id){
        searchService.updateData(id);
        System.out.println("更新成功!");
    }

    @RabbitListener(queues = ProductRabbitConfig.QUEUE_NAME_PRODUCTDEL)
    @RabbitHandler
    public void del(Long id){
        searchService.delById(id);
    }
}

以上

基于python实现的粒子群的VRP(车辆配送路径规划)问题建模求解+源码+项目文档+算法解析,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档 算法设计的关键在于如何向表现较好的个体学习,标准粒子群算法引入惯性因子w、自我认知因子c1、社会认知因子c2分别作为自身、当代最优解和历史最优解的权重,指导粒子速度和位置的更新,这在求解函数极值问题时比较容易实现,而在VRP问题上,速度位置的更新则难以直接采用加权的方式进行,一个常见的方法是采用基于遗传算法交叉算子的混合型粒子群算法进行求解,这里采用顺序交叉算子,对惯性因子w、自我认知因子c1、社会认知因子c2则以w/(w+c1+c2),c1/(w+c1+c2),c2/(w+c1+c2)的概率接受粒子本身、当前最优解、全局最优解交叉的父代之一(即按概率选择其中一个作为父代,不加权)。 算法设计的关键在于如何向表现较好的个体学习,标准粒子群算法引入惯性因子w、自我认知因子c1、社会认知因子c2分别作为自身、当代最优解和历史最优解的权重,指导粒子速度和位置的更新,这在求解函数极值问题时比较容易实现,而在VRP问题上,速度位置的更新则难以直接采用加权的方式进行,一个常见的方法是采用基于遗传算法交叉算子的混合型粒子群算法进行求解,这里采用顺序交叉算子,对惯性因子w、自我认知因子c1、社会认知因子c2则以w/(w+c1+c2),c1/(w+c1+c2),c2/(w+c1+c2)的概率接受粒子本身、当前最优解、全局最优解交叉的父代之一(即按概率选择其中一个作为父代,不加权)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值