新建springboot 项目,并引入相关jar包
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.8</version>
<relativePath/>
</parent>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>demo</description>
<properties>
<java.version>8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>2.0.19</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-jdk8</artifactId>
<version>1.5.3.Final</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.5.3.Final</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.5.3.Final</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>31.1-jre</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
事件枚举
public enum EventEnum {
CREATE, UPDATE, DELETE;
}
基础事件抽象类
public abstract class BaseEvent<T> {
protected T eventBody;
public abstract EventEnum eventEnum();
public T getEventBody() {
return eventBody;
}
}
具体事件对象 继承基础事件类
@Data
public class CreateUserEvent extends BaseEvent<CreateUserBody> implements Serializable {
private static final long serialVersionUID = -480903878592339177L;
public CreateUserEvent(CreateUserBody eventBody){
this.eventBody = eventBody;
}
@Override
public EventEnum eventEnum() {
return EventEnum.CREATE;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public static class CreateUserBody implements Serializable{
private static final long serialVersionUID = 1141259681214521565L;
private String id;
private String name;
private Integer age;
private String sex;
private Byte status;
}
}
@Data
public class DeleteUserEvent extends BaseEvent<DeleteUserBody> implements Serializable {
private static final long serialVersionUID = 7348375017273944634L;
public DeleteUserEvent(DeleteUserBody eventBody){
this.eventBody = eventBody;
}
@Override
public EventEnum eventEnum() {
return EventEnum.DELETE;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public static class DeleteUserBody implements Serializable{
private static final long serialVersionUID = 8808139058044632107L;
private String id;
}
}
@Data
public class UpdateUserEvent extends BaseEvent<UpdateUserBody> implements Serializable {
private static final long serialVersionUID = 50119101187345661L;
public UpdateUserEvent(UpdateUserBody eventBody){
this.eventBody = eventBody;
}
@Override
public EventEnum eventEnum() {
return EventEnum.UPDATE;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public static class UpdateUserBody implements Serializable{
private static final long serialVersionUID = 2315579119680949654L;
private String id;
private String name;
private Integer age;
private String sex;
private Byte status;
}
}
实体
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class User {
private String id;
private String name;
private Integer age;
private String sex;
private Byte status;
}
convert
@Mapper
public interface UserConverter {
UserConverter INSTANCE = Mappers.getMapper(UserConverter.class);
User createUserBody2User(CreateUserEvent.CreateUserBody createUserBody);
User updateUserBody2User(UpdateUserEvent.UpdateUserBody updateUserBody);
CreateUserEvent.CreateUserBody user2CreateUserBody(User user);
UpdateUserEvent.UpdateUserBody user2UpdateUserBody(User user);
}
service
public interface UserService {
Integer save(User user);
Integer remove(String id);
Integer update(User user);
}
@Service
public class UserServiceImpl implements UserService {
@Override
public Integer save(User user) {
System.out.println("save : "+JSON.toJSONString(user));
return 0;
}
@Override
public Integer remove(String id) {
System.out.println("remove : "+id);
return 0;
}
@Override
public Integer update(User user) {
System.out.println("update : "+JSON.toJSONString(user));
return 0;
}
}
事件处理器(监听器)
@Component
@Slf4j
public class UserEventHandler {
@Autowired
private UserService userService;
@Resource
private EventBus userEventBus;
@PostConstruct
public void registerEventListener() {
userEventBus.register(this);
}
private UserConverter userConverter = UserConverter.INSTANCE;
@Async
@Subscribe
public void handleEvent(BaseEvent<?> event){
if (Objects.isNull(event.eventEnum())) {
log.warn("UserEventHandler.handleEvent(event), event is null ; " + "system.time : " + System.currentTimeMillis());
return;
}
switch (event.eventEnum()){
case CREATE:
CreateUserBody createUserBody = (CreateUserBody)event.getEventBody();
userService.save(userConverter.createUserBody2User(createUserBody));
break;
case UPDATE:
UpdateUserBody updateUserBody = (UpdateUserBody)event.getEventBody();
userService.update(userConverter.updateUserBody2User(updateUserBody));
break;
case DELETE:
DeleteUserBody deleteUserBody = (DeleteUserBody)event.getEventBody();
userService.remove(deleteUserBody.getId());
break;
default:
log.info("event.eventEnum() : " + event.eventEnum() + ", Event of EventEnum not in (" + EventEnum.CREATE + ", " + EventEnum.UPDATE + ", " + EventEnum.DELETE + " )");
break;
}
}
}
注册事件处理器
@Configuration
public class UserEventConfig {
@Bean
@ConditionalOnMissingBean(name = "userEventBus")
public EventBus userEventBus() {
return new EventBus("user-eventbus");
}
}
测试
@SpringBootTest
class DemoApplicationTests {
@Resource
private EventBus userEventBus;
@Test
public void test() {
userEventBus.post(new CreateUserEvent(new CreateUserBody("1", "test", 6, "1", (byte)0)));
userEventBus.post(new UpdateUserEvent(new UpdateUserBody("1", "test-update", 6, "1", (byte)0)));
userEventBus.post(new DeleteUserEvent(new DeleteUserBody("1")));
}
}