java spring事件机制,发布订阅,简单使用案例

spring配置文件添加

    <!-- 计划任务配置,用 @Service @Lazy(false)标注类,用@Scheduled(cron = "0 0 2 * * ?")标注方法 -->
    <task:executor id="executor" pool-size="10"/> <task:scheduler id="scheduler" pool-size="10"/>
    <task:annotation-driven scheduler="scheduler" executor="executor" proxy-target-class="true"/>

 业务中调用(发布事件)

//保存历史记录(使用场景)
//发布事件

String content = "用户-"+user.getName()+"-对本条数据-"+info.getNum()+"-进行了修改操作";

//对象转json存入数据库 业务需要
String json = JsonUtil.objectToJsonStr(info);

//BusLog是自己定义的一个日志类
applicationEventPublisher.publishEvent(new BusLogEvent(new BusLog(info.getId(),info.getCode(),user.getOffice().getId(),content,json,"info_log"),request));

定义event类(集成ApplicationEvent 类)

/**
 * 设备的事件
 */
public class BusLogEvent extends ApplicationEvent {

	//业务需要,可不传
    public HttpServletRequest request;

    public HttpServletRequest getRequest() {
        return request;
    }

    public void setRequest(HttpServletRequest request) {
        this.request = request;
    }

    //自定义构造方法
    public BusLogEvent(Object source, HttpServletRequest request) {
        super(source);
        this.request = request;
    }



    //必须有
    public BusLogEvent(BusLog source) { //name即source
        super(source);
    }

    
}

事件监听器(@Async注解代表是异步执行)

可在多个地方发布事件,一个地方消费

@Component
public class BusLogEventListener {

	@Autowired
	private BusLogService busLogService;

	@Async
	@EventListener
	public void onApplicationEvent(BusLogEvent deviceEvent) {
		System.out.println("-------------------------事件消费者执行-------------------------------------");
		HttpServletRequest request = deviceEvent.getRequest();
		String remoteAddr = StringUtils.getRemoteAddr(request);

		BusLog busLog = (BusLog) deviceEvent.getSource();
		busLog.setFdRemoteAddr(remoteAddr);

		busLogService.save(busLog);

	}

}

猜你喜欢

转载自blog.csdn.net/qq_38187437/article/details/84872816
今日推荐