Spring事件监听模式应用场景和思路

版权声明:原创,转载备注出处。 https://blog.csdn.net/qq_19239339/article/details/82454090

什么是事件

 程序中的事件其实和现实差不多,例如: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、即可同步 也可异步;

猜你喜欢

转载自blog.csdn.net/qq_19239339/article/details/82454090