网站地图
  
  高级搜索
  首页   技术论坛   博客   产品中心   资源中心   银弹在线   商城  





tuscany SCA案例分析(二)(连载中...)    
#1楼
给作者发送短消息 给作者发送短消息 实名会员 
查看用户其他信息
总分 159 分
财富 732 goCom币
威望 2002
排名 :(
段位 新手必读
今天给大家讲的是calculator的分布式版本,在这个案例中,我们先来看看其设计图,如下:

从图中可以明显地看出有3个节点nodeA,nodeB,nodeC,而nodeA上有三个组件,nodeB和nodeC上分别有一个组件。这3个节点在同一个domain中。服务引用的关系在这里就不多说了。
那么我们下面进入开发过程了。
先建立一个普通的java project,项目名叫"MyDistributedCalculator",默认设置

  在书写主要的业务逻辑单元代码之前,先象案例一一样,加入MyTuscany用户库,好,现在集中精力书写逻辑代码,因为这里对案例一有一个承接关系,所 以建议看案例二之前先看明白案例一。我们这里将案例一项目中的calculator包下的除CalculatorClient.java文件外的java 文件都copy到myDistributedCalculator项目的calculator包下。如下图:

这 里绝大部分代码和案例一都一样,只是因为分布式的原因,所以就要修改几个接口部分的代码,因为AddServiceComponent和 SubtractServiceComponent都在另外的机子上,所以在他们相应的服务接口上要声明为@Remotable,以便让nodeA上的 CalculatorServiceComponent远程引用,这和案例一是不一样的地方。这里给出他们修改后的代码:
/*文件AddService.java*/

package calculator;

import org.osoa.sca.annotations.Remotable;

/**
 * The Add service interface
 
*/

@Remotable
public interface AddService {

    
double add(double n1, double n2);

}


/*文件SubtractService.java*/
package calculator;

import org.osoa.sca.annotations.Remotable;

/**
 * The interface for the multiply service
 
*/

@Remotable
public interface SubtractService {

    
double subtract(double n1, double n2);

}

接 下来要做的就是要写一个domain manager类和node启动类,我们先建立node包,然后建立相应的文件,其中用于启动domain manager类的文件名为DomainNode.java,用于启动node的类文件名为CalculatorNode.java
他们分别的内容为:
/*CalculatorNode.java文件内容如下*/


package node;

import java.io.IOException;

import javax.xml.namespace.QName;

import org.apache.tuscany.sca.domain.SCADomain;
import org.apache.tuscany.sca.node.SCANode;
import org.apache.tuscany.sca.node.SCANodeFactory;

import calculator.CalculatorService;

/**
 * This client program shows how to run a distributed SCA node. In this case a 
 * calculator node has been constructed specifically for running the calculator 
 * composite. Internally it creates a representation of a node and associates a 
 * distributed domain with the node. This separation is made different implementations
 * of the distributed domain can be provided. 
 
*/

public class CalculatorNode {
     
    
    
public static void main(String[] args) throws Exception {
        
        
// Check that the correct arguments have been provided
        if (null == args || args.length < 2{
             System.err.println(
"Useage: java CalculatorNode domainname nodename");   
             System.exit(
1);
        }
    
        
        
try {
            String domainName 
= args[0];
            String nodeName   
= args[1];
            
            ClassLoader cl 
= CalculatorNode.class.getClassLoader();
             
            SCANodeFactory nodeFactory 
= SCANodeFactory.newInstance();
            SCANode node 
= nodeFactory.createSCANode(nodeName, domainName);
            node.addContribution(nodeName, cl.getResource(nodeName 
+ "/"));
            
//System.out.println(cl.getResource(nodeName + "/").toString());
            node.deployComposite(new QName("http://sample""Calculator"));
            node.start();             
                                         
            
// nodeA is the head node and runs some tests while all other nodes
            
// simply listen for incoming messages
            if ( nodeName.equals("nodeA") ) {            
                
// do some application stuff
                CalculatorService calculatorService = 
                    node.getDomain().getService(CalculatorService.
class"CalculatorServiceComponentA");
                
                
// Calculate
                System.out.println("3 + 2=" + calculatorService.add(32));
                System.out.println(
"3 - 2=" + calculatorService.subtract(32));
                System.out.println(
"3 * 2=" + calculatorService.multiply(32));
                System.out.println(
"3 / 2=" + calculatorService.divide(32));
                
                
// a little hidden loop test to put some load on the nodes
                if (args.length > 2){
                    
for (int i=0; i < 1000; i++){
                        
// Calculate
                        System.out.println("3 + 2=" + calculatorService.add(32));
                        System.out.println(
"3 - 2=" + calculatorService.subtract(32));
                        System.out.println(
"3 * 2=" + calculatorService.multiply(32));
                        System.out.println(
"3 / 2=" + calculatorService.divide(32));
                    }

                }

            }
 else {
                
// start up and wait for messages
                try {
                    System.out.println(
"Node started (press enter to shutdown)");
                    System.in.read();
                }
 catch (IOException e) {
                    e.printStackTrace();
                }
  
            }

            
            
// stop the node and all the domains in it 
            node.stop(); 
        
        }
 catch(Exception ex) {
            System.err.println(
"Exception in node - " + ex.getMessage());
            ex.printStackTrace(System.err);
        }

    }

}


/*DomainNode.java 文件内容如下*/

package node;

import org.apache.tuscany.sca.domain.SCADomain;
import org.apache.tuscany.sca.domain.SCADomainFactory;


/**
 * This server program that loads a composite to provide simple registry function.
 * This server can be replaced with any registry that is appropriate but the components
 * in each node that talk to the registry should be replaced also. 
 
*/

public class DomainNode {

    
private static String DEFAULT_DOMAIN_URI = "http://localhost:8877";
    
    
public static void main(String[] args) {

        
try {
            SCADomainFactory domainFactory 
= SCADomainFactory.newInstance();
            SCADomain domain 
= domainFactory.createSCADomain(DEFAULT_DOMAIN_URI); 
            domain.start();
        
            System.out.println(
"Domain started (press enter to shutdown)");
            System.in.read();
            
            domain.stop();
        }
 catch (Exception e) {
            e.printStackTrace();
        }


        System.out.println(
"Domain stopped");
    }


}

这里将我自己的理解和对代码的分析写下来:
先从DomainNode.java开始分析,里面用到了两个类,SCADomainFactory 和SCADomain。代码比较简单,就是用SCADomainFactory 本身的newInstance()生成自己的实例,然后通过createSCADomain()函数生成SCADomain的实例,然后用domain.start();启动domain。这里要特别注意的是,虽然代码很简单,但其实它完成的工作可不少,首先createSCADomain()会去实例化一个实现了SCADomain接口的类,这里是SCADomainImpl类,通过查看分析tuscany的源代码,发现该类初始化函数调用了init()函数


而 在init()函数中完成了一些关键的工作,其中里面有一个就是初始化一些domain manager的服务组件,那么根据什么来初始化这些组件呢,就是根据domain.composite文件,该文件的位置是在tuscany-sca- all-1.0.1-incubating.jar文件内部,如图:

……

查看全文

 




发表回复
账号用户名   密码   登录
内容:url email imgsrc image code quote
范例 Example
bold italic underline linethrough   


 [更多...]