1. 程式人生 > >Spring事件監聽模式應用場景和思路

Spring事件監聽模式應用場景和思路

什麼是事件

 程式中的事件其實和現實差不多,例如: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、即可同步 也可非同步;