1 Initiieren Sie eine erholsame Anfrage und veröffentlichen Sie verschiedene Ereignisse entsprechend den Anfrageparametern.
2. Der Ereignis-Listener führt nach dem Abhören des Ereignisses geplante Vorgänge aus.
3. Dieses Beispiel ist ein Mechanismus zur Ereignissynchronisierung, dh nach der Veröffentlichung des Ereignisses wird das Ereignis synchron überwacht.
org.springframework.context.ApplicationEvent, das Ereignisobjekt von Spring.
org.springframework.context.ApplicationListener, Ereignis-Listener-Schnittstelle.
org.springframework.context.ApplicationEventPublisher, Event-Publisher-Schnittstelle.
Das Ereignisobjekt implementiert ApplicationEvent.
ExampleApplicationEvent, eine abstrakte Klasse. Erben Sie ApplicationEvent und passen Sie einige in Microservices erforderliche Eigenschaften an und erweitern Sie sie.
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 ist die Implementierungsklasse der abstrakten Klasse BeispielApplicationEvent, in der Sie Attribute nach Bedarf erweitern können.
public class ExampleLocalApplicationEvent extends ExampleApplicationEvent { public ExampleLocalApplicationEvent(Object eventData) { super(eventData); } public ExampleLocalApplicationEvent(Object eventData, String eventType) { super(eventData, eventType); } }
EventTypeEnum, benutzerdefinierte Ereignistypaufzählung, bei Bedarf erweitert.
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; } }
Ereignis-Listener umfassen Schnittstellen und abstrakte Klassen.
IEventListener, eine Schnittstelle, erbt die ApplicationListener-Schnittstelle.
@SuppressWarnings("rawtypes") public interface IEventListener extends ApplicationListener { }
AbstractEventListener, eine abstrakte Klasse, implementiert die IEventListener-Schnittstelle. Und stellen Sie abstrakte Methoden bereit, um die Klassenerweiterung und Code-Entkopplung zu erleichtern.
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, implementiert die abstrakte Klasse AbstractEventListener. Es ist eine Geschäftsklasse, Ereignissen zuzuhören und sie zu verarbeiten.
@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()); } }
Event-Listener umfassen Schnittstellen und Implementierungsklassen.
IEventPublisher, eine benutzerdefinierte Ereignisveröffentlichungsschnittstelle zur Erleichterung erweiterter Funktionen und Eigenschaften.
public interface IEventPublisher { boolean publish(ExampleApplicationEvent event); }
LocalEventPublisher, Event-Publishing-Implementierungsklasse, diese Klasse verwendet @Component, der IOC-Container von Spring lädt diese Klasse. Diese Klasse ruft das PublishEvent von ApplicationEventPublisher auf, um Ereignisse zu veröffentlichen.
@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; } }
Verwenden Sie Restful-Anfrage, um ein Ereignis auszulösen.
EventController, empfängt Restful-Anfragen.
@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, Datenobjekt, wird im Event-Objekt übergeben.
@Data @NoArgsConstructor public class OrderInfo { private String userName; private String tradeName; private String receiveTime; }
ResultObj, restful gibt ein generisches Objekt zurück.
@Data @NoArgsConstructor @AllArgsConstructor @Builder public class ResultObj { private String code; private String message; }
URL-Anfrage: http://127.0.0.1:8080/server/event/f1# 🎜🎜#
Eingabeparameter:{ "userName": "HangZhou", "tradeName": "Vue进阶教程", "flag": "add" }
{ "code": "200", "message": "成功" }
#🎜 🎜#
Das obige ist der detaillierte Inhalt vonSo wenden Sie ApplicationEvent basierend auf SpringBoot an. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!