paulwong

          Tuscany 2 的基本配置與流程

          實(shí)習(xí)期間mentor讓看看Tuscany——apache的一個(gè)頂級(jí)項(xiàng)目。之前一直沒有接觸過,聽mentor說了下用途過后,感覺其像是alibaba的分布式服務(wù)框架Dubbo,簡(jiǎn)要看了看,似乎和RMI也有相關(guān)性。總之它也是面向服務(wù)的分布式框架。經(jīng)過一下午的嘗試,發(fā)現(xiàn)Tuscany 2和Tuscany 1還是有比較大的不同(API方面、設(shè)計(jì)思想沒有深入研究不知道),網(wǎng)上關(guān)于Tuscany的資料也不多,所以在此寫文章mark一下。

          Tuscany 1的API參考這位博主http://blog.csdn.net/ajun_studio/article/details/7770023


          1. 準(zhǔn)備

          首先是在工程中引入Tuscany 2.0.1的jar包,從一個(gè)Apache的China鏡像上不難找到(PS:Tuscany 1在官網(wǎng)上已經(jīng)不維護(hù)了)。

          工程需要實(shí)現(xiàn)客戶端調(diào)用遠(yuǎn)程服務(wù)器端的服務(wù)的功能。該項(xiàng)目中調(diào)用遠(yuǎn)程完成“加”的功能。


          2. 入門

          首先添加IAdd接口

          package com.ajun.tuscany.server;  
            
          public interface IAdd {  
              double add(double n1,double n2);  
          }  
          然后是實(shí)現(xiàn)類Add

          package com.ajun.tuscany.server;  
            
          public class Add implements IAdd {  
            
              @Override  
              public double add(double n1, double n2) {  
                  // TODO Auto-generated method stub  
                  return n1 + n2;  
              }  
            
          加減乘除都屬于“計(jì)算”類,此處為了簡(jiǎn)便,只實(shí)現(xiàn)“加”方法。然后是“計(jì)算”的接口。

          package com.ajun.tuscany.server;  
            
          public interface ICalculator {  
              double add(double n1, double n2);  
          }  
          然后是“計(jì)算”的實(shí)現(xiàn),注意一定要在setter中加入@Reference,否則會(huì)報(bào)錯(cuò),這里類似于Spring的注入。

          package com.ajun.tuscany.server;  
            
          import org.oasisopen.sca.annotation.Reference;  
            
          public class Calculator implements ICalculator {  
            
              private IAdd add;  
            
              public IAdd getAdd() {  
                  return add;  
              }  
            
              @Reference  
              public void setAdd(IAdd add) {  
                  this.add = add;  
              }  
            
              @Override  
              public double add(double n1, double n2) {  
                  // TODO Auto-generated method stub  
                  return this.add.add(n1, n2);  
              }  
            
          }  
          到此,基本的業(yè)務(wù)邏輯類就編寫好了,接下來,是Tuscany中重要的配置文件,即XXX.composite,其本質(zhì)也是一個(gè)xml。如果不是面向分布式服務(wù),該xml文件結(jié)構(gòu)類似Spring的application.xml。下面是Calculator.composite,注意配置文件中reference,name標(biāo)記為add,應(yīng)該也是同Spring的大寫首字母規(guī)則,通過settrt注入。

          <?xml version="1.0" encoding="UTF-8"?>           
          <composite xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912"  
                     xmlns:tuscany="http://tuscany.apache.org/xmlns/sca/1.1"  
                     targetNamespace="http://sample"  
                     xmlns:sample="http://sample"  
                     xmlns:scallop="http://scallop/xmlns/sca/1.1"   
                     name="Calculator" >    
                
              <component name="CalculatorServiceComponent">    
                  <implementation.java class="com.ajun.tuscany.server.Calculator" />  
                  <reference name="add" target="AddComponent"/>     
              </component>    
                    
              <component name="AddComponent">    
                  <implementation.java class="com.ajun.tuscany.server.Add" />    
              </component>    
                
          </composite>   

          最后是運(yùn)行main的類

          package com.ajun.tuscany.server;  
            
          import org.apache.tuscany.sca.node.Node;  
          import org.apache.tuscany.sca.node.NodeFactory;  
            
          public class StartService {  
            
              public static void main(String[] args) {  
                  Node node = NodeFactory.newInstance().createNode(  
                          "Calculator.composite");  
                  node.start();  
                  System.out.println("service啟動(dòng)");  
                  ICalculator c = node.getService(Calculator.class,  
                          "CalculatorServiceComponent");  
                  System.out.println(c.add(2, 2));  
              }  
            
          運(yùn)行輸出如下

          2014-11-10 17:39:24 org.apache.tuscany.sca.node.impl.NodeFactoryImpl loadContributions
          信息: Loading contribution: file:/E:/HuRanjie/EclipseWorkspace/Calculatoer_01/bin/
          2014-11-10 17:39:24 org.apache.tuscany.sca.host.rmi.DefaultRMIHost registerService
          信息: RMI service registered: rmi://127.0.0.1:8099/CalculatorRMIService
          2014-11-10 17:39:24 org.apache.tuscany.sca.core.assembly.impl.DomainRegistryImpl addEndpoint
          信息: Add endpoint - binding.rmi - rmi://127.0.0.1:8099/CalculatorRMIService
          2014-11-10 17:39:24 org.apache.tuscany.sca.core.assembly.impl.DomainRegistryImpl addEndpoint
          信息: Add endpoint - binding.sca - AddComponent/Add
          service啟動(dòng)
          4.0


          3. 遠(yuǎn)程調(diào)用rmi

          上面并沒有將“計(jì)算”類作為一個(gè)服務(wù),暴露給遠(yuǎn)程調(diào)用,只是實(shí)現(xiàn)了本地的裝配。下面將其作為服務(wù)給遠(yuǎn)程調(diào)用,后面可以看到,只需要暴露一個(gè)包括host、port、serviceName


          首先,修改配置文件,修改為如下樣子——在本地(127.0.0.1)的8099端口暴露出名字為CalculatorRMIService的服務(wù)

          <?xml version="1.0" encoding="UTF-8"?>           
          <composite xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912"  
                     xmlns:tuscany
          ="http://tuscany.apache.org/xmlns/sca/1.1"  
                     targetNamespace
          ="http://sample"  
                     xmlns:sample
          ="http://sample"  
                     xmlns:scallop
          ="http://scallop/xmlns/sca/1.1"   
                     name
          ="Calculator" >    
                
              <component name="CalculatorServiceComponent">    
                  <implementation.java class="com.ajun.tuscany.server.Calculator" />  
                    
                  <service name="Calculator">    
                      <interface.java interface="com.ajun.tuscany.server.ICalculator"/>    
                      <tuscany:binding.rmi uri="rmi://127.0.0.1:8099/CalculatorRMIService"/>    
                  </service>  
                    
                  <reference name="add" target="AddComponent"/>     
              </component>    
                    
              <component name="AddComponent">    
                  <implementation.java class="com.ajun.tuscany.server.Add" />    
              </component>    
                
          </composite>   

          服務(wù)器端的main主要功能是啟動(dòng)該服務(wù),如下

          package com.ajun.tuscany.server;  
            
          import org.apache.tuscany.sca.node.Node;  
          import org.apache.tuscany.sca.node.NodeFactory;  
            
          public class StartService {  
            
              public static void main(String[] args) {  
                  Node node = NodeFactory.newInstance().createNode(  
                          "Calculator.composite");  
                  node.start();  
                  System.out.println("service啟動(dòng)");  
              }  
            

          客戶端通過rmi調(diào)用服務(wù)器端的服務(wù),來實(shí)現(xiàn)功能,如下

          package com.ajun.tuscany.client;  
            
          import java.rmi.Naming;  
          import com.ajun.tuscany.server.ICalculator;  
            
          public class CalculatorClient {  
            
              public static void main(String[] args) throws Exception {  
                   ICalculator c= (ICalculator) Naming.lookup("http://127.0.0.1:8099/CalculatorRMIService");    
                   System.out.println(c.add(1, 2));    
              }  
          }  

          啟動(dòng)服務(wù)端輸出


          2014-11-10 18:00:30 org.apache.tuscany.sca.node.impl.NodeImpl start
          信息: Starting node: http://tuscany.apache.org/sca/1.1/nodes/default0 domain: default
          2014-11-10 18:00:30 org.apache.tuscany.sca.node.impl.NodeFactoryImpl loadContributions
          信息: Loading contribution: file:/E:/HuRanjie/EclipseWorkspace/Calculatoer_01/bin/
          2014-11-10 18:00:31 org.apache.tuscany.sca.host.rmi.DefaultRMIHost registerService
          信息: RMI service registered: rmi://127.0.0.1:8099/CalculatorRMIService
          2014-11-10 18:00:31 org.apache.tuscany.sca.core.assembly.impl.DomainRegistryImpl addEndpoint
          信息: Add endpoint - binding.rmi - rmi://127.0.0.1:8099/CalculatorRMIService
          2014-11-10 18:00:31 org.apache.tuscany.sca.core.assembly.impl.DomainRegistryImpl addEndpoint
          信息: Add endpoint - binding.sca - AddComponent/Add
          service啟動(dòng)

          客戶端輸出

          3.0

          posted on 2014-12-24 14:07 paulwong 閱讀(1841) 評(píng)論(0)  編輯  收藏 所屬分類: SOA


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 县级市| 沭阳县| 方正县| 花莲市| 富裕县| 太谷县| 齐河县| 扶余县| 肥东县| 桦南县| 古蔺县| 塔城市| 彭泽县| 韶山市| 绵竹市| 右玉县| 莲花县| 德化县| 文水县| 海门市| 晋中市| 庆城县| 黄梅县| 郎溪县| 突泉县| 林周县| 东乡县| 巴楚县| 石泉县| 屏东市| 垦利县| 昌吉市| 晋江市| 大姚县| 邳州市| 金乡县| 城口县| 房山区| 虎林市| 章丘市| 金溪县|