先看一下tuscany简介,简单了解一下tuscany是什么

SCA 的基本概念以及 SCA 规范的具体内容并不在本文的范畴之内,有兴趣的读者可以通过一些相关文档了解相关内容,这也是阅读本文的基础。下面本文首先对 Tuscany 框架做一定的介绍。

Tuscany 是 Apache 的开源项目,它是 IBM、Oracle、SAP 等厂商联合成立的 SOA 标准化组织 -OSOA 支持下开发出的 SCA 框架,它既是开源界 SCA 的试金石,也是当前开源界最成熟的 SCA 框架之一。

tuscany是一套开源的sca框架模型,是做soa的基础架构

SCA是什么?

SCA为构建基于SOA的应用和解决方案提供了编程模型。它基于这样的理念:将业务功能作为一系列的服务而提供,并由这一系列的服务组装起来的解决方案来满足特定业务需求。这些组合的应用既包括为应用而新创建的特定服务,也包括源自已已存在系统和应用的业务逻辑,这些业务逻辑作为组合构件的一部分被复用。SCA既为服务的组合也为服务构件的创建提供了模型,包括对SCA组组合构件中对已存在应用功能的复用。

SCA的基础工件就是component,它是SCA的构成单元。构件(component)由一个实现的可配置(implementation)实例所组成。在该构件中,实现是提供业务功能的程序代码片段。该业务功能作为服务(service)而提供,为其他构件所使用。实现也许依赖于由其他构件所提供的服务,这些依赖被称作”引用”(reference)。实现可以有一个可设置的属性(properties),该属性是可以影响业务功能操作的数据值。构件通过提供属性值和连线(wire)到由其他构件提供服务的引用来配置实现。

还是通过实例来看一下SCA到底实现了什么样的功能吧!

看一下发布一个基本的加减乘除的示例,这个是tuscany的官方示例

定义一个接口实现基本的计算器功能

定义接口CalculatorService,实现基本的加减乘除

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);}

实现类分别调用对应的接口AddService,DivideService,MultiplyService,SubtractService

在CalculatorServiceImpl中分别调用对应的接口

public class CalculatorServiceImpl implements CalculatorService {private AddService addService;private SubtractService subtractService;private MultiplyService multiplyService;private DivideService divideService;@Referencepublic void setAddService(AddService addService) {this.addService = addService;}@Referencepublic void setSubtractService(SubtractService subtractService) {this.subtractService = subtractService;}@Referencepublic void setDivideService(DivideService divideService) {this.divideService = divideService;}@Referencepublic 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);}}

通过@Reference进行注入,看一下每个接口的功能定义

AddService

public interface AddService {double add(double n1, double n2);}

AddServiceImpl

public class AddServiceImpl implements AddService {public double add(double n1, double n2) {Logger logger = Logger.getLogger("calculator");logger.log(Level.FINEST, "Adding " + n1 + " and " + n2);return n1 + n2;}}

DivideService

public interface DivideService {double divide(double n1, double n2);}

DivideServiceImpl

public class DivideServiceImpl implements DivideService {public double divide(double n1, double n2) {Logger logger = Logger.getLogger("calculator");logger.log(Level.FINEST, "Dividing " + n1 + " with " + n2);return n1 / n2;}}

MultiplyService

public interface MultiplyService {double multiply(double n1, double n2);}

MultiplyServiceImpl

public class MultiplyServiceImpl implements MultiplyService {public double multiply(double n1, double n2) {Logger logger = Logger.getLogger("calculator");logger.log(Level.FINEST, "Multiplying " + n1 + " with " + n2);return n1 * n2;}}

SubtractService

public interface SubtractService {double subtract(double n1, double n2);}

SubtractServiceImpl

public class SubtractServiceImpl implements SubtractService {public double subtract(double n1, double n2) {Logger logger = Logger.getLogger("calculator");logger.log(Level.FINEST, "Subtracting " + n1 + " from " + n2);return n1 - n2;}}

看客户端调用的代码

SCANodeFactory factory = SCANodeFactory.newInstance();SCANode node = factory.createSCANodeFromClassLoader("Calculator.composite", CalculatorClient.class.getClassLoader());node.start();CalculatorService calculatorService = ((SCAClient)node).getService(CalculatorService.class, "CalculatorServiceComponent");// CalculateSystem.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));node.stop();

程序中读取Calculator.composite配置文件,这个是核心配置文件实现的功能是对外发布服务

再看一下配置文件中的定义

<composite xmlns="http://www.osoa.org/xmlns/sca/1.0"targetNamespace="http://sample"xmlns:sample="http://sample"name="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"/></component></composite>

发布的服务名为CalculatorServiceComponent

通过客户端的调用程序可以找到对应的服务名

CalculatorService calculatorService = ((SCAClient)node).getService(CalculatorService.class, "CalculatorServiceComponent");

然后调用相应的方法

程序执行结果如下:

2011-10-31 15:44:14 org.apache.tuscany.sca.node.impl.NodeImpl <init>
信息: Creating node: Calculator.composite
2011-10-31 15:44:16 org.apache.tuscany.sca.node.impl.NodeImpl configureNode
信息: Loading contribution: file:/D:/Java/workspace/sca/calculator/target/classes/
2011-10-31 15:44:18 org.apache.tuscany.sca.node.impl.NodeImpl start
信息: Starting node: Calculator.composite
3 + 2=5.0
2011-10-31 15:44:18 org.apache.tuscany.sca.node.impl.NodeImpl stop
信息: Stopping node: Calculator.composite
3 - 2=1.0
3 * 2=6.0
3 / 2=1.5

也可以使用CORBA方式调用远端的实现,对应的服务端的配置,寻找本地的5080端口发布的服务

<component name="CalculatorServiceComponent"><implementation.java class="calculator.CalculatorServiceImpl"/><reference name="addService"><tuscany:binding.corba uri="corbaname::localhost:5080#CalculatorCORBAService"/></reference><reference name="subtractService"><tuscany:binding.corba uri="corbaname::localhost:5080#CalculatorCORBAService"/></reference><reference name="multiplyService"><tuscany:binding.corba uri="corbaname::localhost:5080#CalculatorCORBAService"/></reference><reference name="divideService"><tuscany:binding.corba uri="corbaname::localhost:5080#CalculatorCORBAService"/></reference></component>

测试用例中的代码实现如下:

public class CalculatorCORBAReferenceTestCase extends TestCase {private SCADomain scaDomain;private CalculatorService calculatorService;private TransientNameServer server;private void bindObject(String name, org.omg.CORBA.Object object) throws Exception {ORB orb = server.getORB();org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService");NamingContext ncRef = NamingContextHelper.narrow(objRef);NameComponent nc = new NameComponent(name, "");NameComponent path[] = {nc};ncRef.rebind(path, object);}@BeforeClassprotected void setUp() throws Exception {// create name serviceserver = new TransientNameServer("localhost", 5080, TransientNameService.DEFAULT_SERVICE_NAME);Thread t = server.start();if (t == null) {Assert.fail("The naming server cannot be started");} else {// create CORBA object which will be accessible by SCA CORBA bindingbindObject("CalculatorCORBAService", new CalculatorCORBAServant());scaDomain = SCADomain.newInstance("CalculatorCORBAReference.composite");calculatorService = scaDomain.getService(CalculatorService.class, "CalculatorServiceComponent");}}@AfterClassprotected void tearDown() throws Exception {scaDomain.close();server.stop();}@Testpublic void testCalculator() throws Exception {assertEquals(5.0, calculatorService.add(3, 2));assertEquals(1.0, calculatorService.subtract(3, 2));assertEquals(6.0, calculatorService.multiply(3, 2));assertEquals(1.5, calculatorService.divide(3, 2));}
}

服务是SOA的核心,它们代表了那些可以被结合在一起成为应用程序或业务流程的可工作,可重用的代码单元。

OSGI明确地把Java作为目标平台,提供用于创建组件的模块化框架,以及用来运行这些组件的运行时容器。OSGI本身并不提供可直接用于SOA服务所需的功能特性。

利用SCA,你可以用不同的编程语言构建功能单元或组件,然后将他们通过SOAP、JMS、RMI、REST或其它协议暴露为服务。

不仅如此,这些组件可以在内部被连在一起形成到时候高级别的服务或组合。服务可以以分布式的方式运行,并作为虚拟云来管理。

apache tuscany(一)相关推荐

  1. Apache Tuscany 宣布停止维护

    Apache Tuscany 宣布停止维护,因为 Attic 已经不再活动.Apache Tuscany提供一个面向服务的核心架构以支持简单快速地开发和运行面向服务的应用程序.其轻巧的运行环境为嵌入或 ...

  2. 【Web Service】Apache Tuscany发布SOAP

    Apache Tuscany 地址:http://tuscany.apache.org 准备工作: >下载SCA-Java-2.0包 地址:http://tuscany.apache.org/s ...

  3. Apache Tuscany SCA 用户指南

    介绍 这篇用户指南帮助你熟悉SCA概念,并且带你浏览示范怎样创建SCA 应用的一个例子.它也说明了Tuscany支持的多种不同环境(例如命令行客户端或Web应用)以及如何打包程序以运行在这行环境中. ...

  4. Apache Tuscany中文论坛开通: http://groups.google.com/group/tuscany-sca-chinese

    Apache Tuscany ( http://tuscany.apache.org) 提供全方位的开源SOA基础架构以利于开发, 组装, 发布, 管理构件式应用服务(Composite Applic ...

  5. Tuscany SCA 发布Web Service

    有段时间没有学习SOA了,最近偶然碰到一个例子,运行修改理解后发布到此. 在前面的博客中有提到用axis2发布web service,借用了插件,并且步骤较繁多,现在来看下tuscany简单地通过配置 ...

  6. SOA(在Tuscany 中开发web service)

    一.相关概念 1.SOA(service oriented architecture)面向服务的架构. 2.SCA(service component architecture,服务构建架构)提供了一 ...

  7. 什么是Tuscany?

    大家好,我是IT修真院北京分院第31期的学员,一枚正直纯洁善良的JAVA程序员.今天给大家分享一下,修真院官网JAVA任务9的深度思考--什么是Tuscany? 什么是TUSCANY? 开源 Apac ...

  8. 基于SCA(tuscany)的SOA实践之一(发布服务是如此的简单)

    本文讲述基于SCA(tuscany)的SOA实践,第一篇将服务发布,tuscany支持N多协议,这里主要是针对webservice 先说一下开发环境jdk6+eclipse3.4+wst+stp+tu ...

  9. TUSCANY SCA JAVA (二) 入门

    准备工作: 开发工具:Eclipse,这里用的是eclipse-jee-juno-win32,你可以更新eclipse soa相关插件 有利于以后的开发和可视化的操作 tuscany  jar包,网址 ...

  10. Tuscany SCA V1.0中的扩展机制和启动过程中的扩展点[11月29日更新]

    2007年9月24日Tuscany SCA 发布了V1.0版本的实现 .本文讲述的内容使用的就是基于这个版本的,代码下载地址 http://incubator.apache.org/tuscany/s ...

最新文章

  1. python3 ocr_OCR识别-python3.5版
  2. pku 2031 Building a Space Station 最小生成树+精度控制
  3. ruby的module与Java的interface以及C++的friend
  4. 《疯狂动物城》电脑壁纸
  5. 6年,终拿腾讯 offer!
  6. 第一次在Linux系统上操作mysql数据库,看完这篇轻松应对
  7. “玩转标签,发现层次的力量!”:跨模态哈希方法研究
  8. 使用JXL.jar实现JAVA对EXCEL的读写操作
  9. Spring Boot中的@SpringBootConfiguration注释
  10. jsp页面c标签循环map , c:foreach 循环map
  11. 二级VB培训笔记04:程序控制结构、数组和过程
  12. Internet 打印提示“打印机安装失败、打印机名称无效”的解决
  13. 哨兵2号L1C数据下载及预处理
  14. matlab的otdr仿真,otdr测试曲线生成软件-OTDR测试曲线图仿真软件TrcView 4.0 官方免费版 - 河东下载站...
  15. 人工智能杂记 人工智能简史
  16. 微处理器系统结构与嵌入式系统设计(一)
  17. go与python的前景_为什么说GO语言是未来前景看好的编程语言
  18. STM32F030R8移植freeModbus协议栈
  19. 中心极限与大数定理律的关系_麦克斯韦速度分布律与气体分子碰壁数的推导
  20. Java数据结构与算法---斐波那契数列Fibonacci

热门文章

  1. python中node函数的意思_Node.js 函数
  2. getdistance mysql_mysql 自定义函数获取两点间距离
  3. Python让繁琐工作自动化——chapter14 处理CSV和JSON数据
  4. matlab pca重构,如何反转PCA并从几个主要组成部分重建原始变量?
  5. linux系统上不去网,linux 上不去网
  6. java线程条件变量_Java线程:条件变量 lock
  7. 如何更改mssq,SSAS l代理运行身份验证
  8. 将数据加载到datagridview_JVM系列(一)-- Java类的加载机制
  9. 构建postfix邮件服务器(五)extmail和extman的安装,实现web使用和管理邮件系统...
  10. thinkphp5每周学习总结 1026