wuxw7
2017-07-23 f34e19b7a0ef7b3c532372f9be4925e81f3069eb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
package com.java110.rule.thread;
 
import com.alibaba.fastjson.JSONObject;
import com.java110.common.constant.RuleDomain;
import com.java110.common.log.LoggerEngine;
import com.java110.common.util.CodeMapUtil;
import com.java110.common.util.RuleUtil;
import com.java110.entity.rule.ContractRootRule;
import com.java110.entity.rule.Rule;
import com.java110.rule.common.RuleCommon;
import org.springframework.util.StringUtils;
 
import java.util.List;
import java.util.Map;
import java.util.concurrent.*;
 
/**
 * Created by wuxw on 2017/7/23.
 */
public class RuleCommonThread extends LoggerEngine{
 
 
    private RuleCommon ruleCommon;
 
    private String ruleId;
    private JSONObject reqJson;
    private ContractRootRule contractRootRule;
    private int threadNum;
    private ExecutorService rulethreadPool;
 
    private CompletionService<String> ruleCompletionService;
 
    public RuleCommonThread(RuleCommon ruleCommon, String ruleId,
                            ContractRootRule contractRootRule,JSONObject reqJson,int threadNum,List<String> ruleList){
//        super();
        this.ruleCommon = ruleCommon;
        this.ruleId = ruleId;
        this.contractRootRule = contractRootRule;
        this.reqJson = reqJson;
        this.threadNum = threadNum;
//        this.start();
        this.ruleCurThread(ruleList);
    }
 
    //启动校验线程
    public void ruleCurThread(List<String> ruleList){
        rulethreadPool = Executors.newFixedThreadPool(threadNum);
        ruleCompletionService = new ExecutorCompletionService<String>(rulethreadPool);
        //往线程池里面加入线程对象
        for(final String ruleIdStr : ruleList){
            ruleCompletionService.submit(new Callable<String>(){
                public String call() throws Exception{
                    try {
                        Map<String,Rule> ruleMap = RuleUtil.getRuleMap();
                        Rule rule = ruleMap.get(ruleIdStr);
                        String url = rule.getRule_url();
                        String condRtn = "";
                        if(!StringUtils.isEmpty(url)){
                            if(rule.getRule_type().contains(RuleDomain.RULE_TYPE_COND_CFG)){
                                condRtn = ruleCommon.ruleCommonCondMed(ruleIdStr,contractRootRule,reqJson);
                            }else{
                                condRtn = ruleCommon.ruleCond(ruleIdStr,contractRootRule);
                            }
                        }
                        if(!StringUtils.isEmpty(condRtn)){
                            return condRtn;
                        }else{
                            //默认返回成功
                            return RuleDomain.RULE_COND_RETURN_0000;
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                        //动态常量DEP_PRVNC_RULE_ERROR_RET,不配置或配置不是1,则程序异常默认返回成功,其他返回具体异常信息
                        String depPrvncSaopRuleErrorRet = CodeMapUtil.getDynamicConstantValue("DEP_PRVNC_RULE_ERROR_RET");
                        if(StringUtils.isEmpty(depPrvncSaopRuleErrorRet) || !depPrvncSaopRuleErrorRet.equals("1")){
                            return RuleDomain.RULE_COND_RETURN_0000;
                        }else{
                            return "LTE4G全量校验规则条件判断环节异常[ruleId:"+ruleIdStr+"]:"+e.getMessage();
                        }
                    }
                }
            });
        }
    }
 
    //获取执行结果
    public String getRuleRst(){
        String retStr = RuleDomain.RULE_COND_RETURN_0000;
        for(int i=0; i<this.threadNum; i++){
            //检索并移除表示下一个已完成任务的 Future,如果目前不存在这样的任务,则等待。
            try {
                String ruleRst = ruleCompletionService.take().get();
                if(RuleDomain.RULE_COND_RETURN_0000.equals(ruleRst)){//校验成功
 
                }else if(RuleDomain.RULE_COND_RETURN_0003.equals(ruleRst)
                        || RuleDomain.RULE_COND_RETURN_0004.equals(ruleRst)){//国漫预存款校验
                    retStr = ruleRst;
                }else{//校验失败
                    return ruleRst;
                }
            } catch (Exception e) {
                e.printStackTrace();
                //动态常量DEP_PRVNC_RULE_ERROR_RET,不配置或配置不是1,则程序异常默认返回成功,其他返回具体异常信息
                String depPrvncSaopRuleErrorRet = CodeMapUtil.getDynamicConstantValue("DEP_PRVNC_RULE_ERROR_RET");
                if(StringUtils.isEmpty(depPrvncSaopRuleErrorRet) || !depPrvncSaopRuleErrorRet.equals("1")){
 
                }else{
                    return "LTE4G全量校验规则条件判断环节异常:"+e.getMessage();
                }
            }
        }
        return retStr;
    }
 
    //关闭线程池
    public void shutdownThreadPool(){
        rulethreadPool.shutdown();
    }
 
    public void run() {
        Rule rule = null;
        try{
            Map<String,Rule> ruleMap = RuleUtil.getRuleMap();
            rule = ruleMap.get(ruleId);
            String url = rule.getRule_url();
            String condRtn = "";
            if(!StringUtils.isEmpty(url)){
                if(rule.getRule_type().contains(RuleDomain.RULE_TYPE_COND_CFG)){
                    condRtn = this.ruleCommon.ruleCommonCondMed(ruleId,contractRootRule,this.reqJson);
                }else{
                    condRtn = this.ruleCommon.ruleCond(ruleId,contractRootRule);
                }
            }
 
            if(!StringUtils.isEmpty(condRtn)){
                if(condRtn.equals(RuleDomain.RULE_COND_RETURN_0000)){//成功
                    this.ruleCommon.setRuleCondRtn(this.ruleCommon.getRuleCondRtn()+"0,");
                }else{//失败
                    this.ruleCommon.setRuleCode(RuleDomain.RULE_COND_RETURN_1999);
                    this.ruleCommon.setRuleMsg(condRtn);
                    this.ruleCommon.setRuleCondRtn(this.ruleCommon.getRuleCondRtn()+"1,");
 
                }
            }else{
                this.ruleCommon.setRuleCondRtn(this.ruleCommon.getRuleCondRtn()+"0,");//默认成功
            }
        } catch (Exception e) {
            logger.error("校验异常",e);
            this.ruleCommon.setRuleCondRtn(this.ruleCommon.getRuleCondRtn()+"0,");//默认成功
            /*try {
                //记录错误日志
                this.ruleCommon.recordRuleLog(rule,e.getMessage(),"LTE4G全量校验规则条件判断环节异常[ruleId:"+ruleId+"]");
 
            } catch (Exception e1) {
                e1.printStackTrace();
            }*/
        }
    }
}