在IOT平台的开发过程中,有些业务线需要实时获取设备的在线和离线状态。这时我们需要发布设备的上线和离线消息。为了达到结偶的目的,一个类只做一件事,我们在项目中使用了Spring的事件机制。
-定义事件类
-获取Spring事件发布器(并在设备上线和离线时,发布事件)
-监听事件
定义上线离线事件
**
* 设备上线事件
* @author songkaiang
*/
public class DeviceOnlineEvent extends ApplicationEvent {
private String machineNo;
private Date eventTime;
public String getMachineNo() {
return machineNo;
}
public void setMachineNo(String machineNo) {
this.machineNo = machineNo;
}
public Date getEventTime() {
return eventTime;
}
public void setEventTime(Date eventTime) {
this.eventTime = eventTime;
}
/**
* Create a new ApplicationEvent.
*
* @param source the object on which the event initially occurred (never {@code null})
*/
public DeviceOnlineEvent(Object source, String machineNo, Date eventTime) {
super(source);
this.machineNo = machineNo;
this.eventTime = eventTime;
}
@Override
public String toString() {
return "DeviceOnlineEvent{" +
"machineNo='" + machineNo + '\'' +
", eventTime=" + eventTime +
'}';
}
}
发布事件
发布事件时,需要获取Spring中的事件发送服务,此时只需要实现ApplicationEventPublisherAware接口即可
@Component
public class DeviceEventPublisher implements ApplicationEventPublisherAware {
private ApplicationEventPublisher applicationEventPublisher;
@Override
public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
this.applicationEventPublisher = applicationEventPublisher;
}
/**
* 发布设备上线事件
* @param deviceOnlineEvent
*/
public void publisherDeviceOnlineEvent(DeviceOnlineEvent deviceOnlineEvent){
applicationEventPublisher.publishEvent(deviceOnlineEvent);
}
/**
* 发布设备离线事件
* @param deviceOfflineEvent
*/
public void publisherDeviceOfflineEvent(DeviceOfflineEvent deviceOfflineEvent){
applicationEventPublisher.publishEvent(deviceOfflineEvent);
}
}
监听上线事件
监听事件只需要实现ApplicationListener接口类,并实现对应的接口方法。代码如下
@Component
public class DeviceOnlineEventListener implements ApplicationListener<DeviceOnlineEvent> {
@Override
public void onApplicationEvent(DeviceOnlineEvent event) {
System.err.println("设备上线监听:"+event.toString());
System.err.println("发送上线消息成功:"+ event.toString());
}
}
事件发布测试代码
public class Main {
public static void main(String[] args) {
ApplicationContext beans=new ClassPathXmlApplicationContext("classpath:applicationContent-event.xml");
DeviceEventPublisher deviceEventPublisher = beans.getBean(DeviceEventPublisher.class);
DeviceOnlineEvent deviceOnlineEvent = new DeviceOnlineEvent("onineEvent","ska", new Date());
System.err.println("设备上线事件发布成功");
deviceEventPublisher.publisherDeviceOnlineEvent(deviceOnlineEvent);
}
}
测试结果:
设备上线事件发布成功
设备上线监听:DeviceOnlineEvent{machineNo='ska', eventTime=Wed Mar 10 17:43:46 CST 2021}
发送上线消息成功:DeviceOnlineEvent{machineNo='ska', eventTime=Wed Mar 10 17:43:46 CST 2021}