Spring事件監聽模式應用場景和思路
阿新 • • 發佈:2019-02-05
什麼是事件
程式中的事件其實和現實差不多,例如:Js中的事件有很多 如滑鼠的單擊事件onclick。
當點選某個按鈕時--觸發某個方法。當你不去觸發這個事件、這個事件就永遠的在等待 喚醒事件的人;
事件三要素
1、定義一個事件(火災事件、碰撞事件、收到資訊事件。。。)
2、有一個事件的觸發者 在合適的時機去觸發這個事件,例如 觸發起火 導致溫度感測器上升、導致系統發生報警 --觸發溫度過高事件- 事件自動處置系統 根據溫度過高事件的資訊--觸發噴淋裝置啟動;
這個例子中處處都有事件釋出者和事件處理人的影子;
3、必須要有一個事件處理者時刻監聽目前有沒有新的事件要處理(例如 警察的110客服人員,時刻等著桌子的電話響起,然後接電話就是處理事件的過程,電話響起就是事件的監聽器收到了事件的資訊)
Spring事件監聽實現
1、定義一個事件
class MyEvent extends ApplicationEvent{ private static final long serialVersionUID = 1L; String msg; public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public MyEvent(Object source,String msg) { super(source); this.msg=msg; } } //此處定義一個事件
2、定義一個事件釋出者
@Component @Slf4j public class KafkaConsumerListener{ @Autowired private ApplicationContext applicationContext; static int i=0; @KafkaListener(topics = "topic" ) public void onMessage(List<ConsumerRecord<?,?>> data) { JSONObject json = JSONObject.fromObject("{}"); for (ConsumerRecord<?, ?> consumerRecord : data) { json = JSONArray.fromObject(consumerRecord.value()).getJSONObject(0); log.info((i++)+json.toString()); applicationContext.publishEvent( new MyEvent(this, json.toString())); } } //當收到kafka資訊後-在容器內部發佈一個MyEvent型別事件、 //其實KafkaListener 本身也是一個事件的處理員 }
3、定義一個事件的監聽處理器
@Component
@Slf4j
class MyannotationLisetener{
static int i=0;
@EventListener
public void Listener2(MyEvent event)
{
log.error((i++)+event.getMsg());
}
}
//此處定義一個監聽器來監聽釋出過來的事件資訊 並進行處理
這樣做的好處是什麼
1、單一職責原則、程式碼耦合降低、事件的處理人員只需關注處理的程式碼、釋出人員只需關注釋出的程式碼;
2、即可同步 也可非同步;