ホームページ  >  記事  >  Java  >  SpringBootに基づいてApplicationEventを適用する方法

SpringBootに基づいてApplicationEventを適用する方法

王林
王林転載
2023-05-14 22:01:041622ブラウズ

1. ケース シナリオ

1. RESTful リクエストを開始し、リクエスト パラメーターに従ってさまざまなイベントを発行します。

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 ExampleLocalApplicationEvent

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

Enterパラメータ:

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

戻り値:

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

出力ログ:

SpringBootに基づいてApplicationEventを適用する方法

以上がSpringBootに基づいてApplicationEventを適用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。