rpc调用

IServer类:

package Call.Information.ServerRpc;

import java.io.IOException;
import java.nio.charset.Charset;
import java.util.HashMap;
import java.util.Properties;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.plugbase.common.util.ResourcesUtil;

public abstract class IServer {
    private static final Log LOG = LogFactory.getLog(IServer.class);   
    private static IServer server;
   
    private static final String RPCTYPE_CONFIG = "rpcType";
    private static final String DEFAULT_RPCTYPE = "xmlrpc";
    private static final String NIO_RPCTYPE = "xmlrpc";
    private static final String SERVERHANDLERLISTNAME_CONFIG ="ServerHandlerListName";
    private static final String SERVERHANDLERLISTCLASS_CONFIG ="ServerHandlerListClass";
    private static final String  SPACEMARK = ",";
    private static Properties params=null;
   
    protected static HashMap<String, Class> handlerMap = new HashMap<String, Class>();
   
    private static void loadParameter(){
            try {
                LOG.debug("loadParameter");
                ResourcesUtil.setCharset(Charset.forName("UTF-8"));
                params = ResourcesUtil.getResourceAsProperties("server.properties");
                if(params.getProperty(RPCTYPE_CONFIG, DEFAULT_RPCTYPE).equals(DEFAULT_RPCTYPE)){
                    server = new XmlrpcServer();
                }       
               
            } catch (IOException e) {
                LOG.error("Server init Faild!",e);
                return;
            }
    }
   
    private static void initServer(){
        loadParameter();
        LOG.debug("initServer..");
        String listname = params.getProperty(SERVERHANDLERLISTNAME_CONFIG);
        String listclass = params.getProperty(SERVERHANDLERLISTCLASS_CONFIG);
        if(listname!=null&&listclass!=null){
            String[] names = listname.split(SPACEMARK);
            String[] classes = listclass.split(SPACEMARK);
            if(names.length==classes.length){
                for(int i=0;i<names.length;i++){
                    try {
                        handlerMap.put(names[i], Class.forName(classes[i]));
                    } catch (ClassNotFoundException e) {
                        LOG.error("Server init Faild!",e);
                        return;
                    }
                }
            }
        }
        LOG.debug("initServer ok!");
    }

    protected abstract void startserver(String arg,Properties params);
   
    public static void start(String arg){
        initServer();
        server.startserver(arg,params);
    }
   
    public static void main(String[] args) {
        if(args.length==0){
            args=new String[1];
            args[0] = "";
            //args[0] = "stop";
        }
        server.start(args[0]);
    }
}

XmlrpcServer类:

 package Call.Information.ServerRpc;

import java.io.File;
import java.io.IOException;
import java.sql.ResultSet;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Properties;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.xmlrpc.XmlRpcRequest;
import org.apache.xmlrpc.XmlRpcRequestConfig;
import org.apache.xmlrpc.common.XmlRpcHttpRequestConfig;
import org.apache.xmlrpc.server.PropertyHandlerMapping;
import org.apache.xmlrpc.server.XmlRpcServer;
import org.apache.xmlrpc.server.XmlRpcServerConfigImpl;
import org.apache.xmlrpc.server.AbstractReflectiveHandlerMapping.AuthenticationHandler;
import org.apache.xmlrpc.webserver.WebServer;

public class XmlrpcServer extends IServer {

    public final static String SERVER_PORT = "xmlrpc.server.port";
    public final static String SERVER_USER = "xmlrpc.server.user";
    public final static String SERVER_PASS = "xmlrpc.server.pass";

    public final static String DEFAULT_SERVER_PORT = "";
    public final static String DEFAULT_SERVER_USER = "";
    public final static String DEFAULT_SERVER_PASS = "";
    
    public final static Log LOG = LogFactory.getLog(XmlrpcServer.class);
    
    public final static Map<String, String> AUTHENTICATION_MAP = new HashMap<String, String>();

    public int port = 3306;
    private WebServer webServer;
    private XmlRpcServer xmlRpcServer;

    public static class UserPasswordAuthenticationHandler implements
            AuthenticationHandler {

        public boolean isAuthorized(XmlRpcRequest request) {
            XmlRpcRequestConfig config = request.getConfig();
            if (config instanceof XmlRpcHttpRequestConfig) {
                XmlRpcHttpRequestConfig httpRequestConfig = (XmlRpcHttpRequestConfig) config;

                String user = httpRequestConfig.getBasicUserName();
                String pass = httpRequestConfig.getBasicPassword();
                for (Iterator<String> it = AUTHENTICATION_MAP.keySet()
                        .iterator(); it.hasNext();) {
                    String key = it.next();
                    String value = AUTHENTICATION_MAP.get(key);
                    if (key.equals(user) && value.equals(pass))
                        return true;
                }
            }
            return false;
        }
    }

    public static class ServerThread extends Thread {
        public ServerThread(int port) {
            webServer = new WebServer(port);
            xmlRpcServer = webServer.getXmlRpcServer();
        }

        public void run() {
            PropertyHandlerMapping phm = new PropertyHandlerMapping();
            try {
                phm.setAuthenticationHandler(new UserPasswordAuthenticationHandler());
                for(Iterator<String> it = handlerMap.keySet().iterator();it.hasNext();){
                    String name = it.next();
                    Class clazz = handlerMap.get(name);
                    phm.addHandler(name, clazz);
                }
            } catch (Exception e) {
                e.printStackTrace();
                return;
            }
            xmlRpcServer.setHandlerMapping(phm);
            XmlRpcServerConfigImpl serverConfig = (XmlRpcServerConfigImpl) xmlRpcServer
                    .getConfig();
            serverConfig.setBasicEncoding("UTF-8");
            serverConfig.setEnabledForExtensions(true);
            serverConfig.setContentLengthOptional(false);
            try {
                webServer.start();
            } catch (Exception e) {
                return;
            }
        }

        public void shutdown() {
            webServer.shutdown();
            this.interrupt();
        }

        protected void finalize() {
            webServer = null;
            xmlRpcServer = null;
        }

        private WebServer webServer;
        private XmlRpcServer xmlRpcServer;
    }

    public void startserver(String arg, Properties params) {
        Properties pairs = params;
        String lockFile = System.getProperty("java.io.tmpdir") + "/call.lock";
        int port = Integer.parseInt(pairs.getProperty(SERVER_PORT,
                DEFAULT_SERVER_PORT));
        File lock = new File(lockFile);
        if (arg.equals("stop")) {
            lock.delete();
            System.exit(-1);
        }
        ServerThread thread = new ServerThread(port);
        if (lock.exists()) {
            LOG.info("XmlrpcServer: Create lock file [" + lockFile + "] faild.");
            System.exit(-1);
        }
        try {
            lock.createNewFile();
        } catch (IOException e1) {
            LOG.info("XmlrpcServer: Create lock file faild.");
        }
        String sql = "select * from user";
        SQLHelper helper;
        try {
            helper = new SQLHelper();
            ResultSet rs = helper.results(sql);
            while (rs.next()) {
                AUTHENTICATION_MAP.put(rs.getString("username"), rs.getString("password"));
            }
        } catch (Exception e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        String user = pairs.getProperty(SERVER_USER, DEFAULT_SERVER_USER);
        String pass = pairs.getProperty(SERVER_PASS, DEFAULT_SERVER_PASS);
        AUTHENTICATION_MAP.put(user, pass);
        LOG.info("XmlrpcServer : Listen on [" + port + "]");
        thread.start();
        while (lock.exists()) {
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                thread.stop();
            }
        }
        thread.shutdown();
        while (thread.getState() == Thread.State.RUNNABLE) {
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {

            }
        }
        LOG.info("XmlrpcServer : Shutdown");
        System.exit(0);
    }
}
TestXmlrpc类:

package Call.Information.clientRpc;
import java.net.URL;
import java.util.List;
import java.util.Map;

import org.apache.xmlrpc.client.XmlRpcClient;
import org.apache.xmlrpc.client.XmlRpcClientConfigImpl;

/**
 *
 * @version TextXmlRpc.java v. 1.0.0 2012-5-16
 * @author FengXiYang
 * copyright (c) 2012 北京叁加伍网络科技有限公司   http://www.3jia5.com
 */

public class TestXmlRpc {
   
    public static void main(String[] args) {
        String url = "http://211.147.6.238:61002/xmlrpc";
        String username = "net_counts31582012";
        String password = "net_@3158cn&2011";
        String method = "CountsNet.getCq_Domain_Url"; //CALL.Send
        Object[] pars = new Object[10];
        pars[0] = "";    //客户日志字符串(#分隔) (登陆ID,登陆用户名,IP,描述,时间)
        pars[1] = "1";   //第几页
        pars[2] = "10";    //每页显示条数
        pars[3] = "20120506";   //开始时间(yyyyMMdd)
        pars[4] = "20120506";     //结束时间(yyyyMMdd)
        pars[5] = "2";    //统计主域名ID(必填,1:cn,2:net,3:9978)
        pars[6] = "";          //当前域名, (查多个)
        pars[7] = "";          //项目ID           
        pars[8] = "";          //员工ID
        pars[9] = "";          //新闻ID
        try{
            XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl();
            config.setServerURL(new URL(url));
            config.setBasicUserName(username);
            config.setBasicPassword(password);
            XmlRpcClient client = new XmlRpcClient();
            client.setConfig(config);
            String result = (String) client.execute(method, new Object[]{pars});
            System.out.println(result);
        }
        catch(Exception ex){
            ex.printStackTrace();
        }
    }
   
   
}

你可能感兴趣的:(rpc调用)