springboot整合mybatis和rabbitMQ实例

springboot整合mybatis和rabbitMQ的一个小例子

消息生产者服务搭建

springboot整合mybatis和rabbitMQ的框架搭建非常简单,分三步,第一步使用idea工具创建一个springboot工程,第二步在application.yml文件中配置相关信息,第三步在springboot启动类上面加注解。
springboot整合mybatis和rabbitMQ实例_第1张图片
springboot整合mybatis和rabbitMQ实例_第2张图片创建工程好之后,将application.properties改为application.yml(个人喜好yml文件,当然喜欢什么用什么),添加如下配置

  • template:有关AmqpTemplate的配置
    • exchange:缺省的交换机名称,此处配置后,发送消息如果不指定交换机就会使用这个
spring:
  datasource:
    #driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC
    username: root
    password: 123456
  rabbitmq:
    host: 127.0.0.1
    username: guest
    password: guest
    virtual-host: /
    template:
      exchange: LSL.EXCHANGE


mybatis:
  type-aliases-package: com.lsl.rabbitmq.topic.pojo
server:
  port: 8082

springboot整合mybatis和rabbitMQ实例_第3张图片
以上环境就搭建好了,我们可以把controller包,dao包,pojo包,service包都创建好

编写各层代码

创建user的pojo类

public class User implements Serializable {
    private Integer id;
    private String username;
    private String password;
    private String name;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", name='" + name + '\'' +
                '}';
    }

编写controller代码

@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserService userService;
    @GetMapping("/update/{id}")
    public String updateUser(@PathVariable("id")Integer id){
        userService.updateUser(id);
        return "更新成功";
    }
}

编写service代码

@Service
public class UserService {
    @Autowired
    private AmqpTemplate amqpTemplate;
    @Autowired
    private UserDao userDao;
    public void updateUser(Integer id){
        User user=userDao.queryUserById(id);
        user.setUsername("秦雁回");
        user.setPassword("1234556");
        user.setName("阿卢");
        userDao.updateUser(user);
        sendMsg("update",user);
    }
    private void sendMsg(String type, User user){
        try {
            amqpTemplate.convertAndSend("user."+type, JSON.toJSONString(user));
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

这里没有指定交换机,因此默认发送到了配置中的:LSL.EXCHANGE
注意:这里要把所有异常都try起来,不能让消息的发送影响到正常的业务逻辑

我们要明白消息什么时候需要发,当对user进行写操作:增、删、改的时候,需要发送一条消息,通知其它服务。
发送什么内容?对user的增删改时其它服务可能需要新的user数据,但是如果消息内容中包含全部user信息,数据量可能太大,而且并不是每个服务都需要全部的信息。因此我们可以只发送user的id,其它服务可以根据id查询自己需要的信息。但是后面我创建的服务不涉及对数据库的操作,我这里就发送了user的全部信息。使用JSON对象需要引入依赖

<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>fastjson</artifactId>
			<version>1.2.28</version>
		</dependency>

编写dao代码

public interface UserDao {
    @Delete("delete from user where id=#{id}")
    void deleteUserById(Integer id);
    @Update("update user set username=#{username},password=#{password},name=#{name} where id=#{id}")
    void updateUser(User user);
    @Select("select * from user where id=#{id}")
    User queryUserById(Integer id);
}

如上我们就完成了一个消息生产者的服务接口的编写

消息消费者服务搭建

消息消费者项目同样使用idea工具创建一个springboot工程,引入的依赖为web和rabbitMQ就可以了;
springboot整合mybatis和rabbitMQ实例_第4张图片
springboot整合mybatis和rabbitMQ实例_第5张图片
在application.yml文件中添加如下配置

spring:
  rabbitmq:
    host: 127.0.0.1
    username: guest
    password: guest
    virtual-host: /

创建一个UserListener类和User的pojo类
springboot整合mybatis和rabbitMQ实例_第6张图片
UserListener.class代码

@Component
public class UserListener {
  @RabbitListener(bindings = @QueueBinding(
          value = @Queue(value = "LSL.USER.UPDATE.QUEUE",durable = "true"),
          exchange = @Exchange(value = "LSL.EXCHANGE",ignoreDeclarationExceptions = "true",type = ExchangeTypes.TOPIC),
          key = "user.update"
  ))
  public void updateUserListener(String userJson){
        if (userJson==null){
            return;
        }
      User user=JSON.parseObject(userJson, new TypeReference<User>(){});
      System.out.println(user);
  }
}

要使用JSON对象需要引入fastjson依赖,上面有坐标
user类与消息生产者中的user类一致,可以直接拷贝到消息消费者中

如上我们就完成了消息消费者项目的搭建与代码编写,当我们启动两个服务,启动rabbitMQ服务之后,在浏览器输入http://localhost:8082/user/update/1后,就会去数据库更新user表中id为1的user信息,当消息生产者服务中id为1的user信息变化之后,消息消费者服务中会拿到更新后的id为1的user信息,即完成了数据同步。

启动服务

启动rabbitMQ服务
springboot整合mybatis和rabbitMQ实例_第7张图片
启动两个服务
springboot整合mybatis和rabbitMQ实例_第8张图片
更新前id为1的user信息
springboot整合mybatis和rabbitMQ实例_第9张图片
在浏览器输入http://localhost:8082/user/update/1
springboot整合mybatis和rabbitMQ实例_第10张图片
消息消费者拿到更新后的id为1的user信息
springboot整合mybatis和rabbitMQ实例_第11张图片
数据库中id为1的user信息
springboot整合mybatis和rabbitMQ实例_第12张图片
博主第一次写博客,怀着紧张的心情写完整篇,我知道其中的内容还有很多不够详细,欢迎各位大佬批评指正

你可能感兴趣的:(springboot整合mybatis和rabbitMQ实例)