发表于: 2018-02-08 21:48:56

1 669


今天完成的事情:(一定要写非常细致的内容,比如说学会了盒子模型,了解了Margin) 

将tuscany的小例子跑通.

说一下我当前平台.

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包就足以我们开发使用.我之前导了一整套的tuscany框架,但是由于小demo很多组件不会用到,在编译的时候就会报错.

所以还是参考过往师兄的例子,只用我们需要的3个jar包即可.


然后是一个简单的服务接口:

package com.service;

import org.oasisopen.sca.annotation.Remotable;

/**
* @author Arike
* Create_at 2018/2/8 14:05
*/
@Remotable
public interface Sca{
String idiom();
}

我这里打的这个@Remotable注解要注意一下.如果没有这个会有个大坑存在.

接下来是实现类:

package com.service;

/**
* @author Arike
* Create_at 2018/2/8 14:05
*/
public class ScaImpl  implements Sca {

@Override
   public String idiom() {
return "儿歌三百首";
   }
}

仅仅为了测试功能是否完善,我直接返回一个字符串.

然后是对应的配置文件:

注意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="Sca">

   <component name="ScaImpl">
       <implementation.java class="com.service.ScaImpl"/>
   </component>
</composite>

和Spring的Xml配置文件类似,都是相应的shcme约束头,再加上一些标签并且配上子元素.

然后写一个主方法,运行一下.

package com.run;

import com.service.Sca;
import org.apache.tuscany.sca.node.Node;
import org.apache.tuscany.sca.node.NodeFactory;

/**
* @author Arike
* Create_at 2018/2/8 14:16
*/
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(Sca.class, "ScaImpl");
       System.out.println(s.idiom());
   }
}


可以看到服务已经运行,并且拿到了儿歌三百首.


然后是进行分离,在另外单独的客户端上去调用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.ScaImpl"/>

       <service name="Sca">
           <!--这里有2个要求
           1.如果接口没有加上@Remotable标签,service name就只能为实现类名.
           2.接口加了@Remotable标签,service name 就只能为接口名.
           3.所以这里只能为 接口名 or 类名.
           -->
           <interface.java interface="com.service.Sca"/>
           <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;

/**
* @author Arike
* Create_at 2018/2/8 14:16
*/
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.Sca;

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;

/**
* @author Arike
* Create_at 2018/2/8 16:18
*/
public class test {
public static void main(String[] args) throws RemoteException, NotBoundException, MalformedURLException {
Sca sca = (Sca) Naming.lookup("rmi://127.0.0.1:8888/Sca1");
       System.out.println(sca.idiom());
   }
}

可以看到我们在client的调用方式和使用java 原生RMI的方式一致,也是通过Naming类的lookup来使用rmi一个约束url进行服务的定位.

可以看到在客户端是调用成功了的.

明天计划的事情:(一定要写非常细致的内容) 

先把复盘申请了,然后再进行任务9的服务器这块儿.因为要赶着年前进去.
遇到的问题:(遇到什么困难,怎么解决的) 

遇到的问题就是service name这个东西,卡了很久,因为tuscany已经停止更新了,网上教程相对也较少.所以做起来有点费时间
收获:(通过今天的学习,学到了什么知识)

RMI应该是复盘里的一个重点东西,要着重掌握.


返回列表 返回列表
评论

    分享到