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