引入依赖
<!--引入消息中间件的依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
配置
rabbitmq:
host: 192.168.142.137
port: 5672
username: java1907
password: 123
virtual-host: /java1907
生产者
@Controller
@RequestMapping("product")
public class ProductController {
//启动时检查机制
@Reference(check = false)
private IProductService productService;
@Autowired
private RabbitTemplate rabbitTemplate;
@RequestMapping("get/{id}")
@ResponseBody
public TProduct getById(@PathVariable("id") Long id){
return productService.selectByPrimaryKey(id);
}
@RequestMapping("list")
public String list(Model model){
//1.获取数据
List<TProduct> list = productService.list();
model.addAttribute("list",list);
//pageInfo
//2.展示页面
return "product/list";
}
@RequestMapping("page/{pageIndex}/{pageSize}")
public String page(Model model,
@PathVariable("pageIndex") Integer pageIndex,
@PathVariable("pageSize") Integer pageSize){
//1.获取数据
PageInfo<TProduct> page = productService.page(pageIndex, pageSize);
model.addAttribute("page",page);
//2.展示页面
return "product/list";
}
@PostMapping("add")
public String add(ProductVO vo){
//处理核心业务逻辑:T1
Long newId = productService.add(vo);
//发送一个消息到消息中间件
//map.put("type","add");
//map.put("data",newId);
rabbitTemplate.convertAndSend(MQConstant.EXCHANGE.CENTER_PRODUCT_EXCHANGE,"product.add",newId);
//product.a
//跳转回到第一页 展示的时候,按照添加时间排序
return "redirect:/product/page/1/1";
}
}
消费者服务
配置
rabbitmq:
host: 192.168.142.137
port: 5672
username: java1907
password: 123
virtual-host: /java1907
@Component
@RabbitListener(queues = "center-product-exchange-search-queue")
@Slf4j
public class CenterProductHandler {
//1.声明队列 center-product-exchange-search-queue
//2.绑定交换机
//借助管理平台来实现
@Reference
private ISearchService searchService;
@RabbitHandler
public void process(Long newId){
log.info("处理了id为:{}的消息",newId);
searchService.synById(newId);
}
}
用代码创建交换机
生产者RabbitConfig类
@Configuration
public class RabbitConfig {
@Bean
public TopicExchange initProductExchange(){
TopicExchange productExchange = new TopicExchange(
MQConstant.EXCHANGE.CENTER_PRODUCT_EXCHANGE,true,false);
return productExchange;
}
}
@Configuration
public class RabbitConfig {
@Bean
public TopicExchange initProductExchange(){
TopicExchange productExchange = new TopicExchange(
MQConstant.EXCHANGE.CENTER_PRODUCT_EXCHANGE,true,false);
return productExchange;
}
}
public interface MQConstant {
public static class EXCHANGE{
public static final String CENTER_PRODUCT_EXCHANGE = "center-product-exchange";
}
public static class QUEUE{
public static final String CENTER_PRODUCT_EXCHANGE_SEARCH_QUEUE = "center-product-exchange-search-queue";
}
}
消费者RabbitConfig类
@Configuration
public class RabbitConfig {
//1.声明队列
@Bean
public Queue initProductSearchQueue(){
Queue queue = new Queue(
MQConstant.QUEUE.CENTER_PRODUCT_EXCHANGE_SEARCH_QUEUE,true,false,false);
return queue;
}
//2.绑定交换机
@Bean
public TopicExchange initProductExchange(){
TopicExchange productExchange = new TopicExchange(
MQConstant.EXCHANGE.CENTER_PRODUCT_EXCHANGE,true,false);
return productExchange;
}
//将队列和交换机绑定
@Bean
public Binding bindProductSearchQueueToProductExchange(
Queue initProductSearchQueue,TopicExchange initProductExchange){
return BindingBuilder.bind(initProductSearchQueue).to(initProductExchange).with("product.add");
}
}
服务的调用都是发生在web层(control层)
这里的场景是,商品服务增加了往Mysql里一个商品,通过MQ去通知搜索服务,搜索服务去将Mysql的数据增量同步到solar;