发表于: 2019-05-27 22:19:13
1 524
今天完成的事情:
Tusacny的学习
Tusacny的几个关键的知识名词
1.component构件:构件是sac装配和表达的基本单元,它可以提供服务或引用其他构件
2.组合构件:多个构件组合
3.implementation实现:构件实现所需要的方法,语言
4.properties属性:构件所需要的属性,可以外部传递
5.references引用:用来连接其他构件或组合构件
6.services服务:用于将构件或者组合构件采用一定的协议和访问方式,来为外部程序提供访问。
Tuscany的demo
服务端
mevan依赖
<dependencies>
<!--https://mvnrepository.com/artifact/org.apache.tuscany.sca/tuscany-base-runtime-->
<dependency>
<groupId>org.apache.tuscany.sca</groupId>
<artifactId>tuscany-base-runtime</artifactId>
<version>2.0.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.tuscany.sca.aggregation/tuscany-binding-rmi-runtime-aggregation -->
<dependency>
<groupId>org.apache.tuscany.sca.aggregation</groupId>
<artifactId>tuscany-binding-rmi-runtime-aggregation</artifactId>
<version>2.0.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.tuscany.sca.aggregation/tuscany-binding-ws-runtime-axis2-aggregation -->
<dependency>
<groupId>org.apache.tuscany.sca.aggregation</groupId>
<artifactId>tuscany-binding-ws-runtime-axis2-aggregation</artifactId>
<version>2.0.1</version>
</dependency>
</dependencies>
新建接口加减乘除
加法
package service;
public interface AddInterface {
public double add(double n1, double n2);
}
加法实现类
package service.impl;
import service.AddInterface;
public class AddInterfaceImpl implements AddInterface {
public double add(double n1, double n2) {
return n1+n2;
}
}
减法
package service;
public interface SubtractInterface {
public double subtract(double n1, double n2);
}
减法实现类
package service.impl;
import service.SubtractInterface;
public class SubtractInterfaceImpl implements SubtractInterface {
public double subtract(double n1, double n2) {
return n1-n2;
}
}
乘法
package service;
public interface MultiplyInterface {
public double multiply(double n1, double n2);
}
乘法实现
package service.impl;
import service.MultiplyInterface;
public class MultiplyInterfaceImpl implements MultiplyInterface {
public double multiply(double n1, double n2) {
return n1*n2;
}
}
除法
package service;
public interface DivideInterface {
public double divide(double n1, double n2);
}
除法实现
package service.impl;
import service.DivideInterface;
public class DivideInterfaceImpl implements DivideInterface {
public double divide(double n1, double n2) {
try {
return n1 / n2;
} catch (Exception e) {
return 0;
}
}
}
创建计算接口用于暴露给客户端
package service;
public interface CalculatorInterface {
public double add(double n1, double n2);
public double divide(double n1, double n2);
public double subtract(double n1, double n2);
public double multiply(double n1, double n2);
}
计算接口实现类
package service.impl;
import org.oasisopen.sca.annotation.Reference;
import service.*;
public class Calculator implements CalculatorInterface {
private AddInterface add;
private SubtractInterface subtract;
private MultiplyInterface multiply;
private DivideInterface divide;
public AddInterface getAdd() {
return add;
}
@Reference
public void setAdd(AddInterface add) {
this.add = add;
}
public SubtractInterface getSubtract() {
return subtract;
}
@Reference
public void setSubtract(SubtractInterface subtract) {
this.subtract = subtract;
}
public MultiplyInterface getMultiply() {
return multiply;
}
@Reference
public void setMultiply(MultiplyInterface multiply) {
this.multiply = multiply;
}
public DivideInterface getDivide() {
return divide;
}
@Reference
public void setDivide(DivideInterface divide) {
this.divide = divide;
}
public double add(double n1, double n2) {
return n1+n2;
}
public double divide(double n1, double n2) {
try {
return n1 / n2;
} catch (Exception e) {
return 0;
}
}
public double subtract(double n1, double n2) {
return n1-n2;
}
public double multiply(double n1, double n2) {
return n1*n2;
}
}
在set方法上需要加上@Reference 类似于spring中的set注入
Tuscany的配置文件是composite格式,本质上也是一个xml文件,我们需要在idea中对xml添加此格式
<composite xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912"
name="Calculator" targetNamespace="http://com.jnshu"
xmlns:tuscany="http://tuscany.apache.org/xmlns/sca/1.1">
<!--组合构件-->
<component name="CalculatorServiceComponent">
<!--实现-->
<implementation.java class="service.impl.Calculator"/>
<!--暴露服务-->
<service name="Calculator">
<interface.java interface="service.CalculatorInterface"/>
<tuscany:binding.rmi uri="rmi://127.0.0.1:8090/CalculatorRMI"/>
</service>
<!--引用-->
<reference name="add" target="AddComponent"/>
<reference name="subtract" target="SubtractComponent"/>
<reference name="multiply" target="MultiplyComponent"/>
<reference name="divide" target="DivideComponent"/>
</component>
<!--构件 组合构件中引用的实现-->
<component name="AddComponent">
<implementation.java class="service.impl.AddInterfaceImpl"/>
</component>
<component name="SubtractComponent">
<implementation.java class="service.impl.SubtractInterfaceImpl"/>
</component>
<component name="MultiplyComponent">
<implementation.java class="service.impl.MultiplyInterfaceImpl"/>
</component>
<component name="DivideComponent">
<implementation.java class="service.impl.DivideInterfaceImpl"/>
</component>
</composite>
标签报红不管它。这样服务端就写好了。
启动方法
import org.apache.tuscany.sca.node.Node;
import org.apache.tuscany.sca.node.NodeFactory;
public class TestMain {
public static void main(String[] args) {
Node node = NodeFactory.newInstance().createNode("Calculator.composite");
node.start();
System.out.println("service启动");
测试端,同样导依赖包
加入服务端暴露的计算接口
package service;
public interface CalculatorInterface {
public double add(double n1, double n2);
public double divide(double n1, double n2);
public double subtract(double n1, double n2);
public double multiply(double n1, double n2);
}
运行测试方法
package main;
import service.CalculatorInterface;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
public class CliMain {
public static void main(String[] args) throws RemoteException, NotBoundException, MalformedURLException {
CalculatorInterface c = (CalculatorInterface) Naming.lookup("//127.0.0.1:8090/CalculatorRMI");
System.out.println(c.add(2, 2));
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));
}
}
明天计划的事情:
尝试去集成spring
遇到的问题:
远程暴露的时候会报错没有实现的方法,需要手动打头文件。
收获:
Tuscany远程暴露服务
评论