使用Apache ServiceMix轻松发布Web Service

阅读更多
Apache ServiceMix集成了Camel、Camel-CXF,可以轻松地发布Web Service。

与传统的通过Servlet发布web Service的方式不同,我们可以通过Camel路由分别处理不同的web service调用。以下是一个简单的例子:

我们首先看看以下服务接口定义:
package com.ponder.ws;

public interface IService{
   public long add(long p1,long p2);
   public long sub(long p1,long p2);
}

接着看看blueprint:




  
 
  

  
    
      
    
  

  
    
            
            
            
                
                    ${in.header.operationName} == 'add'
                    
                
                
                    ${in.header.operationName} == 'sub'
                    
                
            
    
  


再看看addProcessor的写法:
package com.ponder.ws.Impl;
... ...
public class ServiceAdd implements Processor {

  @Override
  public void process(Exchange exchange) throws Exception {
    MessageContentsList mclist = exchange.getIn().getBody(MessageContentsList.class);
    long p1=(long)mclist.get(0);
    long p2=(long)mclist.get(1);

    long result=p1+p2;

    exchange.getOut().setBody(result);
  }
}


subProcessor类似。

我们从blueprint里可以看到首先是两个bean的定义,不解释;

然后我们有一段:

    
      
    
  


这里定义了一个Camel的endpoint,是Camel-CXF component的endpoint,component是camel的组件定义,你可以把它看成是endpoint Factory。这里实际上就是创建并配置了一个cxf endpoint,它负责接收客户端的请求,并将请求内容按Camel-CXF的规则填成一个Exchange,在后续的CamelContext里定义的路由就负责处理这个Exchange。


            
            
            
                
                    ${in.header.operationName} == 'add'
                    
                
                
                    ${in.header.operationName} == 'sub'
                    
                
            
    


以上这段路由就是根据Exchange里的in.header.operationName判断,如果operationName为“add”的话,就交由addProcessor处理。

再看看addProcessor(也就是ServiceAdd的实例)里的processor方法从Exchange里的in.body里得到一个Object,根据Camel-cxf的定义,这个Object是个MessageContentsList,从这里可以拿到相应的参数p1和p2的值,处理后,将结果放到out.body里,camel-cxf的endpoint就会将它作为结果返回给调用方。

你可能感兴趣的:(osgi,cxf,camel,web,service,servicemix)