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串 自己處理數據)  再到最后 我只能去數據庫自己查 自己處理數據 自己發

並且  里邊的業務邏輯 超級煩人 我剛到並不熟悉  中間處理數據  和實現 待辦事項完結的 哪個字段 廢了好久  其實這個任務真正完成的時間 也就是三天,包括狂加班


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM