spring集成PHPRPC及使用
PHPRPC,它的商业版本是Hprose。这里仅记录其使用方法。其它相关内容可自行搜索。
对于开源的东西,建议大家看看其源码。
1、需要引入的jar包:phprpc_spring.jar,http://pan.baidu.com/s/1eQhbUwU。
2、web.xml中添加的内容:
1 <!-- phprpc --> 2 <servlet> 3 <servlet-name>phprpc</servlet-name> 4 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 5 <init-param> 6 <param-name>contextConfigLocation</param-name> 7 <param-value>classpath:phprpc-servlet.xml</param-value> 8 <!-- <param-value>WEB-INF/classes/phprpc-servlet.xml</param-value> --> 9 </init-param> 10 <load-on-startup>2</load-on-startup> 11 </servlet> 12 <servlet-mapping> 13 <servlet-name>phprpc</servlet-name> 14 <url-pattern>/phprpc/*</url-pattern> 15 </servlet-mapping>
3、新建phprpc-servlet.xml,内容如下:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" 4 xmlns:tx="http://www.springframework.org/schema/tx" 5 xsi:schemaLocation="http://www.springframework.org/schema/beans 6 http://www.springframework.org/schema/beans/spring-beans-3.2.xsd"> 7 8 9 <!-- PHPRPC配置 --> 10 <!--appservice中要注入的内容,需要set和get方法。同时此处用property配置好。不讲详细了 --> 11 <bean id="phprpcControllerImpl" class="com.XXXX.biz.controller.PhprpcControllerImpl"> 12 <property name="phprpcService" ref="phprpcService"></property> 13 </bean> 14 15 <bean name="/phpRpcService.htm" class="org.phprpc.spring.remoting.PHPRPC_Exporter"> 16 <property name="service" ref="phprpcControllerImpl" /> 17 <property name="serviceInterface" value="com.XXXX.biz.controller.PhprpcController" /> 18 </bean> 19 </beans> 20 21 22 23
2和3决定了可以使用 项目路径例如:http://localhost:8080/project/phprpc/phpRpcService.htm 访问接口。
4、分别新建以下内容
接口:PhprpcController.java
public interface PhprpcController { public String test(String type,Object firstorders,Object secondorders,Object thirdorders); }
接口实现类:PhprpcControllerImpl.java
@Controller public class PhprpcControllerImpl extends BaseController implements PhprpcController{ @Autowired private PhprpcService phprpcService; public PhprpcService getPhprpcService() { return phprpcService; } public void setPhprpcService(PhprpcService phprpcService) { this.phprpcService = phprpcService; } public String test(String type,Object firstorders,Object secondorders,Object thirdorders) { log.info("执行rpc。。。 type:"+type+" firstorders:"+firstorders+" secondorders:"+secondorders+" thirdorders"+thirdorders); log.info("参数类型。。。 type:"+type+" firstorders:"+firstorders.getClass().getName()+ " secondorders:"+secondorders.getClass().getName()+" thirdorders"+thirdorders.getClass().getName()); String msg = "Hello PHPRPC!"; return msg; } }
--------------------分界线--------------------------上面是构建phpRpc,下面是使用----------------------------------------分界线-------------------------------------------
5、在知道了类似 【http://localhost:8080/project/phprpc/phpRpcService.htm】这样的地址后,我们可以在另外一个程序中这样使用该rpc提供的方法。
以下代码和前面4段没有什么关系,仅随意展示了其一些使用方法,方法名【pushOrderData】并无实际意义,请勿自行关联,以防被误导。
A、invoke的参数:第一个为方法名,第二个为传入方法的参数(对象数组,必须按照顺序存放参数)
B、org.phprpc.util.Cast 是一个PHPRPC封装好的数据类型转换工具类。
public class PhpRpcDemo { public static void main(String[] args) throws UnsupportedEncodingException { String url3 = "http://localhost:8080/XXXXXX/phprpc/phpRpcService.htm"; PHPRPC_Client client = new PHPRPC_Client(url3); //PhprpcClient.setEncryptMode(3); //1获取公钥 Object tempRet = client.invoke("getRsaPulbicKey", new Object[] {}); String tempJsonStr = Cast.toString(tempRet); System.out.println(tempJsonStr); //回调 //test1(client); //Map 和 List 类型 //test2(client); //String类型 String jsons2 = "[{'id':'872'}]"; Object ret = client.invoke("pushOrderData", new Object[] {"1",null,jsons2,null,null}); String s = Cast.toString(ret); System.out.println(s); */ //也可以以 callback形式调用. /* client.invoke("say", new Object[] {}, new PHPRPC_Callback() { public void handler(String result, Object[] args) { System.out.println("handler:"); System.out.println(result); System.out.println("args:"+args[0]); System.out.println(); } });*/ } private static void test2(PHPRPC_Client client) {
AssocArray ret1 = (AssocArray)client.invoke("pushOrderData", new Object[] {"1","","",""}); Map m = ret1.toHashMap(); //Cast.toString(null); System.out.println(m); } private static void test1(PHPRPC_Client client) { Object[] d = new Object[4]; client.invoke("pushOrderData", d,new PHPRPC_Callback() { public void handler(String result, Object[] args) { System.out.println("handler:"); System.out.println(result); System.out.println("args:"+args[0]); System.out.println(); } }); System.out.println(d); } }