Rumah >Java >javaTutorial >Cara menggunakan ApplicationEvent berdasarkan SpringBoot

Cara menggunakan ApplicationEvent berdasarkan SpringBoot

王林
王林ke hadapan
2023-05-14 22:01:041675semak imbas

1. Senario kes

1 Mulakan permintaan yang tenang dan terbitkan acara yang berbeza mengikut parameter permintaan.

2. Pendengar acara, selepas mendengar acara, lakukan operasi yang telah ditetapkan.

3. Contoh ini ialah mekanisme pemprosesan penyegerakan acara, iaitu selepas acara diterbitkan, acara akan dipantau secara serentak.

2. Gunakan kelas

org.springframework.context.ApplicationEvent, objek acara musim bunga.

org.springframework.context.ApplicationListener, antara muka pendengar acara.

org.springframework.context.ApplicationEventPublisher, antara muka penerbit acara.

3. Kod

1. Objek acara

Objek acara melaksanakan ApplicationEvent.

1.1 ExampleApplicationEvent

ExampleApplicationEvent, kelas abstrak. Warisi ApplicationEvent dan sesuaikan serta kembangkan beberapa sifat yang diperlukan dalam perkhidmatan mikro.

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 ialah kelas pelaksanaan kelas abstrak ExampleApplicationEvent, di mana anda boleh mengembangkan atribut mengikut keperluan.

public class ExampleLocalApplicationEvent extends ExampleApplicationEvent {
  public ExampleLocalApplicationEvent(Object eventData) {
      super(eventData);
  }
  public ExampleLocalApplicationEvent(Object eventData, String eventType) {
      super(eventData, eventType);
  }
}
1.3 EventTypeEnum

EventTypeEnum, penghitungan jenis acara tersuai, dikembangkan atas permintaan.

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. Pendengar acara

Pendengar acara termasuk antara muka dan kelas abstrak.

2.1 IEventListener

IEventListener, antara muka, mewarisi antara muka ApplicationListener.

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

AbstractEventListener, kelas abstrak, melaksanakan antara muka IEventListener. Dan menyediakan kaedah abstrak untuk memudahkan sambungan kelas dan penyahgandingan kod.

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, melaksanakan kelas abstrak AbstractEventListener. Ia adalah kelas perniagaan untuk mendengar acara dan memprosesnya.

@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. Penerbit acara

Pendengar acara termasuk antara muka dan kelas pelaksanaan.

3.1 IEventPublisher

IEventPublisher, antara muka penerbitan acara tersuai untuk memudahkan fungsi dan sifat lanjutan.

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

LocalEventPublisher, kelas pelaksanaan penerbitan acara, kelas ini menggunakan @Component, bekas IOC spring akan memuatkan kelas ini. Kelas ini memanggil publishEvent of ApplicationEventPublisher untuk menerbitkan acara.

@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. Permintaan yang tenang mencetuskan acara

Gunakan permintaan yang tenang untuk mencetuskan acara.

4.1 EventController

EventController, menerima permintaan 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, objek data, dihantar dalam objek acara.

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

ResultObj, restful mengembalikan objek biasa.

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

5 Ujian

5.1 Minta maklumat

Permintaan URL: http://127.0.0.1:8080/server/event/f1

Masukkan Rujukan:

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

Nilai pulangan:

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

Log keluaran:

Cara menggunakan ApplicationEvent berdasarkan SpringBoot

Atas ialah kandungan terperinci Cara menggunakan ApplicationEvent berdasarkan SpringBoot. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam