在 TUSCANY SCA JAVA (三)
中是將計算機作為一個RMI服務進行綁定,對外提供進行訪問的,還有一種情況是如果所需要的功能在外界已經做好了,並以RMI開放供外界訪問,那麼tuscany如何引用呢?有這麼一個例子,如果計算機的功能在外界已經實現好了,並以RMI開放供外界訪問,來看看怎麼進行引用。
來看:
可以看出計算機組件 引用是指向了RMI服務端,並且提升為計算機組合構件的引用。
下面來說主要實現代碼:
供外加訪問的RMI服務端代碼:
關於java怎麼註冊RMI服務,google一下就知道了
ICalculatorRMI.java 添加@Remotable說明可以進行遠端存取
package com.ajun.tuscany.rmiserver;import java.rmi.Remote;import java.rmi.RemoteException;import org.osoa.sca.annotations.Remotable;/** * 計算機遠程RMI介面 * @author ajun * @e-mail zhaojun2066@gmail.com * @blog http://blog.csdn.net/ajun_studio * @version 建立時間:2012-7-25 下午9:25:52 */@Remotablepublic interface ICalculatorRMI extends Remote{/** * 加法 * @param n1 * @param n2 * @return */double add(double n1,double n2) throws RemoteException;/** * 減法 * @param n1 * @param n2 * @return */double subtract(double n1,double n2) throws RemoteException;/** * 除法 * @param n1 * @param n2 * @return */double divide(double n1,double n2) throws RemoteException;/** * 乘法 * @param n1 * @param n2 * @return */double multiply(double n1,double n2) throws RemoteException;}
CalculatorRMI.java實作類別
package com.ajun.tuscany.rmiserver;import java.rmi.RemoteException;import java.rmi.server.UnicastRemoteObject;/** * 計算機RMI服務類 * @author ajun * @e-mail zhaojun2066@gmail.com * @blog http://blog.csdn.net/ajun_studio * @version 建立時間:2012-7-25 下午9:26:19 */public class CalculatorRMI extends UnicastRemoteObject implementsICalculatorRMI {private static final long serialVersionUID = -6698638302125311021L;protected CalculatorRMI() throws RemoteException {super();}@Overridepublic double add(double n1, double n2) throws RemoteException {return n1+n2;}@Overridepublic double subtract(double n1, double n2) throws RemoteException {return n1-n2;}@Overridepublic double divide(double n1, double n2) throws RemoteException {return n1*n2;}@Overridepublic double multiply(double n1, double n2) throws RemoteException {return n1/n2;}/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stub}}
註冊RMI服務
CalculatorRMIServer.java
package com.ajun.tuscany.rmiserver;import java.rmi.AlreadyBoundException;import java.rmi.RemoteException;import java.rmi.registry.LocateRegistry;import java.rmi.registry.Registry;/** * 註冊RMI服務類 * @author ajun * @e-mail zhaojun2066@gmail.com * @blog http://blog.csdn.net/ajun_studio * @version 建立時間:2012-7-25 下午9:29:47 */public class CalculatorRMIServer {/** * @param args * @throws RemoteException * @throws AlreadyBoundException */public static void main(String[] args) throws RemoteException, AlreadyBoundException {CalculatorRMI rmi = new CalculatorRMI();//連接埠號碼8099Registry rmiRegistry = LocateRegistry.createRegistry(8099);//為rmi綁定的服務的名字為CalculatorRMIServicermiRegistry.bind("CalculatorRMIService", rmi);}}
tuscany這邊共有6個java類,其中四個介面分別代表加減乘除,其餘兩個為計算機類和計算機介面
加法:IAdd.java
package com.ajun.tuscany.server;/** * 加法介面 * @author ajun * @e-mail zhaojun2066@gmail.com * @blog http://blog.csdn.net/ajun_studio * @version 建立時間:2012-7-19 下午9:47:25 */public interface IAdd {double add(double n1,double n2);}
減法:ISubtract.java
package com.ajun.tuscany.server;/** * 減法介面 * @author ajun * @e-mail zhaojun2066@gmail.com * @blog http://blog.csdn.net/ajun_studio * @version 建立時間:2012-7-19 下午9:52:00 */public interface ISubtract {double subtract(double n1,double n2);}
乘法:IMultiply.java
package com.ajun.tuscany.server;/** * 乘法介面 * @author ajun * @e-mail zhaojun2066@gmail.com * @blog http://blog.csdn.net/ajun_studio * @version 建立時間:2012-7-19 下午9:50:47 */public interface IMultiply {double multiply(double n1,double n2);}
除法:IDivide.java
package com.ajun.tuscany.server;/** * 除法介面 * @author ajun * @e-mail zhaojun2066@gmail.com * @blog http://blog.csdn.net/ajun_studio * @version 建立時間:2012-7-19 下午9:48:53 */public interface IDivide {double divide(double n1,double n2);}
計算機介面:ICalculator.java
package com.ajun.tuscany.server;/** * 電腦介面 * @author ajun * @e-mail zhaojun2066@gmail.com * @blog http://blog.csdn.net/ajun_studio * @version 建立時間:2012-7-19 下午10:02:20 */public interface ICalculator {/** * 加法 * @param n1 * @param n2 * @return */double add(double n1,double n2);/** * 減法 * @param n1 * @param n2 * @return */double subtract(double n1,double n2);/** * 除法 * @param n1 * @param n2 * @return */double divide(double n1,double n2);/** * 乘法 * @param n1 * @param n2 * @return */double multiply(double n1,double n2);}
計算機實作類別:Calculator.java
package com.ajun.tuscany.server;import org.osoa.sca.annotations.Reference;public class Calculator implements ICalculator{/** * 引用其他組件IAdd,ISubtract,IMultiply,IDivide * @Reference 說明引用其他組件 會和.composite檔案進行配置 */private IAdd add;//加法組件private ISubtract subtract;//減法組件private IMultiply multiply;//乘法組件private IDivide divide;//除法組件public IAdd getAdd() {return add;}@Referencepublic void setAdd(IAdd add) {this.add = add;}public ISubtract getSubtract() {return subtract;}@Referencepublic void setSubtract(ISubtract subtract) {this.subtract = subtract;}public IMultiply getMultiply() {return multiply;}@Referencepublic void setMultiply(IMultiply multiply) {this.multiply = multiply;}public IDivide getDivide() {return divide;}@Referencepublic void setDivide(IDivide divide) {this.divide = divide;}@Overridepublic double add(double n1, double n2) {System.out.println("Server add");return this.add.add(n1, n2);}@Overridepublic double subtract(double n1, double n2) {System.out.println("Server subtract");return this.subtract.subtract(n1, n2);}@Overridepublic double divide(double n1, double n2) {System.out.println("Server divide");return this.divide.divide(n1, n2);}@Overridepublic double multiply(double n1, double n2) {System.out.println("Server multiply");return this.multiply.multiply(n1, n2);}}
用戶端調用代碼:CalculatorServerClient.java
package com.ajun.tuscany.client;import org.apache.tuscany.sca.host.embedded.SCADomain;import com.ajun.tuscany.server.Calculator;import com.ajun.tuscany.server.ICalculator;/** * 服務端 * @author ajun * @e-mail zhaojun2066@gmail.com * @blog http://blog.csdn.net/ajun_studio * @version 建立時間:2012-7-19 下午11:12:44 */public class CalculatorServerClient {public static void main(String [] args){SCADomain domain = SCADomain.newInstance("com/ajun/tuscany/server/Calculator.composite");ICalculator c = domain.getService(Calculator.class, "CalculatorServiceComponent");System.out.println("3 + 2 = "+c.add(3, 2));System.out.println("3 - 2 = "+c.subtract(3, 2));System.out.println("3 * 2 = "+c.multiply(3, 2));System.out.println("3 / 2 = "+c.divide(3, 2));}}
測試:
運行CalculatorRMIServer.java
最後運行CalculatorServerClient.java
輸出:
2012-7-25 21:39:49 org.apache.tuscany.sca.node.impl.NodeImpl <init>資訊: Creating node: com/ajun/tuscany/server/Calculator.composite2012-7-25 21:39:51 org.apache.tuscany.sca.node.impl.NodeImpl configureNode資訊: Loading contribution: file:/E:/springdm/Calculator_rmi_ref/bin/2012-7-25 21:39:52 org.apache.tuscany.sca.node.impl.NodeImpl start資訊: Starting node: com/ajun/tuscany/server/Calculator.compositeServer add3 + 2 = 5.0Server subtract3 - 2 = 1.0Server multiply3 * 2 = 1.5Server divide3 / 2 = 6.0