欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

基于 springboot 实现定时任务,并添加事件事件处理机制

最编程 2024-04-07 09:03:26
...

1、基于Spring-Event增加事件处理机制

import org.bson.Document;
import org.springframework.context.ApplicationEvent;

/**
 * 基于Spring-Event增加事件处理机制
 * @create: 2024/4/1-13:33
 */
public class SysProductConfigEvent   extends ApplicationEvent {

    // 数据配置
    private Document configDoc;

    public SysProductConfigEvent(Document source) {
        super(source);
        this.configDoc = source;
    }

    public Document getConfigDoc() {
        return configDoc;
    }

    public void setConfigDoc(Document configDoc) {
        this.configDoc = configDoc;
    }
}

2、定时任务

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DateUtil;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.HashMultiset;
import com.google.common.collect.Lists;
import com.google.common.collect.Multiset;
import com.mongodb.client.model.Filters;
import com.mongodb.client.model.UpdateOneModel;
import com.skybird.iot.addons.oemSystem.backend.jdo.Procedure;
import com.skybird.iot.addons.sysConfig.product.backend.event.SysProductConfigEvent;
import com.skybird.iot.addons.sysConfig.product.backend.jdo.QProductConfig;
import com.skybird.iot.addons.sysConfig.product.backend.listener.SysProductConfigListener;
import com.skybird.iot.base.utils.DBUtils;
import com.skybird.iot.base.utils.DocuLib;
import com.skybird.iot.base.utils.StringLib;
import org.apache.commons.collections4.CollectionUtils;
import org.bson.Document;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationListener;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 产品调度器
 */
@Component
public class SysProductConfigScheduler implements ApplicationListener<SysProductConfigEvent> {

    // Logger打印日志对象
    private static final Logger LOGGER = LoggerFactory.getLogger(SysProductConfigListener.class.getName());

    @Override
    public void onApplicationEvent(SysProductConfigEvent event) {
        Document configDoc = event.getConfigDoc();

        taskExecute();

        LOGGER.info("configDoc:{}", configDoc);
    }

    /* 定时任务 */
   @Scheduled(fixedRate = 500000L)
    public void taskExecute(){
       // 数据同步
       datasync();

   }

    private synchronized void datasync() {
        System.out.println("数据同步成功");
    }

3、数据保存接口触发案例

@PostMapping("/save")
public CheckMessage save(@RequestParam("data") String data) {
  Document entity = DocuLib.parseDecode(data);
  String id = DocuLib.getID(entity);
  Document filter = DocuLib.newDoc();
  filter.put("code", DocuLib.getCode(entity));
  if (StrUtil.isNotEmpty(id)) {
    filter.put("id", DocuLib.newDoc("$ne", id));
  }
  long count = DBUtils.count(QProductConfig.collectionName, filter);
  if (count > 0) {
    return CheckMessage.newInstance().setSuccess(false).addMessage("产品编码已存在");
  }

  if (StrUtil.isEmpty(id)) {
    entity.put("create_time", DateUtil.date());
    DBUtils.insert(QProductConfig.collectionName, entity);
  } else {
    Document query = DocuLib.newDoc("id", id);
    DBUtils.updateOne(QProductConfig.collectionName, query, DocuLib.new$Set(entity));
  }

  // 增加事件推送,推进后直接触发定时任务进行数据同步
  SpringUtil.publishEvent(new SysProductConfigEvent(new Document()));

  return CheckMessage.newInstance();
}