>  기사  >  Java  >  SpringBoot를 기반으로 ApplicationEvent를 적용하는 방법

SpringBoot를 기반으로 ApplicationEvent를 적용하는 방법

王林
王林앞으로
2023-05-14 22:01:041622검색

1. 사례 시나리오

1. 편안한 요청을 시작하고 요청 매개변수에 따라 다양한 이벤트를 게시합니다.

2. 이벤트 리스너는 이벤트를 청취한 후 예약된 작업을 수행합니다.

3. 이 예는 이벤트 동기 처리 메커니즘입니다. 즉, 이벤트가 해제된 후 이벤트가 동기적으로 모니터링됩니다.

2. spring의 이벤트 객체인

org.springframework.context.ApplicationEvent 클래스를 사용하세요.

org.springframework.context.ApplicationListener, 이벤트 리스너 인터페이스.

org.springframework.context.ApplicationEventPublisher, 이벤트 게시자 인터페이스.

3. 코드

1. 이벤트 객체

이벤트 객체는 ApplicationEvent를 구현합니다.

1.1 exampleApplicationEvent

ExampleApplicationEvent, 추상 클래스입니다. ApplicationEvent를 상속하고 마이크로서비스에 필요한 일부 속성을 사용자 정의하고 확장합니다.

public abstract class ExampleApplicationEvent extends ApplicationEvent {
  private static final String eventSource = "Example";
  private String eventType = null;
  private Object eventData = null;
  public ExampleApplicationEvent(Object eventData) {
      super(eventSource);
      this.eventData = eventData;
  }
  public ExampleApplicationEvent(Object eventData, String eventType) {
      super(eventSource);
      this.eventData = eventData;
      this.eventType = eventType;
  }
  public String getEventType() {
      return eventType;
  }
  public Object getEventData() {
      return eventData;
  }
}
1.2 예제LocalApplicationEvent

ExampleLocalApplicationEvent는 필요에 따라 속성을 확장할 수 있는 추상 클래스인 exampleApplicationEvent의 구현 클래스입니다.

public class ExampleLocalApplicationEvent extends ExampleApplicationEvent {
  public ExampleLocalApplicationEvent(Object eventData) {
      super(eventData);
  }
  public ExampleLocalApplicationEvent(Object eventData, String eventType) {
      super(eventData, eventType);
  }
}
1.3 EventTypeEnum

EventTypeEnum, 사용자 정의 이벤트 유형 열거형, 요청 시 확장됨.

public enum EventTypeEnum {
  CHANGE("change", "变更事件"),
  ADD("add", "新增事件");
  private String id;
  private String name;
  public String getId() {
   return id;
  }
  public String getName() {
   return name;
  }
  EventTypeEnum(String id, String name) {
   this.id = id;
   this.name = name;
  }
  public static EventTypeEnum getEventTypeEnum(String id) {
   for (EventTypeEnum var : EventTypeEnum.values()) {
       if (var.getId().equalsIgnoreCase(id)) {
           return var;
       }
   }
   return null;
  }
}

2. 이벤트 리스너

이벤트 리스너에는 인터페이스와 추상 클래스가 포함됩니다.

2.1 인터페이스인 IEventListener

IEventListener는 ApplicationListener 인터페이스를 상속합니다.

@SuppressWarnings("rawtypes")
public interface IEventListener extends ApplicationListener {
}
2.2 AbstractEventListener

추상 클래스인 AbstractEventListener는 IEventListener 인터페이스를 구현합니다. 그리고 클래스 확장 및 코드 분리를 용이하게 하는 추상 메서드를 제공합니다.

public abstract  class AbstractEventListener implements IEventListener {
 @Override
 public void onApplicationEvent(ApplicationEvent event){
  if(!(event instanceof ExampleApplicationEvent)){
    return;
  }
  ExampleApplicationEvent exEvent = (ExampleApplicationEvent) event;
  try{
    onExampleApplicationEvent(exEvent);
  }catch (Exception e){
    e.printStackTrace();
  }
 }
 protected abstract void onExampleApplicationEvent(ExampleApplicationEvent event);
}
2.3 OrderEventListener

OrderEventListener는 추상 클래스 AbstractEventListener를 구현합니다. 이벤트를 듣고 처리하는 비즈니스 수업입니다.

@Slf4j
@Component
public class OrderEventListener extends AbstractEventListener {
  @Override
  protected void onExampleApplicationEvent(ExampleApplicationEvent event) {
   log.info("OrderEventListener->onSpApplicationEvent,监听事件.");
   Object eventData = event.getEventData();
   log.info("事件类型: " + EventTypeEnum.getEventTypeEnum(event.getEventType()));
   log.info("事件数据: " + eventData.toString());
  }
}

3. 이벤트 게시자

이벤트 리스너에는 인터페이스와 구현 클래스가 포함됩니다.

3.1 IEventPublisher

IEventPublisher, 사용자 정의 이벤트 게시 인터페이스로 기능 및 속성 확장에 편리합니다.

public interface IEventPublisher {
    boolean publish(ExampleApplicationEvent event);
}
3.2 LocalEventPublisher

LocalEventPublisher, 이벤트 게시 구현 클래스, 이 클래스는 @Component를 사용하며 Spring의 IOC 컨테이너는 이 클래스를 로드합니다. 이 클래스는 ApplicationEventPublisher의PublishEvent를 호출하여 이벤트를 게시합니다.

@Slf4j
@Component("localEventPublisher")
public class LocalEventPublisher implements IEventPublisher {
  @Override
  public boolean publish(ExampleApplicationEvent event) {
    try{
      log.info("LocalEventPublisher->publish,发布事件.");
      log.info("事件类型: " + EventTypeEnum.getEventTypeEnum(event.getEventType()));
      log.info("事件数据: " + event.getEventData().toString());
      SpringUtil.getApplicationContext().publishEvent(event);
    }catch (Exception e){
      log.info("事件发布异常.");
      e.printStackTrace();
      return false;
    }
    return true;
  }
}

4.Restful 요청이 이벤트를 트리거합니다

Restful 요청을 사용하여 이벤트를 트리거하세요.

4.1 EventController

EventController는 Restful 요청을 받습니다.

@Slf4j
@RestController
@RequestMapping("/event")
public class EventController {
  @Autowired
  private LocalEventPublisher eventPublisher;
  @PostMapping("/f1")
  public Object f1(@RequestBody Object obj) {
   log.info("EventController->f1,接收参数,obj = " + obj.toString());
   Map objMap = (Map) obj;
   OrderInfo orderInfo = new OrderInfo();
   orderInfo.setUserName((String) objMap.get("userName"));
   orderInfo.setTradeName((String) objMap.get("tradeName"));
   orderInfo.setReceiveTime(DateUtil.format(new Date(),
           "yyyy-MM-dd HH:mm:ss"));
   String flag = (String) objMap.get("flag");
   if (StringUtils.equals("change", flag)) {
       eventPublisher.publish(new ExampleLocalApplicationEvent(orderInfo,
               EventTypeEnum.CHANGE.getId()));
   } else if (StringUtils.equals("add", flag)) {
       eventPublisher.publish(new ExampleLocalApplicationEvent(orderInfo,
               EventTypeEnum.ADD.getId()));
   } else {
       eventPublisher.publish(new ExampleLocalApplicationEvent(orderInfo));
   }
   log.info("EventController->f1,返回.");
   return ResultObj.builder().code("200").message("成功").build();
  }
}
4.2 OrderInfo

데이터 개체인 OrderInfo가 이벤트 개체에 전달됩니다.

@Data
@NoArgsConstructor
public class OrderInfo {
  private String userName;
  private String tradeName;
  private String receiveTime;
}
4.3 ResultObj

ResultObj, Restful은 공통 객체를 반환합니다.

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class ResultObj {
    private String code;
    private String message;
}

5. 테스트

5.1 정보 요청

URL 요청: http://127.0.0.1:8080/server/event/f1

입력 매개변수:

{
    "userName": "HangZhou",
    "tradeName": "Vue进阶教程",
    "flag": "add"
}

반환 값:

{
    "code": "200",
    "message": "成功"
}
5.2 로그

출력 로그:

SpringBoot를 기반으로 ApplicationEvent를 적용하는 방법

위 내용은 SpringBoot를 기반으로 ApplicationEvent를 적용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제