Spring task定时任务执行一段时间后莫名其妙停止的问题

原因:定时任务请求超时,没有设置请求超时时间

package cn.bsoft.CommonUtil.util;

import java.util.HashMap;

import org.apache.cxf.endpoint.Client;
import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;
import org.apache.cxf.transport.http.HTTPConduit;
import org.apache.cxf.transports.http.configuration.HTTPClientPolicy;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;

import sun.util.logging.resources.logging;

public class WSClientUtil {
    
    
    private static final Logger log = LoggerFactory.getLogger(WSClientUtil.class);

    
    /**
     * web-service工具类
     * @param wsdlURL web-service请求地址
     * @param operationName web-service操作名称
     * @param params 请求参数
     * @return 请求数据JSON字符串
     */
    public static String invokeWs(String wsdlURL, String operationName, 
            Object... params) {
        JaxWsDynamicClientFactory clientFactory = JaxWsDynamicClientFactory.newInstance();
        Client client = clientFactory.createClient(wsdlURL);
        HTTPConduit conduit = (HTTPConduit)client.getConduit();
        HTTPClientPolicy policy = new HTTPClientPolicy();
        policy.setConnectionTimeout(100000);//设置超时时间
        policy.setReceiveTimeout(100000);//设置超时时间
        policy.setConnectionRequestTimeout(100000);
        conduit.setClient(policy);
        Object[] objects;
        try {
            log.info("请求社康通后台 operation-name:" + operationName);
            log.info("请求社康通后台 入参:" + JSON.toJSONString(params));
            objects = client.invoke(operationName, params);
            log.info("请求社康通后台 :反参" + JSON.toJSONString(objects));
        } catch (Exception e) { // 调用社康通后台发生异常
            HashMap<String, String> res = new HashMap<String, String>();
            res.put("ResultCode", "-1");
            res.put("ResultDesc", e.getMessage());
            e.printStackTrace();
            return JSONObject.toJSONString(res);
        }
        return parseEsb(objects[0].toString());
    }
    
    /**
     * 解析web-service返回值
     * @param esbResult web-service返回值
     * @return XML中的数据JSON字符串
     */
    public static String parseEsb(String esbResult) {
        Document doc = null;
        try {
            doc = DocumentHelper.parseText(esbResult);
        } catch (Exception e) {
            if (esbResult.startsWith("\"") && esbResult.endsWith("\"")) {
                esbResult = esbResult.substring(1, esbResult.length() - 1);
                esbResult = esbResult.replace("\\\"", "\"");
            }
            try {
                // 判断是否是JSON格式,如果是直接返回结果
                JSON.parseObject(esbResult);
                return esbResult;
            } catch (Exception e2) {
            }
            e.printStackTrace();
        }
        Element root = doc.getRootElement();
        String code = root.elementText("code");
        String response = root.elementText("response");
        if (!"200".equals(code)) {
            // String methodName = Thread.currentThread().getStackTrace()[1].getMethodName();
            // String msg = "ESB总线调用出错: method=" + methodName + ", code=" + code + ",response=" + response;
            HashMap<String, String> res = new HashMap<String, String>();
            res.put("ResultCode", code);
            res.put("ResultDesc", response);
            return JSONObject.toJSONString(res);
        } else {
            if (response.startsWith("\"") && response.endsWith("\"")) {
                response = response.substring(1, response.length() - 1);
                response = response.replace("\\\"", "\"");
            }
            return response;
        }
    }


    /**
     * 调用webservice接口, 返回参数为: xml中response为xml格式
     * @param wsdlURL       web-service请求地址
     * @param operationName web-service操作名称
     * @param params        请求参数
     * @return 请求数据JSON字符串
     */
    public static String invokeWsXml(String wsdlURL, String operationName,
                                     Object... params) {
        String callurl = wsdlURL;
        if (callurl.indexOf("?wsdl") < 0) {
            callurl = callurl + "?wsdl";
        }
        JaxWsDynamicClientFactory clientFactory = JaxWsDynamicClientFactory.newInstance();
        Client client = clientFactory.createClient(callurl);
        HTTPConduit conduit = (HTTPConduit) client.getConduit();
        HTTPClientPolicy policy = new HTTPClientPolicy();
        //设置超时时间
        policy.setConnectionTimeout(30000);
        policy.setReceiveTimeout(30000);
        conduit.setClient(policy);
        Object[] objects;
        if (null == params) {
            String msg = "请求参数为空";
            //为了兼容之前的方法, 这里返回null
            return null;
        }
        try {
            log.info("请求社康通后台 " + operationName + "入参:" + JSON.toJSONString(params));
            objects = client.invoke(operationName, params);
            log.info("请求社康通后台 " + operationName + " 反参:" + JSON.toJSONString(objects));
        } catch (Exception e) {
            e.printStackTrace();
            //为了兼容之前的方法, 这里返回null
            return null;
        }
        return XmlUtils.xmlToJson(objects[0].toString(), "utf-8");
    }



    public static void main(String[] args) {
//        Object[] params = new Object[4];
//        params[0] = "440308";
//        params[1] = "px034";
//        params[2] = "loginDoctor";
//        params[3] = "{'username':'0800146','password':'04b75670c3cff2d71fced3a80fcab15e'}";
//        try {
//            String res = invokeWs("http://218.18.233.229:8084/esbcs/WebServiceEntry?wsdl", "invoke", params);
//        } catch (Exception e) {
//            e.printStackTrace();
//        }

        String areaCode = "100000";
        String function = "px017";
        String method = "BP003";
        StringBuilder jsonData = new StringBuilder();
        jsonData.append("<request><MsgBody><ListSize>1</ListSize><InputList><Input><BPLOG>");
        jsonData.append("<EMPIID></EMPIID>");
        jsonData.append("<IDCARD>51152819930821241X</IDCARD>");
        jsonData.append("<BPITEM>1</BPITEM>");
        jsonData.append("<SOURCE>1</SOURCE>");
        jsonData.append("<PONINT>1</PONINT>");
        jsonData.append("<LASTMODIFYUNIT>440308001002</LASTMODIFYUNIT>");
        jsonData.append("<LASTMODIFYUSER>0800146</LASTMODIFYUSER>");
        jsonData.append("<LASTMODIFYDATE>2020-08-27 09:59:10</LASTMODIFYDATE>");
        jsonData.append(("</BPLOG></Input></InputList></MsgBody></request>"));

        String invoke = invokeWsXml("http://218.18.233.229:8084/esb/WebServiceEntry?wsdl", "invoke",
                areaCode, function, method, jsonData.toString());
        System.out.println(invoke);
    }
}

https://www.cnblogs.com/zj0208/p/7018098.html

posted on 2021-02-22 09:33  让代码飞  阅读(882)  评论(0)    收藏  举报

导航

一款免费在线思维导图工具推荐:https://www.processon.com/i/593e9a29e4b0898669edaf7f?full_name=python