springboot篇】二十一. 基于springboot电商项目 六 整合RabbitMQ

中国加油,武汉加油!

篇幅较长,配合目录观看

案例准备

  1. 本案例基于springboot篇】二十一. 基于springboot电商项目 五 FreeMarker生成商品页面
  2. gitee地址 https://gitee.com/springboot-dubbo/nz1904-springboot-shop-05

1. springboot整合rabbitmq

1.1 shop-temp新建springboot-rabbitmq-provider(module-springboot)

  1. Spring Boot DevTools
  2. Lombok
  3. Spring Web

1.2 导相关依赖

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

1.3 编写yml

spring:
  rabbitmq:
    host: 192.168.59.100
    virtual-host: /

1.4 编写RabbitMQConfig

package com.wpj.config;

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

@Configuration
public class RabbitMQConfig {

    // 创建交换机
    @Bean
    public FanoutExchange fanoutExchange(){
        return new FanoutExchange("myExchange");
    }
    // 创建队列
    @Bean
    public Queue queue1(){
        return new Queue("queue1");
    }
    @Bean
    public Queue queue2(){
        return new Queue("queue2");
    }
    // 绑定
    @Bean
    public Binding queue1ToExchange(){
        return BindingBuilder.bind(queue1()).to(fanoutExchange());
    }
    @Bean
    public Binding queue2ToExchange(){
        return BindingBuilder.bind(queue2()).to(fanoutExchange());
    }
}

1.5 修改程序入口

package com.wpj;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication(scanBasePackages = "com.wpj")
public class SpringbootRabbitmqProviderApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootRabbitmqProviderApplication.class, args);
    }

}

1.6 Test

package com.wpj;

import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@SpringBootTest
@RunWith(SpringRunner.class)
class SpringbootRabbitmqProviderApplicationTests {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    @Test
    public void testRabbitMQ() {
        String str = "hello";
        rabbitTemplate.convertAndSend("myExchange","",str);
    }
}

1.7 shop-temp新建springboot-rabbitmq-consumer(module-springboot)

  1. Spring Web

1.8 导包

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

1.9 编写yml

spring:
  rabbitmq:
    host: 192.168.59.100
    virtual-host: /

1.10 编写QueueConsumer

package com.wpj.listener;

import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.context.annotation.Configuration;

@Configuration
public class QueueConsumer {
    @RabbitListener(queues = "queue1")
    public void queue1(String msg){
        System.out.println("queue1" + msg);
    }
    @RabbitListener(queues = "queue2")
    public void queue12(String msg){
        System.out.println("queue2" + msg);
    }
}

1.11 启动程序入口

package com.wpj;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication(scanBasePackages = "com.wpj")
public class SpringbootRabbitmqConsumerApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootRabbitmqConsumerApplication.class, args);
    }
}

在这里插入图片描述

2. 整合RabbitMQ到项目中

2.1 good-service

2.1.1 添加依赖

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

2.1.2 配置yml

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/nz1904-springboot-shop?characterEncoding=UTF8
    username: root
    password: 123456
    driver-class-name: com.mysql.jdbc.Driver
  rabbitmq:
    host: 192.168.59.100
    virtual-host: /
    
mybatis-plus:
  type-aliases-package: com.wpj.entity
  mapper-locations: classpath:/mapper/*.xml

dubbo:
  application:
    name: goods-service
  registry:
    address: zookeeper://192.168.59.100:2181
  protocol:
    port: -1

2.1.3 编写RabbitMQConfig

package com.wpj.config;

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.FanoutExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RabbitMQConfig {

    @Bean
    public FanoutExchange fanoutExchange(){
        return new FanoutExchange("goods-exchange");
    }
    @Bean
    public Queue solrQueue(){
        return new Queue("solrQueue");
    }
    @Bean
    public Queue itemQueue(){
        return new Queue("itemQueue");
    }
    @Bean
    public Binding solrQueueToExchange(){
        return BindingBuilder.bind(solrQueue()).to(fanoutExchange());
    }
    @Bean
    public Binding itemQueueToExchange(){
        return BindingBuilder.bind(itemQueue()).to(fanoutExchange());
    }
}

2.1.4 修改GoodServiceImpl

package com.wpj.service.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.baomidou.mybatisplus.mapper.BaseMapper;
import com.wpj.entity.Goods;
import com.wpj.mapper.IGoodsMapper;
import com.wpj.service.IGoodService;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;

@Service
public class GoodsServiceImpl extends BaseServiceImpl<Goods> implements IGoodService {

    @Autowired
    private IGoodsMapper iGoodsMapper;

    @Override
    public BaseMapper<Goods> getMapper() {
        return iGoodsMapper;
    }

    @Autowired
    private RabbitTemplate rabbitTemplate;

    @Override
    public int insert(Goods goods) {
        int insert = super.insert(goods);
        // 给交换机添加消息
        rabbitTemplate.convertAndSend("goods-exchange","", goods);
        return insert;
    }
}

2.2 search-service

2.2.1 添加依赖

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

2.2.2 配置yml

dubbo:
  registry:
    address: zookeeper://192.168.59.100:2181
  application:
    name: search-service
  protocol:
    port: -1

spring:
  data:
    solr:
      host: http://192.168.59.100:8983/solr/mycollection
  rabbitmq:
    host: 192.168.59.100
    virtual-host: /

2.2.3 编写RabbitMQConfig

package com.wpj.config;

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.FanoutExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RabbitMQConfig {
    @Bean
    public FanoutExchange fanoutExchange(){
        return new FanoutExchange("goods-exchange");
    }
    @Bean
    public Queue solrQueue(){
        return new Queue("solrQueue");
    }
    @Bean
    public Binding solrQueueToExchange(){
        return BindingBuilder.bind(solrQueue()).to(fanoutExchange());
    }
}

2.2.4 编写SolrQueueListener

package com.wpj.listener;

import com.wpj.entity.Goods;
import org.apache.solr.client.solrj.SolrClient;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.common.SolrInputDocument;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;

import java.io.IOException;

@Configuration
public class SolrQueueListener {

    @Autowired
    private SolrClient solrClient;

    @RabbitListener(queues = "solrQueue")
    public void solrQueue(Goods goods){
        SolrInputDocument document = new SolrInputDocument();
        document.addField("id",goods.getId());
        document.setField("gname", goods.getGname());
        document.setField("gdesc", goods.getGdesc());
        document.setField("gpic", goods.getGpic());
        document.setField("gprice", goods.getGprice().toString());
        try {
            solrClient.add(document);
            solrClient.commit();
        } catch (SolrServerException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

2.3 shop-item

2.3.1 添加依赖

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

2.3.2 配置yml

server:
  port: 8083
  
dubbo:
  application:
    name: item-web
  registry:
    address: zookeeper://192.168.59.100:2181
    check: false
  consumer:
    check: false
    retries: 3
spring:
  rabbitmq:
    host: 192.168.59.100
    virtual-host: /

2.3.3 编写RabbitMQConfig

package com.wpj.config;

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.FanoutExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RabbitMQConfig {

    @Bean
    public FanoutExchange fanoutExchange(){
        return new FanoutExchange("goods-exchange");
    }
    @Bean
    public Queue itemQueue(){
        return new Queue("itemQueue");
    }
    @Bean
    public Binding itemQueueToExchange(){
        return BindingBuilder.bind(itemQueue()).to(fanoutExchange());
    }
}

2.3.4 编写ItemQueueListener

package com.wpj.listener;

import com.alibaba.dubbo.config.annotation.Reference;
import com.wpj.controller.ItemController;
import com.wpj.entity.Goods;
import com.wpj.service.IGoodService;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.HashMap;
import java.util.Map;

@Configuration
public class ItemQueueListener {

    @Reference
    private IGoodService goodService;

    @Autowired
    private freemarker.template.Configuration configuration;

    @RabbitListener(queues = "itemQueue")
    public void itemQueue(Goods goods){
        // 图片的集合
        String[] split = goods.getGpic().split("\\|");
        // 把数据放到Map中
        Map<String,Object> map = new HashMap<>();
        map.put("goods",goods);
        map.put("picList",split);
        map.put("contextPath","/");
        // 得到模板
        Template template = null;
        Writer writer =null;
        try {
            template = configuration.getTemplate("goodsItem.ftl");
            // 设置静态页面输出的目录
            String staticPath = ItemController.class.getClassLoader().getResource("static").getPath();
            File file = new File(staticPath+File.separator+"goods");
            // 不存在创建目录
            if(!file.exists()){
                file.mkdir();
            }
            // 生成页面
            writer = new FileWriter(file.getAbsolutePath()+File.separator+goods.getId()+".html");
            template.process(map,writer);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (TemplateException e) {
            e.printStackTrace();
        }finally {
            try {
                writer.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

3. 校验

  1. localhost:8080 进去添加商品
  2. localhost:8081 进入查找商品
  3. 点进去新增的商品进入生成的页面
发布了126 篇原创文章 · 获赞 18 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/TheNew_One/article/details/105209674