瘋狂

          STANDING ON THE SHOULDERS OF GIANTS
          posts - 481, comments - 486, trackbacks - 0, articles - 1
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          phprcp 以及和spring的集成

          Posted on 2010-01-28 10:50 瘋狂 閱讀(2399) 評論(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效率還是不錯的 ,內部序列化和反序列化機制有了優化,還是值得學習和應用的。

          評論

          # re: phprcp 以及和spring的集成  回復  更多評論   

          2010-01-28 14:27 by qvod

          很實用!
          主站蜘蛛池模板: 库伦旗| 泗洪县| 正镶白旗| 彭水| 隆尧县| 洛浦县| 沾化县| 承德县| 石屏县| 于田县| 佳木斯市| 平舆县| 得荣县| 绥德县| 榆林市| 于田县| 静宁县| 广元市| 兴安县| 潍坊市| 偏关县| 墨玉县| 咸宁市| 铁岭市| 宜兰市| 高州市| 金坛市| 渝中区| 呼伦贝尔市| 博客| 上栗县| 宜宾县| 宁武县| 通化县| 淮北市| 济南市| 荔浦县| 清远市| 万盛区| 定安县| 沾益县|