Tuscany SCA案例分析(转)

2024-03-19 23:08
文章标签 分析 案例 sca tuscany

本文主要是介绍Tuscany SCA案例分析(转),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Tuscany SCA案例分析(一)(连载中...)

给了好久的承诺 , 前些日子一直在学习一些 SOA 方面相关的资料 , 包括 Web Service 基础 --WSDL SOAP UDDI , 这些是经典的 Web service 规范 , 同时学习了些相关的 XML-RPC 以及 WS-BPEL 等相关的内容,其中发现要看明白这些东西必须要先学好 XML 以及 XML Schema 的基础知识 , 然后又开始学习了 , 发现可以看明白一些东西了 , 当然还看了些 SOA 设计方面的原则的资料了 , 这些会在学习以及后续的分析整理出来 . 现在有了高层的设计指导 , 当然需要具体的编码技术支持了 , 否则再好的设计也无法实现了 , 所以开始了对 Tuscany SCA 的编码学习 . 为了让读者更有思路跟上节奏 , 以后的连载文章都将按照如下顺序介绍 :1  解析设计图  2 具体编码  3 分析以及总结

       为了让编码更容易,Java编程怎么能缺少Javadoc,否则无法查看帮助文档是很郁闷的事情,于是我先安装了maven2.0.5,这个在本人翻译的 <如何进入Java SCA软件的开发>文章中提到了,高于Maven2.0.5版本可能会出现错误,下面就配置maven2.0.5,下载maven2.0.5,直接解压(我这里是解压到d盘了)

下面配置maven的可执行文件到Path

然后进入tuscany源代码的解压文件夹,

-apache-tuscany-sca-1.0.1-incubating-src

 |-- sca

     |-- demos         SCA 演示应用程序

     |-- distribution     SCA 发布程序

     |-- itest           SCA 集成测试

     |-- modules       SCA 实现的各个模块 (core, runtimes, contribution, extensions                                 等等)

     |-- samples       SCA 样例程序

     |-- tools          SCA 工具 (Eclipse插件, wsdl2java, java2wsdl等等)

这是我环境的结构,在dos窗口中进入sca目录,然后直接使用mvn命令

mvn javadoc:javadoc

来生成Javadoc,经过一段时间,就会在modules里面的每个相应目录下的target文件夹下生成site文件夹,里面就是javaAPIdoc了,我们需要的就是这些javadoc,因为我们后面的编程会用到,用得比较多的是modules/domain-api/target/site/apidocs里的帮助信息了。

里面有SCADomainFactorySCADomain类的相关信息。

好的,万事具备,只欠东风了。我们开始我们的编码旅程吧。顺便说下,为了方便编辑.composite文件,我根据网上的<Eclipse开发Apache Tuscany上的SCA应用>文章下载了个eclipse插件,这里就不多说了。

开始了,我们先从最简单的calculator开始,先解析下设计图,如下:

在这个案例中,运行环境是每个组件都在一个node上,前台的CalculatorServiceComponent组件分别引用到了AddServiceComponentSubstractServiceComponentMultiplyServiceComponent以及DivideServiceComponent四个组件。他们之间的引用关系由SCA运行时自动注入。可以认为后面的四个具体的服务是“原子服务”(它完全由自己实现),而前台的CalculatorServiceComponent组件则是组合出来的服务,虽然它只是简单的做了个功能代理而已,但它完全可以加入自己的附加功能。

       好了,设计图的分析到此为止,我们可以开始进行编码了,来学习学习如何用SCA javaAPI来实现。打开eclipse,新建一个普通的java project,在建工程的时候可以加入Junit3的库和MyTuscany用户库(该库的设置在我的< Tuscany初探>的附录中给出了设置方法)

我设置了target文件夹为默认的输出路径,这里无所谓的。下一步建立组件的逻辑功能代码。我这里为了保持一致,建立了calculator包,在该包下分别建立加、减、乘、除的服务接口文件AddService.javaSubtractService.javaMultiplyService.javaDivideService.java。这四个Java接口都是本地的。

AddService.java内容如下:

package calculator;

 

/**

 * The Add service interface

 */

public interface AddService {

 

    double add(double n1, double n2);

 

}

SubtractService.java内容如下:

package calculator;

/**

 * The interface for the multiply service

 */

public interface SubtractService {

    double subtract(double n1, double n2);

}

MultiplyService.java内容如下:

package calculator;

/**

 * The interface for the multiply service

 */

public interface MultiplyService {

    double multiply(double n1, double n2);

}

DivideService.java内容如下:

package calculator;

/**

 * The divide service interface

 */

public interface DivideService {

    double divide(double n1, double n2);

}

后面的实现很简单的,就是利用double类型的+ - * /号来进行运算,这里就不给出具体实现了,仅给出java文件名,我的命名规则是在相应的Service后面加上Impl就成了实现的java代码文件名。再给出前台服务组件的CalculatorService.java的接口代码如下:

package calculator;

/**

 * The Calculator service interface.

 */

public interface CalculatorService {

    double add(double n1, double n2);

    double subtract(double n1, double n2);

    double multiply(double n1, double n2);

    double divide(double n1, double n2);

}

CalculatorServiceImpl.java内容如下:

package calculator;

import org.osoa.sca.annotations.Reference;

/**

 * An implementation of the Calculator service.

 */

public class CalculatorServiceImpl implements CalculatorService {

    private AddService addService;

    private SubtractService subtractService;

    private MultiplyService multiplyService;

    private DivideService divideService;

    @Reference

    public void setAddService(AddService addService) {

        this.addService = addService;

    }

    @Reference

    public void setSubtractService(SubtractService subtractService) {

        this.subtractService = subtractService;

    }

    @Reference

    public void setDivideService(DivideService divideService) {

        this.divideService = divideService;

    }

    @Reference

    public void setMultiplyService(MultiplyService multiplyService) {

        this.multiplyService = multiplyService;

    }

    public double add(double n1, double n2) {

        return addService.add(n1, n2);

    }

    public double subtract(double n1, double n2) {

        return subtractService.subtract(n1, n2);

    }

    public double multiply(double n1, double n2) {

        return multiplyService.multiply(n1, n2);

    }

    public double divide(double n1, double n2) {

        return divideService.divide(n1, n2);

    }

}

该类中有相应引用的服务接口,并且在这些接口实例setter函数注入时,都有@Reference注解。不用担心,tuscany SCA运行时会自动注入的。

    到目前为止,所有的服务组件逻辑业务功能都用Java实现了。该是时候给出.composite文件了,该文件展示了各个服务组件之间的引用关系以及构件与组件的组合关系。直接在src下建立Calculator.composite文件,这个文件名可以自己取,不一定要和我的一致。

其内容如下:

<?xml version="1.0" encoding="UTF-8"?>

<composite xmlns="http://www.osoa.org/xmlns/sca/1.0"

    xmlns:t="http://tuscany.apache.org/xmlns/sca/1.0"

    xmlns:c="http://Calculator" name="Calculator">

<!-- 这里的name就是composite的名字,其中默认名称空间与"http://www.osoa.org/xmlns/sca/1.0"相关

       用插件生成的composite文件会在composite元素头标签给出一个c名称空间,其与"http://Calculator"关联

    -->

    <component name="CalculatorServiceComponent">

       <implementation.java class="calculator.CalculatorServiceImpl"/>

       <reference name="addService" target="AddServiceComponent" />

        <reference name="subtractService" target="SubtractServiceComponent" />

        <reference name="multiplyService" target="MultiplyServiceComponent" />

        <reference name="divideService" target="DivideServiceComponent" />

    </component>

    <component name="AddServiceComponent">

       <implementation.java class="calculator.AddServiceImpl"/>

    </component>

    <component name="SubtractServiceComponent">

       <implementation.java class="calculator.SubtractServiceImpl"/>

    </component>

    <component name="MultiplyServiceComponent">

       <implementation.java class="calculator.MultiplyServiceImpl"/>

    </component>

    <component name="DivideServiceComponent">

       <implementation.java class="calculator.DivideServiceImpl"></implementation.java>

    </component>

</composite>

    名叫"Calculator"的构件中含有五个组件CalculatorServiceComponentAddServiceComponent SubtractServiceComponent、MultiplyServiceComponentDivideServiceComponent其中CalculatorServiceComponent引用到其他四个组件每个组件都是用java实现的<implementation.java具体的class类个不相同。这里要注意的是CalculatorServiceComponent的引用书写,例如<referencename="addService" target="AddServiceComponent" />referencename要是该实现类里需要注入的属性名,这里是CalculatorServiceImpl类代码体的private AddService addService;代码行的addServicetarget就是后面的component名字<component name="AddServiceComponent">

        好了现在服务的业务逻辑实现和装配都给出来了,那么如何才能让SCA运行时运行起来,装配出服务,并向外界提供服务呢?客户又如何实现调用服务呢?这里给出的代码只是给出了与服务方运行在同一个JVM里的客户程序。其代码实现如下: 

package calculator;

 import org.apache.tuscany.sca.host.embedded.SCADomain;

 /**

 * This client program shows how to create an SCA runtime, start it,

 * and locate and invoke a SCA component

 */

public class CalculatorClient {

    public static void main(String[] args) throws Exception {

        SCADomain scaDomain = SCADomain.newInstance("Calculator.composite");

        CalculatorService calculatorService =

            scaDomain.getService(CalculatorService.class,"CalculatorServiceComponent");

        // Calculate

        System.out.println("3 + 2=" + calculatorService.add(3, 2));

        System.out.println("3 - 2=" + calculatorService.subtract(3, 2));

        System.out.println("3 * 2=" + calculatorService.multiply(3, 2));

        System.out.println("3 / 2=" + calculatorService.divide(3, 2));

        scaDomain.close();

    }

}

现在要用到前面的javadoc了,这里的main函数中用了SCADomain类的newInstance,传入了composite文件的路径,这里 是相对路径。eclipse中会到src中找Calculator.composite文件。然后利用scaDomaingetService方法得到 CalculatorService接口的实例,这个其实有点象Spring 了,spring也是一开始先得到applicationContext,这里会传入applicationContext.xml配置文件路径地址,然 后通过applicationContext实例用getBean获得bean。如果说spring是类的装配和生产工厂,那么就可以说Tuscany 服务的装配和生产工厂。接着就可以使用calculatorService的加、减、乘、除功能了。最后关闭SCADomain对象就可以了。

这篇关于Tuscany SCA案例分析(转)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/827520

相关文章

Redis主从复制实现原理分析

《Redis主从复制实现原理分析》Redis主从复制通过Sync和CommandPropagate阶段实现数据同步,2.8版本后引入Psync指令,根据复制偏移量进行全量或部分同步,优化了数据传输效率... 目录Redis主DodMIK从复制实现原理实现原理Psync: 2.8版本后总结Redis主从复制实

锐捷和腾达哪个好? 两个品牌路由器对比分析

《锐捷和腾达哪个好?两个品牌路由器对比分析》在选择路由器时,Tenda和锐捷都是备受关注的品牌,各自有独特的产品特点和市场定位,选择哪个品牌的路由器更合适,实际上取决于你的具体需求和使用场景,我们从... 在选购路由器时,锐捷和腾达都是市场上备受关注的品牌,但它们的定位和特点却有所不同。锐捷更偏向企业级和专

Spring中Bean有关NullPointerException异常的原因分析

《Spring中Bean有关NullPointerException异常的原因分析》在Spring中使用@Autowired注解注入的bean不能在静态上下文中访问,否则会导致NullPointerE... 目录Spring中Bean有关NullPointerException异常的原因问题描述解决方案总结

python中的与时间相关的模块应用场景分析

《python中的与时间相关的模块应用场景分析》本文介绍了Python中与时间相关的几个重要模块:`time`、`datetime`、`calendar`、`timeit`、`pytz`和`dateu... 目录1. time 模块2. datetime 模块3. calendar 模块4. timeit

python-nmap实现python利用nmap进行扫描分析

《python-nmap实现python利用nmap进行扫描分析》Nmap是一个非常用的网络/端口扫描工具,如果想将nmap集成进你的工具里,可以使用python-nmap这个python库,它提供了... 目录前言python-nmap的基本使用PortScanner扫描PortScannerAsync异

Oracle数据库执行计划的查看与分析技巧

《Oracle数据库执行计划的查看与分析技巧》在Oracle数据库中,执行计划能够帮助我们深入了解SQL语句在数据库内部的执行细节,进而优化查询性能、提升系统效率,执行计划是Oracle数据库优化器为... 目录一、什么是执行计划二、查看执行计划的方法(一)使用 EXPLAIN PLAN 命令(二)通过 S

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

【区块链 + 人才服务】可信教育区块链治理系统 | FISCO BCOS应用案例

伴随着区块链技术的不断完善,其在教育信息化中的应用也在持续发展。利用区块链数据共识、不可篡改的特性, 将与教育相关的数据要素在区块链上进行存证确权,在确保数据可信的前提下,促进教育的公平、透明、开放,为教育教学质量提升赋能,实现教育数据的安全共享、高等教育体系的智慧治理。 可信教育区块链治理系统的顶层治理架构由教育部、高校、企业、学生等多方角色共同参与建设、维护,支撑教育资源共享、教学质量评估、