package com.thtf.zwdsj.fangjia.rpc;

import org.apache.ws.commons.util.NamespaceContextImpl;
import org.apache.xmlrpc.common.TypeFactoryImpl;
import org.apache.xmlrpc.common.XmlRpcController;
import org.apache.xmlrpc.common.XmlRpcStreamConfig;
import org.apache.xmlrpc.parser.NullParser;
import org.apache.xmlrpc.parser.TypeParser;
import org.apache.xmlrpc.serializer.NullSerializer;

/**
 * @PROJECT_NAME: fuwuyejiage
 * @DESCRIPTION: Python 服务调用服务
 *
 */
public class MyTypeFactory extends TypeFactoryImpl{

    public MyTypeFactory(XmlRpcController pController) {
        super(pController);
    }

    @Override
    public TypeParser getParser(XmlRpcStreamConfig pConfig, NamespaceContextImpl pContext, String pURI,
            String pLocalName) {
        if("".equals(pURI) && NullSerializer.NIL_TAG.equals(pLocalName)){
            return new NullParser();
        }else{
            return super.getParser(pConfig, pContext, pURI, pLocalName);
        }
    }
}
package com.thtf.zwdsj.fangjia.rpc;


//import com.thtf.framework.core.util.JSONUtil;
//import com.thtf.monitor.common.domain.model.ResultDTO;
import cn.hutool.json.JSONUtil;
import com.ruoyi.common.core.domain.R;
import org.apache.xmlrpc.XmlRpcException;
import org.apache.xmlrpc.client.XmlRpcClient;
import org.apache.xmlrpc.client.XmlRpcClientConfigImpl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.stereotype.Component;

import java.net.MalformedURLException;
import java.net.URL;

/**
 * @PROJECT_NAME: fuwuyejiage
 * @DESCRIPTION: Python 服务调用服
 */
@Component
@RefreshScope
public class PythonRpcCallService implements InitializingBean{

    private static final Logger log = LoggerFactory.getLogger(PythonRpcCallService.class);

    @Value("${PythonService.hostName}")
    private   String hostName;

    @Value("${PythonService.port}")
    private  String port;

    //定义使用rpc的client
    static XmlRpcClient client = new XmlRpcClient();

    public String getHostName() {
        return hostName;
    }

    public void setHostName(String hostName) {
        this.hostName = hostName;
    }

    public String getPort() {
        return port;
    }

    public void setPort(String port) {
        this.port = port;
    }

    private static Logger logger = LoggerFactory.getLogger(PythonRpcCallService.class);

    @Override
    public void afterPropertiesSet() throws Exception {
        initXmlRpcClient();
    }
    public void initXmlRpcClient() {
        try {
            log.info("==============hostName:{}===========",hostName);
            log.info("==============port:{}===========",port);
            XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl();
            config.setServerURL(new URL("HTTP://"+hostName+":"+port+"/RPC2"));
            //开启扩展
            config.setEnabledForExtensions(true);
            //设置配置
            client.setConfig(config);
            //设置自定义类型工程,对nil类型数据进行转换。
            client.setTypeFactory(new MyTypeFactory(client));
            log.info("==============python-rpc服务连接===========");
        } catch (MalformedURLException e) {
            e.printStackTrace();
            log.info("==============python-rpc服务连接失败===========");
        }
    }

    /**
     * 调用python服务的接口,无返回值
     * @param pythonServerName
     * @param args
     */
    public  void callPython(String pythonServerName,Object... args){
        try {
            System.out.println("执行地址:"+hostName+":"+port);
            client.execute(pythonServerName,args);
        } catch (XmlRpcException e) {
            e.printStackTrace();
        }
    }

    /**
     * 调用python服务的接口,有返回值。
     * @param pythonServerName
     * @param args
     * @return
     */
    public R callPython4Return(String pythonServerName, Object... args){
        R<Object> resultDTO = new R<>();
        try {
            logger.info("执行地址:"+hostName+":"+port);
            logger.info("执行算法:"+pythonServerName+" 开始");
            logger.info("算法参数:"+ JSONUtil.toJsonStr(args));
            Object res =  client.execute(pythonServerName,args);
            logger.info("算法返回值:"+ JSONUtil.toJsonStr(res));
            logger.info("执行算法:"+pythonServerName+" 结束");
            resultDTO.setCode(200);
            resultDTO.setData(res);
        } catch (Exception e) {
            e.printStackTrace();
            resultDTO.setCode(500);
            resultDTO.setMsg("算法调用参数错误");
        }
        return resultDTO;
    }


    //手动测试下
//    public static void main(String[] args) {
//        try {
//            Object res2= callPython4Return("predict",new Object[]{"马晓旭意外受伤让国奥警惕 无奈大雨格外青睐殷家军记者傅亚雨沈阳报道 来到沈阳,国奥队依然没有摆脱雨水的困扰。7月31日下午6点,国奥队的日常训练再度受到大雨的干扰,无奈之下队员们只慢跑了25分钟就草草收场。31日上午10点,国奥队在奥体中心外场训练的时候,天就是阴沉沉的,气象预报显示当天下午沈阳就有大雨,但幸好队伍上午的训练并没有受到任何干扰。下午6点,当球队抵达训练场时,大雨已经下了几个小时,而且丝毫没有停下来的意思。抱着试一试的态度,球队开始了当天下午的例行训练,25分钟过去了,天气没有任何转好的迹象,为了保护球员们,国奥队决定中止当天的训练,全队立即返回酒店。在雨中训练对足球队来说并不是什么稀罕事,但在奥运会即将开始之前,全队变得“娇贵”了。在沈阳最后一周的训练,国奥队首先要保证现有的球员不再出现意外的伤病情况以免影响正式比赛,因此这一阶段控制训练受伤、控制感冒等疾病的出现被队伍放在了相当重要的位置。而抵达沈阳之后,中后卫冯萧霆就一直没有训练,冯萧霆是7月27日在长春患上了感冒,因此也没有参加29日跟塞尔维亚的热身赛。队伍介绍说,冯萧霆并没有出现发烧症状,但为了安全起见,这两天还是让他静养休息,等感冒彻底好了之后再恢复训练。由于有了冯萧霆这个例子,因此国奥队对雨中训练就显得特别谨慎,主要是担心球员们受凉而引发感冒,造成非战斗减员。而女足队员马晓旭在热身赛中受伤导致无缘奥运的前科,也让在沈阳的国奥队现在格外警惕,“训练中不断嘱咐队员们要注意动作,我们可不能再出这样的事情了。”一位工作人员表示。从长春到沈阳,雨水一路伴随着国奥队,“也邪了,我们走到哪儿雨就下到哪儿,在长春几次训练都被大雨给搅和了,没想到来沈阳又碰到这种事情。”一位国奥球员也对雨水的“青睐”有些不解。"});
//            System.out.println(res2);
//
//            //test
//            Object a = client.execute("testa",new Object[]{});
//            System.out.println(a);
//
//            //获取目标
//            Object b = client.execute("getTarget_indicator",new Object[]{"2015年实现人均生产总值翻番","2015","人均生产总值"});
//            System.out.println(b);
//
//            //获取相似文档
//            //Object c = client.execute("docAlike_predict",new Object[]{"工作,情况"});
//            //System.out.println(c);
//
//            //相似文档trian
//            Object c =client.execute("docAlike_predict",new Object[]{"马晓旭意外受伤让国奥警惕 无奈大雨格外青睐殷家军记者傅亚雨沈阳报道 来到沈阳,国奥队依然没有摆脱雨水的困扰。7月31日下午6点,国奥队的日常训练再度受到大雨的干扰,无奈之下队员们只慢跑了25分钟就草草收场。31日上午10点,国奥队在奥体中心外场训练的时候,天就是阴沉沉的,气象预报显示当天下午沈阳就有大雨,但幸好队伍上午的训练并没有受到任何干扰。下午6点,当球队抵达训练场时,大雨已经下了几个小时,而且丝毫没有停下来的意思。抱着试一试的态度,球队开始了当天下午的例行训练,25分钟过去了,天气没有任何转好的迹象,为了保护球员们,国奥队决定中止当天的训练,全队立即返回酒店。在雨中训练对足球队来说并不是什么稀罕事,但在奥运会即将开始之前,全队变得“娇贵”了。在沈阳最后一周的训练,国奥队首先要保证现有的球员不再出现意外的伤病情况以免影响正式比赛,因此这一阶段控制训练受伤、控制感冒等疾病的出现被队伍放在了相当重要的位置。而抵达沈阳之后,中后卫冯萧霆就一直没有训练,冯萧霆是7月27日在长春患上了感冒,因此也没有参加29日跟塞尔维亚的热身赛。队伍介绍说,冯萧霆并没有出现发烧症状,但为了安全起见,这两天还是让他静养休息,等感冒彻底好了之后再恢复训练。由于有了冯萧霆这个例子,因此国奥队对雨中训练就显得特别谨慎,主要是担心球员们受凉而引发感冒,造成非战斗减员。而女足队员马晓旭在热身赛中受伤导致无缘奥运的前科,也让在沈阳的国奥队现在格外警惕,“训练中不断嘱咐队员们要注意动作,我们可不能再出这样的事情了。”一位工作人员表示。从长春到沈阳,雨水一路伴随着国奥队,“也邪了,我们走到哪儿雨就下到哪儿,在长春几次训练都被大雨给搅和了,没想到来沈阳又碰到这种事情。”一位国奥球员也对雨水的“青睐”有些不解。"});
//            System.out.println(c);
//
//        } catch (XmlRpcException e) {
//            e.printStackTrace();
//        }
//    }

}
<dependency>
            <groupId>org.apache.xmlrpc</groupId>
            <artifactId>xmlrpc-client</artifactId>
            <version>3.1.3</version>
        </dependency>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.7.19</version>
        </dependency>