springboot整合mybatis和rabbitMQ的框架搭建非常简单,分三步,第一步使用idea工具创建一个springboot工程,第二步在application.yml文件中配置相关信息,第三步在springboot启动类上面加注解。
创建工程好之后,将application.properties改为application.yml(个人喜好yml文件,当然喜欢什么用什么),添加如下配置
AmqpTemplate
的配置
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
以上环境就搭建好了,我们可以把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就可以了;
在application.yml文件中添加如下配置
spring:
rabbitmq:
host: 127.0.0.1
username: guest
password: guest
virtual-host: /
创建一个UserListener类和User的pojo类
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服务
启动两个服务
更新前id为1的user信息
在浏览器输入http://localhost:8082/user/update/1
消息消费者拿到更新后的id为1的user信息
数据库中id为1的user信息
博主第一次写博客,怀着紧张的心情写完整篇,我知道其中的内容还有很多不够详细,欢迎各位大佬批评指正