Posted on 2010-01-28 10:50
瘋狂 閱讀(2394)
評論(1) 編輯 收藏 所屬分類:
spring
PHPRPC 是一個輕型的、安全的、跨網際的、跨語言的、跨平臺的、跨環境的、跨域的、支持復雜對象傳輸的、支持引用參數傳遞的、支持內容輸出重定向的、支持分級錯誤處理的、支持會話的、面向服務的高性能遠程過程調用協議。
通過兩個例子來簡單入門下:
下載:
PHPRPC 3.0.2 for Java , 當然要使用3.0.2 在這之前不支持集合類型,然后雙擊make.bat生成服務與客戶端(當然環境變量要設置的,老在myeclipse里開發,從來不設置,這下又敲半天。),生成phprpc.jar和phprpc_client.jar還有
phprpc_spring.jar 3個jar,在沒有集成spring的時候將phprpc.jar和phprpc_client.jar分別放到服務端可客戶端的lib下
1,servlet(或者jsp)模式:
首先建立接口:
public interface Hello {
public String sayHi(String name);
public TestPo getPo(TestPo po);
public List<TestPo> getPos(List<TestPo> pos);
實現:
public class HelloImpl implements Hello {
public String sayHi(String name) {
// TODO Auto-generated method stub
return "Hi,"+name;
}
public TestPo getPo(TestPo po) {
System.out.println("client :"+po.toString());
return new TestPo("server name", "server address");
}
public List<TestPo> getPos(List<TestPo> pos) {
List<TestPo> ps = new ArrayList<TestPo>();
for (int i = 0; i < pos.size(); i++) {
ps.add(new TestPo("server name_"+i,"server address_"+i));
System.out.println(pos.get(i).toString());
}
return ps;
}
Testpo.java 需要序列化
public class TestPo implements Serializable{
private static final long serialVersionUID = 1L;
private String name;
private String address;
public TestPo(String name, String address) {
super();
this.name = name;
this.address = address;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "TestPo [address=" + address + ", name=" + name + "]";
}
}
服務類:
public class PHPrcpServer extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
Hello hello = new HelloImpl();
PHPRPC_Server phprpc_server = new PHPRPC_Server();
phprpc_server.add(hello);
phprpc_server.start(request, response);
}
}
配置:
<servlet>
<servlet-name>PHPrcpServer</servlet-name>
<servlet-class>com.server.phprcp.PHPrcpServer</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>PHPrcpServer</servlet-name>
<url-pattern>/servlet/PHPrcpServer</url-pattern>
</servlet-mapping>
客戶端:
PHPRPC_Client client = new PHPRPC_Client("http://localhost:8080/serverspring/servlet/PHPrcpServer");
Hello m = (Hello) client.useService(Hello.class);
System.out.println(m.sayHi("chenlb"));
TestPo po = m.getPo(new TestPo("clent name","client address"));
System.out.println(po.toString());
List<TestPo> pcs = new ArrayList<TestPo>();
for (int i = 0; i < 20; i++) {
TestPo poc = new TestPo("client_name_"+i,"client_address_"+i);
pcs.add(poc);
}
List<TestPo> pl = m.getPos(pcs);
for (int i = 0; i < pl.size(); i++) {
System.out.println(pl.get(i).toString());
}
2 于spring的集成:
當然需要spring.jar spring-webmvc.jar 還有
phprpc_spring.jar
1建立web項目導入相關的包。
2,配置web.xml 當然如果你以前在spring里配置過rmi,
Hessian,httpinvoker,ws,你也許知道這一步如何配置:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:applicationContext-*.xml
</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<servlet>
<servlet-name>remote</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>remote</servlet-name>
<url-pattern>/remoteserver/*</url-pattern>
</servlet-mapping>
上文的接口和實現類不變,當然對list map都是支持的(測試通過) 這里只做了string
在server端發布服務:
當然是在web-inf 下面建立remote-servlet.xml
內容:
<bean name="phps" class="接口實現"/>
<bean name="/phpremote" class="org.phprpc.spring.remoting.PHPRPC_Exporter">//當然可以看出 phprcp實現了spring 對remote的通用接口
<property name="service" ref="phps"/>
<property name="serviceInterface" value="接口"/>
</bean>
配置tomcat 啟動后服務就啟動了,
3客戶端:客戶端使用java項目 當然也可以是web項目
添加spring.jar spring-webmvc.jar
配置客戶端:
<bean name="phprcp" class="org.phprpc.spring.remoting.PHPRPC_ProxyFactoryBean">
<property name="serviceUrl" value="http://localhost:8080/sall/remoteserver/phpremote"/>
<property name="serviceInterface" value="接口"/>
</bean>
將服務端的接口copy過來,保持包結構不變。
測試:
ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext-bean.xml");
Hello phpRcpI = (Hello) context.getBean("phprcp");
System.out.println(phpRcpI.sayHi("this is from phpclient..."));
如果對復雜類型 當然 implements Serializable是必須的,如同Hessian,
phphrcp效率還是不錯的 ,內部序列化和反序列化機制有了優化,還是值得學習和應用的。