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串 自己处理数据) 再到最后 我只能去数据库自己查 自己处理数据 自己发

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

(0)

相关推荐

  • Spring Boot中配置定时任务、线程池与多线程池执行的方法

    配置基础的定时任务 最基本的配置方法,而且这样配置定时任务是单线程串行执行的,也就是说每次只能有一个定时任务可以执行,可以试着声明两个方法,在方法内写一个死循环,会发现一直卡在一个任务上不动,另一个也没有执行. 1.启动类 添加@EnableScheduling开启对定时任务的支持 @EnableScheduling @SpringBootApplication public class TestScheduledApplication extends SpringBootServletInit

  • 浅谈SpringBoot集成Quartz动态定时任务

    SpringBoot自带schedule 沿用的springboot少xml配置的优良传统,本身支持表达式等多种定时任务 注意在程序启动的时候加上@EnableScheduling @Scheduled(cron="0/5 * * * * ?") public void job(){ System.out.println("每五秒执行一次"); } 为什么要使用Quartz 多任务情况下,quartz更容易管理,可以实现动态配置 执行时间表达式: 表达式示例: 集成

  • 基于Springboot执行多个定时任务并动态获取定时任务信息

    简介 因为一些业务的需要所有需要使用多个不同的定时任务,并且每个定时任务中的定时信息是通过数据库动态获取的.下面是我写的使用了Springboot+Mybatis写的多任务定时器. 主要实现了以下功能: 1.同时使用多个定时任务 2.动态获取定时任务的定时信息 说明 因为我们需要从数据库动态的获取定时任务的信息,所以我们需要集成 SchedulingConfigurer 然后重写 configureTasks 方法即可,调用不同的定时任务只需要通过service方法调用不用的实现返回对应的定时任

  • springboot schedule 解决定时任务不执行的问题

    @schedule 注解 是springboot 常用的定时任务注解,使用起来简单方便,但是如果定时任务非常多,或者有的任务很耗时,会影响到其他定时任务的执行,因为schedule 默认是单线程的,一个任务在执行时,其他任务是不能执行的.解决办法是重新配置schedule,改为多线程执行.只需要增加下面的配置类就可以了. import org.springframework.boot.autoconfigure.batch.BatchProperties; import org.springfr

  • SpringBoot实现动态控制定时任务支持多参数功能

    由于工作上的原因,需要进行定时任务的动态增删改查,网上大部分资料都是整合quertz框架实现的.本人查阅了一些资料,发现springBoot本身就支持实现定时任务的动态控制.并进行改进,现支持任意多参数定时任务配置 实现结果如下图所示: 后台测试显示如下: github 简单demo地址如下: springboot-dynamic-task 1.定时任务的配置类:SchedulingConfig import org.springframework.context.annotation.Bean

  • Spring boot如何通过@Scheduled实现定时任务及多线程配置

    这篇文章主要介绍了Spring boot如何通过@Scheduled实现定时任务及多线程配置,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 使用@Scheduled 可以很容易实现定时任务 spring boot的版本 2.1.6.RELEASE package com.abc.demo.common; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.spr

  • spring-boot 多线程并发定时任务的解决方案

    刚刚看了下Spring Boot实现定时任务的文章,感觉还不错.Spring Boot 使用Spring自带的Schedule来实现定时任务变得非常简单和方便.在这里个大家分享下. 开启缓存注解 @SpringBootApplication @EnableScheduling //开启定时任务 public class Application { public static void main(String[] args) { SpringApplication.run(Application.

  • SpringBoot实现定时任务和异步调用

    本文实例为大家分享了SpringBoot实现定时任务和异步调用的具体代码,供大家参考,具体内容如下 环境: jdk1.8:spring boot2.0.2:Maven3.3 摘要说明: 定时任务:定时任务是业务场景中经常出现的一种情况如:定时发送邮件,短信.定时统计监控数据.定时对账等 异步调用:一个都买流程可能包括下单.发货通知.短信推送.消息推送等,其实除了下单这个主要程序是主程序,其他子程序可以同时进行且不影响主程序的运行,这个时候就可以使用异步调用来调用这些子程序: 步骤: 1.定时任务

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

    这篇文章主要介绍了Spring定时任务轮询本地数据库实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 要做的东西很莫名其妙 可以说是数据互通的一个接口吧 当本地有表单提交后 处理一下数据 发送给另一个公司的接口 在表单提交的存库的controller里 直接处理数据 封装 并发送就完事了 . 然而领导叫我写一个接口...接收数据 处理 并发送. 到最后又改成用触发器的方式 然而写触发器的并不会用它发送http请求 我只能用Spring

  • Spring MVC4.1服务器端推送实现过程解析

    这篇文章主要介绍了Spring MVC4.1服务器端推送实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 服务器端推送 SSE(server send event)是一种服务器端向浏览器推送消息的技术,而不是我们常规的浏览器像server请求然后响应; 当我们需要使用server向浏览器主动推送数据的时候,请考虑使用该项技术,而不是考虑具有双向通讯功能的websocket; 以前我们用ajax轮询server也能实现,服务器负担大;

  • Spring Boot 2和Redis例子实现过程解析

    这篇文章主要介绍了Spring Boot2发布与调用REST服务过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Redis是一个key-value数据库,支持存储的value类型包括string(字符串).list(链表).set(集合).zset(sorted set --有序集合)和hash(哈希类型).在Java中,使用较为广泛的客户端有Redisson.Jedis.Spring Data Redis模块默认使用Jedis. 开发

  • spring boot基于DRUID实现数据源监控过程解析

    这篇文章主要介绍了spring boot基于DRUID实现数据源监控过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 随着需求和技术的日益革新,spring boot框架是越来越流行,她也越来越多地出现在我们的项目中,当然最主要的原因还是因为spring boot构建项目实在是太爽了,构建方便,开发简单,而且效率高.今天我们并不是来专门学习spring boot项目的,我们要讲的是数据源的加密和监控,监控到好说,就是不监控也没什么问题,但

  • spring cloud config 配置中心快速实现过程解析

    spring-cloud-config 配置中心实现 Spring Cloud Config 用于为分布式系统中的基础设施和微服务应用提供集中化的外部配置支持,分为server端和client端. server端为分布式配置中心,是一个独立的微服务应用:client端为分布式系统中的基础设置或微服务应用,通过指定配置中心来管理相关的配置. Spring Cloud Config 构建的配置中心,除了适用于 Spring 构建的应用外,也可以在任何其他语言构建的应用中使用. Spring Clou

  • Spring Boot 2.X快速整合jpa过程解析

    一.JPA介绍 JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中. SpringData是Spring的一个子项目.用于简化数据库访问,支持NoSQL和关系数据存储,其主要目标是使数据库的访问变得方便快捷. Spring Data JPA致力于减少数据访问层(DAO)的开发量,开发者唯一要做的就只是声明持久层的接口,其他都交给Spring Data JPA 来帮你完成!

  • spring security实现下次自动登录功能过程解析

    这篇文章主要介绍了spring security实现记住我下次自动登录功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.原理分析 第一次登陆时,如果用户勾选了readme选项,登陆成功后springsecurity会生成一个cookie返回给浏览器端,浏览器下次访问时如果携带了这个cookie,springsecurity就会放行这次访问. 二.实现方式 2.1 简单实现方式 (1) 在springsecurity的配置文件中,http节

  • Spring注解 TX声明式事务实现过程解析

    环境搭建导入 maven依赖 <!--spring提供的数据库操作工具--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.0.2.RELEASE</version> </dependency> <!--c3p0 数据库连接池--> &

  • Spring Boot Redis客户端远程操作实现过程解析

    在Spring Boot 1.x中默认是Jedis作为客户端,但是在Spring Boot2.x后,默认就是Lettuce Redis的远程连接,默认是不支持的,需要手动开启 修改config文件: 注释掉bind:127.0.0.1 开启密码校验,去掉requireprass的注释 使用jedis客户端: jedis的GitHub地址:https://github.com/xetorthio/jedis 如何远程连接: //构造一个jedis对象 Jedis jedis=new Jedis("

  • Django Admin后台添加数据库视图过程解析

    你通过以下语句,创建了一个数据库视图: create view entities_entity as select id, name from entities_hero union select 10000+id as id, name from entities_villain 它包含所有Hero和Villain对象的名称.Villain对象的的ID被设置都加上10000,因为Hero对象的数量不会超过这个数字. sqlite> select * from entities_entity;

随机推荐