欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Spring定时任务轮询本地数据库实现过程解析

程序员文章站 2024-02-07 16:04:46
这篇文章主要介绍了spring定时任务轮询本地数据库实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 要做的东西很莫名其...

这篇文章主要介绍了spring定时任务轮询本地数据库实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

要做的东西很莫名其妙 可以说是数据互通的一个接口吧 当本地有表单提交后 处理一下数据 发送给另一个公司的接口

在表单提交的存库的controller里 直接处理数据 封装 并发送就完事了 .

然而领导叫我写一个接口...接收数据 处理 并发送. 到最后又改成用触发器的方式 然而写触发器的并不会用它发送http请求 我只能用spring的定时任务 读取数据库的更新状态 并且处理数据 发送到那个公司的接口里

这是httpclient的示例

复制代码
1 public class httpclinet {
2
3 public static string dopost(object object ) {
4
5 string responsejson = null;
6 //获得http客户端
7 closeablehttpclient httpclient = httpclientbuilder.create().build();
8 //创建post请求
9 //处理参数
10 string uri = null;
11 try{
12 uri ="http://10.145.1.12:80/promo/api/approval/todoitem?sourceid=xzbz&secretkey=ohzwivm6";
13
14
15 }catch (exception e){
16 e.printstacktrace();
17 }
18
19 httppost httppost = new httppost(uri);
20
21
22 //将对象转换成json字符串 然后存入entity中 请求body
23 system.out.println(json.tojsonstring(object));
24 stringentity entity = new stringentity(json.tojsonstring(object),"utf-8");
25
26 //将json字符串放入请求body中
27 httppost.setentity(entity);
28
29 //设置请求头
30 httppost.setheader("content-type","application/json;charset=utf-8");
31
32 //获取response模型
33
34 closeablehttpresponse response = null;
35 try {
36 //发送post请求后 由response模型接收
37 response = httpclient.execute(httppost);
38 //从响应模型中获取body
39 httpentity responseentity = response.getentity();
40
41
42 responsejson = entityutils.tostring(responseentity);
43
44 if(responseentity != null){
45 system.out.println("相应内容为:" + responsejson);
46 }
47 }catch (exception e){
48 e.printstacktrace();
49 }finally {
50 try {
51 if (httpclient != null){
52 httpclient.close();
53 }if (response != null){
54 response.close();
55 }
56 }catch (exception e){
57 e.printstacktrace();
58 }
59 }
60 return responsejson;
61
62 }
63 }
复制代码

这是定时任务(非quartz)

复制代码
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task-3.0.xsd">

<!-- mybatis配置 -->
<import resource="classpath:applicationcontext-mybatis.xml"/>
<task:annotation-driven />
<context:component-scan base-package="com.litsoft.workflowapi.task"/>
复制代码

任务的具体方法

@component
public class senddatatask {
  
  
  
  @autowired
  workflowservice workflowserviceimpl;

  
  //首次推送待审
  @scheduled(cron = "0 */1 * * * ?") // 间隔一分钟执行
  public void taskcycle() throws unsupportedencodingexception {
    
    

    
    

    //第一次推送任务(产生任务),产生新任务则产生审批人,还需要取消掉没有认领任务的审批人的消息
    list<todotaskmodel> list = workflowserviceimpl.gettodotaskinfobysendstatus("0","100");
    todotaskmodel todotaskmodel = new todotaskmodel();
    for (int i = 0; i < list.size(); i++) {
      todotaskmodel = list.get(i);
      //自拼title
      //根据workflowid 判断拼接url
      string taskid = todotaskmodel.gettaskid();
      string realtaskid = changetaskiduitl.changetaskiduitl(taskid);
      string workflowid = todotaskmodel.getworkflowid();
      string docid = todotaskmodel.getdocid();
      string title = "您有一条新的待审任务" + todotaskmodel.gettodotitle() +"等待审批";
      string taskstatus = "1";
      string submitorid = todotaskmodel.getsubmitorid();
      string loginname = workflowserviceimpl.getloginname(submitorid);
      string submitorname = todotaskmodel.getsubmitorname();
      string submitdatetime = todotaskmodel.getsubmitdatetime();
      string openurl = null;
      string beforeurl = "http://oa20.cctv.com/";
      string afterurl = "/mywork/workwait/gwwechatwait.do?instanceid=";      
      //5合同
      if(workflowid.equals("5")){
        openurl = beforeurl + "ht_wechat" + afterurl +docid +"&workflowid="+workflowid;
      }else{
        openurl = beforeurl + "gw_wechat" + afterurl +docid +"&workflowid="+workflowid;
      }    
      string sendstatus = todotaskmodel.getsendstatus();
      
      //查询审批人的真实id
      //根据docid 和taskstatus =40 来查审批者的submitorid 然后根据这个来查真实工号
      
      //获取数据库查询的 当前审批层级信息
      list<thislevelinfomodel> tlist = todotaskmodel.getthislevelinfolist();
      //new一个移动端要的格式的模型
      list<approverpojo> approverlist = new arraylist<approverpojo>();
      approverpojo approverpojo = new approverpojo();
      for (int j = 0; j < tlist.size(); j++) {

        string realapproverid = workflowserviceimpl.getloginname(tlist.get(j).getapproverid());
        approverpojo.setdocid(tlist.get(j).getdocid());
        approverpojo.setapprovername(tlist.get(j).getapprovername());
        approverpojo.setapproverid(realapproverid);
        approverlist.add(approverpojo);
      }
      //todotaskpojo里的最高层对象(list(模型))
      thislevelinfopojo thislevelinfopojo = new thislevelinfopojo();
      thislevelinfopojo.setapproverlist(approverlist);
      
      todotaskpojo todotaskpojo = new todotaskpojo(realtaskid,workflowid,docid,title,taskstatus,
          loginname,submitorname,submitdatetime,openurl,sendstatus,thislevelinfopojo);
      
      jsonobject jsonobject= jsonobject.fromobject(todotaskpojo);
    
      string jsonstr = httpclinet.dopost(jsonobject);
      jsonobject jsoncode = jsonobject.fromobject(jsonstr);
      
      
      if("0".equals(jsoncode.get("errcode"))) {
        //这要加判断? 是否是终审人? 条件:提交人工号=审核人工号时 该审批层级未最终审批????        
        //或者终审层级 有没有审核人 如果没有 移动端返回错误码 
        if (workflowserviceimpl.isfirstsend() == 1) {
          workflowserviceimpl.updatesendstatus("2", taskid);
        }else{
        workflowserviceimpl.updatesendstatus("1", taskid);}
      }else if("当前层级待审人不能为空".equals(jsoncode.get("errdesc"))){
        workflowserviceimpl.updatesendstatus("1", taskid);
      }
      
  /*_____________________________________________________________________________________*/    
      
      //查询旧表该docid下的所有taskid 并将(taskid和docid)插入新表
      //先查询docid下所有的taskid
      list<string> taskidlist = new arraylist<string>();
        taskidlist = workflowserviceimpl.selectallbydocid(docid);
      for (int j = 0; j < taskidlist.size(); j++) {
        //想新表插入所有taskid和docid
        workflowserviceimpl.creatallinfo(taskidlist.get(j), docid);  
      }
      
      taskstatuspojo taskstatuspojo = new taskstatuspojo();
      
      //查询新表和旧表 对比 旧表不存在二新表存在的taskid 通过第二个url推送给wechat端,删掉消息
      list<string> invalidlist = new arraylist<string>();
      invalidlist = workflowserviceimpl.selectinvalidapprover();
      string invalidtaskid = null;
      for (int j = 0; j < invalidlist.size(); j++) {
        invalidtaskid = changetaskiduitl.changetaskiduitl(invalidlist.get(j));
        taskstatuspojo.settaskid(invalidtaskid);
        taskstatuspojo.settaskstatus("2");
        jsonobject jsonobj= jsonobject.fromobject(taskstatuspojo);
        httpsecondsend.dopost(jsonobj);
      }

      
    }
    
    //第二个接口 告诉当前待办人审批完结

    list<taskstatuspojo> secondlist = workflowserviceimpl.getnewstatus("1","100");
    taskstatuspojo taskstatuspojo = new taskstatuspojo();
    for (int i = 0; i < secondlist.size(); i++) {
      string did = secondlist.get(i).gettaskid();
      string docid = secondlist.get(i).getonlydocid();
      string realtaskid =changetaskiduitl.changetaskiduitl(workflowserviceimpl.gettruetaskid(docid));        
        taskstatuspojo.settaskid(realtaskid);
        taskstatuspojo.settaskstatus("2");
        jsonobject jsonobject= jsonobject.fromobject(taskstatuspojo);
        string str = httpsecondsend.dopost(jsonobject);
        jsonobject json = jsonobject.fromobject(str);
        if ("0".equals(json.get("errcode"))) {
          workflowserviceimpl.updatesendstatus("2", did);      
      }        
    }    
  }
}

其实这个东西很简单 只是需求变三变 从提交表单给我发数据 到用触发器给我发http请求(json串 自己处理数据) 再到最后 我只能去数据库自己查 自己处理数据 自己发

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。