Tuscany 2 的基本配置與流程
實習期間mentor讓看看Tuscany——apache的一個頂級項目。之前一直沒有接觸過,聽mentor說了下用途過后,感覺其像是alibaba的分布式服務(wù)框架Dubbo,簡要看了看,似乎和RMI也有相關(guān)性。總之它也是面向服務(wù)的分布式框架。經(jīng)過一下午的嘗試,發(fā)現(xiàn)Tuscany 2和Tuscany 1還是有比較大的不同(API方面、設(shè)計思想沒有深入研究不知道),網(wǎng)上關(guān)于Tuscany的資料也不多,所以在此寫文章mark一下。
Tuscany 1的API參考這位博主http://blog.csdn.net/ajun_studio/article/details/7770023
1. 準備
首先是在工程中引入Tuscany 2.0.1的jar包,從一個Apache的China鏡像上不難找到(PS:Tuscany 1在官網(wǎng)上已經(jīng)不維護了)。
工程需要實現(xiàn)客戶端調(diào)用遠程服務(wù)器端的服務(wù)的功能。該項目中調(diào)用遠程完成“加”的功能。
2. 入門
首先添加IAdd接口
public interface IAdd {
double add(double n1,double n2);
}
public class Add implements IAdd {
@Override
public double add(double n1, double n2) {
// TODO Auto-generated method stub
return n1 + n2;
}
}
public interface ICalculator {
double add(double n1, double n2);
}
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);
}
}
<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>
最后是運行main的類
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啟動");
ICalculator c = node.getService(Calculator.class,
"CalculatorServiceComponent");
System.out.println(c.add(2, 2));
}
}
信息: 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啟動
4.0
3. 遠程調(diào)用rmi
上面并沒有將“計算”類作為一個服務(wù),暴露給遠程調(diào)用,只是實現(xiàn)了本地的裝配。下面將其作為服務(wù)給遠程調(diào)用,后面可以看到,只需要暴露一個包括host、port、serviceName
首先,修改配置文件,修改為如下樣子——在本地(127.0.0.1)的8099端口暴露出名字為CalculatorRMIService的服務(wù)
<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主要功能是啟動該服務(wù),如下
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啟動");
}
}
客戶端通過rmi調(diào)用服務(wù)器端的服務(wù),來實現(xiàn)功能,如下
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));
}
}
啟動服務(wù)端輸出
信息: 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啟動
客戶端輸出
3.0
posted on 2014-12-24 14:07 paulwong 閱讀(1826) 評論(0) 編輯 收藏 所屬分類: SOA