使用RabbitMQ实现商品数据同步

【生产者端】

一,添加依赖

<依赖性>

 <的groupId> org.springframework.amqp </的groupId>  

  <artifactId的>弹簧兔</ artifactId的>

</依赖性>


二,配置的applicationContext-rabbitmq.xml文件

<?xml version =“1.0” encoding =“UTF-8” ?>
 < beans xmlns =“http://www.springframework.org/schema/beans”
 xmlns:xsi =“http://www.w3.org/2001 / XMLSchema-instance“ 
 xmlns:rabbit =”http://www.springframework.org/schema/rabbit“
 xsi :schemaLocation =”http://www.springframework.org/schema/beans 
        http://www.springframework。 org / schema / beans / spring-beans.xsd 
        http://www.springframework.org/schema/rabbit 
        http://www.springframework.org/schema/rabbit/spring-rabbit.xsd“ >
 <! - 连接工厂 - >
 <                     
        :connection-factory id =“connectionFactory” host =“$ {rabbitmq.host}”
 port =“$ {rabbitmq.port}” username =“$ {rabbitmq.username}”
 password =“$ {rabbitmq.password}” virtual -host =“$ {rabbitmq.vhost}” />
 <! -  Rabbit的管理,自动管理队列和交换机 - >
 < rabbit :admin connection-factory =“connectionFactory” />
 <! - 交换机这里使用topic类型 - >
 < rabbit :topic-exchange name =“JESSES_ITEM_EXCHANGE” />
 <! -  Rabbit的模板,提供了操作消息的API,需要指定连接工厂和交换机 - >
 <兔子:模板ID                                                                      
        
        =“rabbitTemplate”
 connection-factory =“connectionFactory” exchange =“JESSES_ITEM_EXCHANGE” />
 </ beans >                     

三,写方法实现发送消息。

private void sendMessage Item item String type ){
 try {
 Map < String Object > msg = new HashMap <>();
味精“数据” 项目的getId ());
味精put “type” type );
味精“时间戳” 系统的currentTimeMillis ());
                                    
        这个rabbitTemplate convertAndSend “项目” + JsonUtils 的toString MSG ));
    } 捕获JsonProcessingException ë ){
 Ë printStackTrace ();
/ *服务层的异常一般是抛,如果尝试会无法事务回滚。
         但这里用试试。就算消息发送失败,也不应该回滚事务让修改失败。
         应该在这里进行处理。写代码重新发送。* /
 }
 }                    



【消费者端】

一,导入弹簧兔的罐包

二,配置的applicationContext-rabbitmq.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:rabbit="http://www.springframework.org/schema/rabbit"
       xsi:schemaLocation="http://www.springframework.org/schema/beans 
       http://www.springframework.org/schema/beans/spring-beans.xsd 
       http://www.springframework.org/schema/rabbit 
       http://www.springframework.org/schema/rabbit/spring-rabbit.xsd">

    <!--连接工厂-->
    <rabbit:connection-factory id="connectionFactory" host="${rabbitmq.host}"
                               port="${rabbitmq.port}" username="${rabbitmq.username}"
                               password="${rabbitmq.password}" virtual-host="${rabbitmq.vhost}" />
    <!--Rabbit的管理,自动管理队列和交换机-->
    <rabbit:admin connection-factory="connectionFactory" />
    <!--定义队列-->
    <rabbit:queue name="JESSES_WEB_ITEM_QUEUE" />
    <!--消息监听者-->
    <bean id="itemMessageListener" class="com.jesses.web.mq.listener.ItemMessageListener" />
    <rabbit:listener-container connection-factory="connectionFactory">
        <rabbit:listener ref="itemMessageListener" method="consume" 
                         queue-names="JESSES_WEB_ITEM_QUEUE"/>
    </rabbit:listener-container>
</beans>

三、写消费者实现消费消息。

package com.jesses.web.mq.listener;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.jesses.web.service.ItemService;
import org.springframework.beans.factory.annotation.Autowired;

import java.io.IOException;

/**
 * 监听商品信息的一个消费者
 */
public class ItemMessageListener {

    @Autowired
    private ItemService itemService;

    private static final ObjectMapper MAPPER=new ObjectMapper();

    //消费方法
    public void consume(String msg){
        Long itemId=0L;
        try {
            JsonNode jsonNode = MAPPER.readTree(msg);//读取传过来的字符串读成树节点
            itemId = jsonNode.get("data").asLong();//用保存时的key获取指定节点。
        } catch (IOException e) {
            e.printStackTrace();
            返回;
        }
 //删除缓存
 this itemService deleteCache itemId );
    }
 }                

PS:队列和交换机的绑定可以在配置中定义,也可以在控制面板手动去做。

手动去做可以避免日后再改代码,利于解耦合。

猜你喜欢

转载自blog.csdn.net/qq_41570691/article/details/79340113