Rumah > Java > javaTutorial > Cara menggunakan ApplicationEvent berdasarkan SpringBoot

Cara menggunakan ApplicationEvent berdasarkan SpringBoot

王林
Lepaskan: 2023-05-14 22:01:04
ke hadapan
1676 orang telah melayarinya

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;
  }
}
Salin selepas log masuk
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);
  }
}
Salin selepas log masuk
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;
  }
}
Salin selepas log masuk

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 {
}
Salin selepas log masuk
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);
}
Salin selepas log masuk
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());
  }
}
Salin selepas log masuk

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);
}
Salin selepas log masuk
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;
  }
}
Salin selepas log masuk

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();
  }
}
Salin selepas log masuk
4.2 OrderInfo

OrderInfo, objek data, dihantar dalam objek acara.

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

ResultObj, restful mengembalikan objek biasa.

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class ResultObj {
    private String code;
    private String message;
}
Salin selepas log masuk

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"
}
Salin selepas log masuk

Nilai pulangan:

{
    "code": "200",
    "message": "成功"
}
Salin selepas log masuk
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!

Label berkaitan:
sumber:yisu.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan