Heim  >  Artikel  >  Java  >  So wenden Sie ApplicationEvent basierend auf SpringBoot an

So wenden Sie ApplicationEvent basierend auf SpringBoot an

王林
王林nach vorne
2023-05-14 22:01:041622Durchsuche

1. Fallszenario

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.

2. Verwenden Sie die Klasse

org.springframework.context.ApplicationEvent, das Ereignisobjekt von Spring.

org.springframework.context.ApplicationListener, Ereignis-Listener-Schnittstelle.

org.springframework.context.ApplicationEventPublisher, Event-Publisher-Schnittstelle.

3. Code

1. Ereignisobjekt

Das Ereignisobjekt implementiert ApplicationEvent.

1.1 BeispielApplicationEvent

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;
  }
}
1.2 BeispielLocalApplicationEvent

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);
  }
}
1.3 EventTypeEnum

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;
  }
}

2. Ereignis-Listener

Ereignis-Listener umfassen Schnittstellen und abstrakte Klassen.

2.1 IEventListener

IEventListener, eine Schnittstelle, erbt die ApplicationListener-Schnittstelle.

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

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);
}
2.3 OrderEventListener

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());
  }
}

3. Event-Publisher

Event-Listener umfassen Schnittstellen und Implementierungsklassen.

3.1 IEventPublisher

IEventPublisher, eine benutzerdefinierte Ereignisveröffentlichungsschnittstelle zur Erleichterung erweiterter Funktionen und Eigenschaften.

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

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;
  }
}

4.Restful-Anfrage löst Ereignis aus

Verwenden Sie Restful-Anfrage, um ein Ereignis auszulösen.

4.1 EventController

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();
  }
}
4.2 OrderInfo

OrderInfo, Datenobjekt, wird im Event-Objekt übergeben.

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

ResultObj, restful gibt ein generisches Objekt zurück.

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

5. Test

5.1 Informationen anfordern

URL-Anfrage: http://127.0.0.1:8080/server/event/f1# 🎜🎜#

Eingabeparameter:

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

Rückgabewert:

{
    "code": "200",
    "message": "成功"
}

5.2 Protokoll
Ausgabeprotokoll:

#🎜 🎜#

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen