国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
Spring遠(yuǎn)程調(diào)用小結(jié)

最近在做項(xiàng)目時(shí)用到了很多遠(yuǎn)程方法調(diào)用,如Hession、RMI、EJB、JMS等,感覺Spring對這些的包裝真是不不錯(cuò),小記一下。
一、Hession:
    相比WebService,Hession更簡單、快捷。采用二進(jìn)制RPC協(xié)議,由于采用的是二進(jìn)制協(xié)議,所以它很適合于發(fā)送二進(jìn)制數(shù)據(jù)。
    Hession通過Servlet來提供遠(yuǎn)程服務(wù)。下面介紹兩種Hession服務(wù)的發(fā)布和調(diào)用方法。
    1、Servlet采用Hession自帶的HessionServlet來提供服務(wù),通過HessionProxyFactory工具類來調(diào)用Hession服務(wù)。
    web.xml配置如下:
     ....
       <servlet>
           <servlet-name>hessionService</servlet-name>
            <servlet-class>com.caucho.hessian.server.HessionServlet</servlet-class>
           <load-on-startup>1</load-on-startup>
           <init-param>
                <param-name>service-class</param-name>
                <param-value>lee.HelloImpl</param-value>
            </init-param>
        </servlet
        <servlet-maping>
               <servlet-name>hessionService</servlet-name>
              <url-patter>/hessionService</url-pattern>
        </servlet-mapping>
    .............
      客戶端調(diào)用:
          ..............
         String url = "http://localhost:8888/hession/hessionService";
         HessionPorxyFactory factory = new HessionPorxyFactory();
         //獲得Hession服務(wù)的遠(yuǎn)程調(diào)用
         Hello h = (Hello) factory.create(Hello.class,url);
         //調(diào)用遠(yuǎn)程服務(wù)
         System.out.println(d.hello("xixi"));
         ..............
    2、servlet采用Spring的DispatcherServlet來提供服務(wù),客戶端采用Spring的HessionProxyFactoryBean連接Hession服務(wù)。
      首先需要在web.xml中配置DispatchetServlet。
     其次建立[servlet-name]-servlet.xml文件,該方件用于配置對外提供的服務(wù),這里要用到Spring框架提供的HessianServiceExporter來定義輸出的服務(wù)。它的功能就是把普通Bean定義可對外提供服務(wù)的Bean。這是由于DispatchetServlet查找提供服務(wù)的Bean時(shí),是通過與配置的Servlet名字相對應(yīng)的[servlet-name]-servlet.xml,
     客戶端采用HessionProxyFactoryBean主要是利用Spring的IOC,否則的話完全可以用第一種方法。在客戶端的Spring配置文件中,用HessionProxyFactoryBean把遠(yuǎn)程提供服務(wù)的Bean(對應(yīng)上面servletname-servlet.xml中配置的輸出服務(wù)bean)配置到本地BeanFactory,使用時(shí)如同使用本地Bean方法一樣。

二、HttpInvoker:
  使用 HttpInvoker,不需要額外的類庫,與Hession的輕量級(jí)傳輸協(xié)議不同,Spring HttpInvoker使用Java序列化來序列化參數(shù)和返回值,然后基于Http協(xié)議傳輸經(jīng)序列化后的對象,當(dāng)參數(shù)或返回值是復(fù)雜類型,并且不能通過Hession的序列化機(jī)制序列化時(shí),HttpInvoker就很有優(yōu)的勢。
  它的用法與Hession非常相似。Spring使用HttpInvokerServiceExporter把普通bean實(shí)例輸出成遠(yuǎn)程對象??蛻舳诉B接Spring提供了HttpInvokerProxyFactoryBean工廠連接服務(wù),類似于HessionProxyFactoryBean,配置時(shí)只需指定服務(wù)URL和服務(wù)實(shí)現(xiàn)接口,通過代理,Spring可將調(diào)用轉(zhuǎn)換成POST請求發(fā)送到指定服務(wù)。

三、RMI:
  客戶端和服務(wù)器端必須是純Java實(shí)現(xiàn)。RMI服務(wù)是典型的面向接口編程,只有在遠(yuǎn)程接口里定義的方法才會(huì)作為遠(yuǎn)程服務(wù),遠(yuǎn)程方法的返回值和參數(shù)都必須實(shí)現(xiàn)Serializable接口,因?yàn)檫h(yuǎn)程在網(wǎng)絡(luò)上傳輸只能傳輸字節(jié)流,因此,要求參數(shù)、返回值都可以轉(zhuǎn)換成字節(jié)流-即實(shí)現(xiàn)序列化。
  一、傳統(tǒng)使用方法:
 ?。?、遠(yuǎn)程服務(wù)提供類必須實(shí)現(xiàn)遠(yuǎn)程接口(java.rmi.Remote)并繼承java.rmi.server.UnicastRemoteObject對象。遠(yuǎn)程服務(wù)類必須有構(gòu)造器,而且構(gòu)造器必須拋出RemoteException異常。
       2、注冊服務(wù):
    Server imp = new ServerImpl(); //創(chuàng)建遠(yuǎn)程服務(wù)類實(shí)例
              LocateRegistry.createRegistry(1099); //注冊遠(yuǎn)程服務(wù)的端口
              Naming.rebind("rmi://:1099/fdf",imp); //將遠(yuǎn)程服務(wù)實(shí)例綁定為遠(yuǎn)程服務(wù)
 ?。?、對于使用RMI,將源文件存盤編譯還不夠,還必須使用rmic命令編譯服務(wù)類,編譯服務(wù)類是為了行成stub和skeleton。
 ?。?、客戶端要面向接口編程,客戶端部分需要服務(wù)實(shí)現(xiàn)接口的.class文件和生成的stub文件??蛻舳苏{(diào)用示例代碼如下:
  public class RMIClient {
            public static void main(String[] args) throws Exception {
                 Server ser = (Server)Naming.lookup("rmi://:1099/fdf");   
                 System.out.println(ser.helloWorld("yeeku"));
                 System.out.println(ser.getPerson("yeeku",28));
            }
      }
  原理:RMI的具體實(shí)現(xiàn),依然是依賴于底層的Socket編程。RMI依賴于TCP/IP傳輸協(xié)議,服務(wù)器端skeleton建立ServerSocket監(jiān)聽請求,而客戶端建立Socket請求邊接。RMI實(shí)現(xiàn)網(wǎng)絡(luò)傳輸?shù)亩嗑€程、IO等底層細(xì)節(jié)。這些細(xì)節(jié)的實(shí)現(xiàn)就隱藏在rmic命令的執(zhí)行中,使用rmic命令編譯時(shí)生成如下兩個(gè)class文件:
  stub:該文件用于與客戶端交流,建立Socket請求連接。
  skeleton:該文件用于與服務(wù)端門交流,建立ServerSocket監(jiān)聽請求。
  二、Spring封裝
 ?。薄⒎?wù)器端的接口不用實(shí)現(xiàn)Remote接口,實(shí)現(xiàn)類也不用繼承UnicastRemoteObject類,都是普通的Java接口和類。
 ?。?、如果要暴露遠(yuǎn)程方法,Spring提供了RmiServiceExporter類,該類可以將一個(gè)普通Bean實(shí)例綁定成遠(yuǎn)程服務(wù)。將普通bean實(shí)例綁定為遠(yuǎn)程服務(wù)的完整配置如下:
  <bean class="org.springframework.remoting.rmi.RmiServiceExporter">
            <!-- 指定暴露出來的遠(yuǎn)程服務(wù)名,可任意取名字,但客戶端要用到該名字-->
            <property name="serviceName">
                   <value>RealtimeTransferService</value>
    </property>
            <!--配置暴露目標(biāo)-->
            <property name="service" ref="realtimeTransfer" />
    <!--配置bean實(shí)現(xiàn)的接口,該接口被當(dāng)作遠(yuǎn)程接口對待-->  
            <property name="serviceInterface"
                        value="com.topnet.tais.prefixmachine.business.realtimepay.RealtimeTransfer" />
    <!--指定RMI遠(yuǎn)程服務(wù)的端口號(hào)--> 
             <property name="registryPort">
                <value>1099</value>
             </property>
      3、客戶端訪問方式。
    <bean id = "" class= "org.springframework.remoting.rmi.RmiProxyFactoryBean">
                   <property name="serviceUrl">
                         <value>rmi://1227.0.0.1:1099/RealtimeTransferService</value>
                  </property>
                  <property name="serviceInterface">
                         <value>com.topnet.tais.prefixmachine.business.realtimepay.RealtimeTransfer</value>
                  </property>
               </bean>    

四、JMS:
  JMS主要有兩個(gè)版本:1.0.2和1.1,二者的區(qū)別:JMS1.0.2對兩種消息模型提供了不同的類體系。JMS1.1則使用統(tǒng)一模型的概念,從而減少兩種模型之間的差別,避免客戶端代碼的差別。
  消息的兩種模型:
    點(diǎn)對點(diǎn)消息處理:這種消息處理模型為應(yīng)用中的各個(gè)邏輯處理單元提供可靠的通信支持,JMS系統(tǒng)保證消息傳遞給消息接收者,不會(huì)同被多個(gè)接收者接收,如果消息接收者暫不在連接范圍內(nèi),JMS保證消息不會(huì)丟失,直到接收者進(jìn)入連接,消息將自動(dòng)送達(dá)。因此,JMS將消息保存到永久性介質(zhì),如數(shù)據(jù)庫或文件上。
  發(fā)布/訂閱消息處理:
    使用這種模型,可以將消息發(fā)送到一個(gè)主題,每個(gè)子主題可以有多個(gè)訂閱者。JMS系統(tǒng)負(fù)責(zé)將消息的副本傳給主題的每個(gè)訂閱者。
 ?。剩停娱_發(fā):
    發(fā)送步驟:1、連接工廠創(chuàng)建JMS連接;2、JMS連接創(chuàng)建JMS會(huì)話;3、JMS會(huì)話創(chuàng)建消息生產(chǎn)者;4、JMS會(huì)話創(chuàng)建空JMS消息;5、JMS消息調(diào)用自身的主法填充內(nèi)容;6、JMS消息生產(chǎn)者發(fā)送消息。
    接收步驟:1、連接工廠創(chuàng)建JMS連接;2、JMS連接創(chuàng)建JMS會(huì)話;3、JMS會(huì)話創(chuàng)建JMS消費(fèi)者;4、JMS消費(fèi)者接收消息,同步和異步接收消息方工略有差異。
  Spring對JMS的支持:
   ?。?、提供了JmsTemplate
               2、管理連接工廠,Spring提供了一個(gè)ConnectionFactory的實(shí)現(xiàn)SingleConnectionFactory,該連接工廠對所有的createConnection調(diào)用返回同一個(gè)連接,并忽略close的調(diào)用。這在測試和獨(dú)立的環(huán)境中相當(dāng)有用,只有同一個(gè)連接被用于多個(gè)JmsTemplate,這樣才可以跨越多個(gè)事務(wù)。創(chuàng)建SingleConnectionFactory必須提供一個(gè)標(biāo)準(zhǔn)ConnectionFactory的引用,作為目標(biāo)連接工廠,目票連接工廠需要應(yīng)用服務(wù)器提供。
   ?。?、管理消息目的,消息生產(chǎn)者的消息目的也是消息消費(fèi)提取消息的消息源,當(dāng)配置Spring應(yīng)用上下文時(shí),可以使用工廠類 JndiObjectFactory配置消息目的。布爾屬性PubSubDomain用來配置JmsTemplate是否使用Pub/Sub模型,默認(rèn)值是false,消息隊(duì)列模型。該屬性對JMS1.1沒有影響。DefaultDestionation屬性用于配置JmsTemplate的默認(rèn)目的,如果配置了默認(rèn)目的,JmsTemplate發(fā)送和接收操作可以無須指定消息目的。
   ?。础MS與事務(wù),Spring提供一個(gè)JmsTransactionManager來管理事務(wù),它對于SingleConnectionFactory有效。JmsTransactionManger將Connection/Session對綁定到線程,然而在一個(gè)J2EE環(huán)境中,ConnectionFactory將緩存連接和會(huì)話,所以被綁定到線程的實(shí)例依賴于緩存行為。JmsTempate也能和JtaTransactionManager一起使用,以完成分布式事務(wù)。
  Spring中的配置:     
    1、JNDI上下文是取得JMS資源的起始位置,因此首先要配置JNDI模板,如下所示:
     <bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate">
              <description>jndi環(huán)境配置</description>
             <property name="environment">
                  <props>
                     <prop key="java.naming.factory.initial">weblogic.jndi.WLInitialContextFactory</prop>
                  </props>
              </property>
        </bean>
   ?。?、配置隊(duì)列連接工廠
      <bean id="jmsConnectionFactory"    class="org.springframework.jndi.JndiObjectFactoryBean">
             <description>jms連接工廠</description>
               <property name="jndiTemplate">
                   <ref bean="jndiTemplate"/>
              </property>
              <property name="jndiName">
                  <value>Toptais3Ext-JMSConnectionFactory</value>
              </property>
          </bean>
   ?。?、配置消息目的
      <bean id="destinationBatchStartQueue" class="org.springframework.jndi.JndiObjectFactoryBean">
             <description>頁面發(fā)起批量代扣請求的長事件Queue </description>
               <property name="jndiTemplate">
                    <ref bean="jndiTemplate"/>
               </property>
               <property name="jndiName">
                    <value>Toptais3Ext-BatchStartQueue</value>
               </property>
          </bean>
   ?。础⑴渲肑msTemplate
                     <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate102">
        <description>發(fā)送JMS消息的模板</description>
                          <property name="connectionFactory">
                                <bean class="org.springframework.jms.connection.SingleConnectionFactory102">
                                   <property name="targetConnectionFactory" ref="jmsConnectionFactory"/>
                               </bean>
                         </property>
                         <property name="messageConverter">
                              <ref bean="messageConverter"/>
                         </property>
                   </bean>
              5、配置發(fā)送和接收bean

五、EJB:

六、WebService:


本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報(bào)
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
SpringFramework(11) (完)
Spring對JMS的支持
將Spring和Hibernate 與WAS一起使用
用SpringJMS使異步消息變得簡單
JMS-Spring
Spring遠(yuǎn)程數(shù)據(jù)源JTA事務(wù)連接配置
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服