1. 편안한 요청을 시작하고 요청 매개변수에 따라 다양한 이벤트를 게시합니다.
2. 이벤트 리스너는 이벤트를 청취한 후 예약된 작업을 수행합니다.
3. 이 예는 이벤트 동기 처리 메커니즘입니다. 즉, 이벤트가 해제된 후 이벤트가 동기적으로 모니터링됩니다.
org.springframework.context.ApplicationEvent 클래스를 사용하세요.
org.springframework.context.ApplicationListener, 이벤트 리스너 인터페이스.
org.springframework.context.ApplicationEventPublisher, 이벤트 게시자 인터페이스.
이벤트 객체는 ApplicationEvent를 구현합니다.
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; } }
ExampleLocalApplicationEvent는 필요에 따라 속성을 확장할 수 있는 추상 클래스인 exampleApplicationEvent의 구현 클래스입니다.
public class ExampleLocalApplicationEvent extends ExampleApplicationEvent { public ExampleLocalApplicationEvent(Object eventData) { super(eventData); } public ExampleLocalApplicationEvent(Object eventData, String eventType) { super(eventData, eventType); } }
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; } }
이벤트 리스너에는 인터페이스와 추상 클래스가 포함됩니다.
IEventListener는 ApplicationListener 인터페이스를 상속합니다.
@SuppressWarnings("rawtypes") public interface IEventListener extends ApplicationListener { }
추상 클래스인 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); }
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()); } }
이벤트 리스너에는 인터페이스와 구현 클래스가 포함됩니다.
IEventPublisher, 사용자 정의 이벤트 게시 인터페이스로 기능 및 속성 확장에 편리합니다.
public interface IEventPublisher { boolean publish(ExampleApplicationEvent event); }
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; } }
Restful 요청을 사용하여 이벤트를 트리거하세요.
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(); } }
데이터 개체인 OrderInfo가 이벤트 개체에 전달됩니다.
@Data @NoArgsConstructor public class OrderInfo { private String userName; private String tradeName; private String receiveTime; }
ResultObj, Restful은 공통 객체를 반환합니다.
@Data @NoArgsConstructor @AllArgsConstructor @Builder public class ResultObj { private String code; private String message; }
URL 요청: http://127.0.0.1:8080/server/event/f1
입력 매개변수:
{ "userName": "HangZhou", "tradeName": "Vue进阶教程", "flag": "add" }
반환 값:
{ "code": "200", "message": "成功" }
출력 로그:
위 내용은 SpringBoot를 기반으로 ApplicationEvent를 적용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!