ホームページ >Java >&#&チュートリアル >SpringBootに基づいてApplicationEventを適用する方法
1. RESTful リクエストを開始し、リクエスト パラメーターに従ってさまざまなイベントを発行します。
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
Enterパラメータ:
{ "userName": "HangZhou", "tradeName": "Vue进阶教程", "flag": "add" }
戻り値:
{ "code": "200", "message": "成功" }
出力ログ:
以上がSpringBootに基づいてApplicationEventを適用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。