发表于: 2018-03-17 10:57:46
1 702
任 务 九 总 结
今天完成的事情:(一定要写非常细致的内容,比如说学会了盒子模型,了解了Margin)
tuscany这玩意和原生的rmi有点像,一下子就弄完了
先说一下硬件设施:
JDK 1.8 ,tuscany全是2.01的.
首先是需要的jar包:
<!--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>
这3个jar包就足够了,加大包的话有一堆冲突,参考过往师兄的例子,我这里就加了需要的3个jar包即可.
然后是一个简单的demo:
package com.service;
import org.oasisopen.sca.annotation.Remotable;
@Remotable
public interface Demo{
String doIt();
}
我这里打的这个@Remotable注解要注意一下.如果没有这个会有个大坑存在.
接下来是实现类:
package com.service;
public class DemoImpl implements Demo {
@Override
public String doIt() {
return "233333";
}
}
仅仅为了测试功能是否完善,我直接返回一个字符串.
然后是对应的配置文件:
注意SCA分布式的配置文件的后缀是composite.
<?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="Demo">
<component name="DemoImpl">
<implementation.java class="com.service.DemoImpl"/>
</component>
</composite>
和Spring的Xml配置文件类似,都是相应的shcme约束头,再加上一些标签并且配上子元素.
然后写一个主方法,运行一下.
package com.run;
import com.service.Demo;
import org.apache.tuscany.sca.node.Node;
import org.apache.tuscany.sca.node.NodeFactory;
public class test {
public static void main(String[] args) {
Node node = NodeFactory.newInstance().createNode("sca.composite");
node.start();
System.out.println("server is ready");
Sca s = node.getService(Demo.class, "DemoImpl");
System.out.println(s.doIt());
}
}
可以看到服务已经运行,并且拿到了字符串.
然后是进行分离,在另外单独的客户端上去调用Server.
其他的东西都一样,就是在配置文件上多了一个东西.
<?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="Sca1">
<component name="Sca1">
<implementation.java class="com.service.DemoImpl"/>
<service name="Demo">
<!--这里有2个要求
1.如果接口没有加上@Remotable标签,service name就只能为实现类名.
2.接口加了@Remotable标签,service name 就只能为接口名.
3.所以这里只能为 接口名 or 类名.
-->
<interface.java interface="com.service.Demo"/>
<tuscany:binding.rmi uri="rmi://127.0.0.1:8888/Sca1"/>
</service>
</component>
</composite>
需要特别注意的是绿字部分,和我之前在接口上打的@Remotable标签联合使用.
这是个特别大的坑,service name绝对不能随便乱取.
然后当配置了RMI服务端之后,我们的主方法就仅仅作为一个服务启动来使用.
package com.run;
import org.apache.tuscany.sca.node.Node;
import org.apache.tuscany.sca.node.NodeFactory;
public class test1 {
public static void main(String[] args) {
Node node = NodeFactory.newInstance().createNode("sca1.composite");
node.start();
System.out.println("server is ready");
}
}
可以看到和我们任务8的时候使用java RMI的时候基本一致的效果,Server运行之后处于一个一致运行等待状态,等待client的调用.
然后我们在客户端进行调用.
客户端也要遵循RMI那一套,就是接口的全限定名要完全相同.
package com.run;
import com.service.Demo;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
public class test {
public static void main(String[] args) throws RemoteException, NotBoundException, MalformedURLException {
Demo demo = (Demo) Naming.lookup("rmi://127.0.0.1:8888/Sca1");
System.out.println(demo.doIt());
}
}
可以看到我们在client的调用方式和使用java 原生RMI的方式一致,也是通过Naming类的lookup来使用rmi一个约束url进行服务的定位.
可以看到在客户端是调用成功了的.
明天计划的事情:准备复盘
遇到的问题:学习tuscany的资料有点少
收获:进一步学习了RMI
评论