您的位置:首页 > 运维架构 > Apache

使用Apache Camel处理web service请求的三种方法

2015-09-30 09:53 561 查看
一:

首先写一个接口,用来发布web service

package com.pp.ws;

import javax.jws.WebMethod;
import javax.jws.WebService;

/**
 * 计算器接口
 */
@WebService
public interface Calculator 
{
	@WebMethod
	public String getVersion(String request);
	
	@WebMethod
	public Long add(Integer a, Integer b);
	
	@WebMethod
	public Long subtract(Integer a, Integer b);
	
	@WebMethod
	public Long multiply(Integer a, Integer b);
}


二:发布web service

在 blueprint.xml 加入如下配置

<cxf:cxfEndpoint id="calcWSEndpoint" 
	             serviceClass="com.pp.ws.Calculator" 
	             address="http://127.0.0.1:9911/ws/calc" />


然后,访问http://127.0.0.1:9911/ws/calc?wsdl 验证是否发布成功

三:处理web service请求,有以下三种方法

(1)

写一个processor 实现org.apache.camel.Processor 接口去处理ws请求

package com.pp.ws;

import org.apache.camel.Exchange;
import org.apache.camel.Processor;
import org.apache.cxf.message.MessageContentsList;

public class CalculatorProcessor implements Processor 
{
	/**
	 * 根据operatioNname 去执行相应的逻辑,然后设置相应的返回值(一定要和接口的返回值一致)
	 */
	public void process(Exchange exchange) throws Exception 
	{
		MessageContentsList args = exchange.getIn().getBody(MessageContentsList.class);
		String method = exchange.getIn().getHeader("operatioNname", String.class);
		if("getVersion".equals(method))
		{
			exchange.getOut().setBody("2.14.1");
			return;
		}
		
		Object arg1 = args.get(0);
		Object arg2 = args.get(1);
		Integer a = Integer.valueOf(arg1.toString());
		Integer b = Integer.valueOf(arg2.toString());
		if("add".equals(method))
		{
			exchange.getOut().setBody(Long.valueOf(a + b));
		}
		else if("subtract".equals(method))
		{
			exchange.getOut().setBody(Long.valueOf(a - b));
		}
		else if("multiply".equals(method))
		{
			exchange.getOut().setBody(Long.valueOf(a * b));
		}
	}
}


路由配置如下:

<bean id="calcProcessor" class="com.pp.ws.CalculatorProcessor" />

<route>
	<from uri="calcWSEndpoint" />
	<to uri="bean:calcProcessor" />
</route>


(2)

写一个类,有N(N为接口的方法个数)个方法,每个方法的参数均为 org.apache.camel.Exchange

package com.pp.ws;

import org.apache.camel.Exchange;
import org.apache.cxf.message.MessageContentsList;

public class CalculatorMutProcessor
{
	/**
	 * 使用Exchange作为参数的时候,方法不能有返回值,下面亦同
	 * 注意:exchange.getOut().setBody()的值类型必须和接口方法返回的类型保持一致
	 */
	public void add(Exchange exchange)
	{
		MessageContentsList args = exchange.getIn().getBody(MessageContentsList.class);
		Integer a = Integer.valueOf(args.get(0).toString());
		Integer b = Integer.valueOf(args.get(1).toString());
		exchange.getOut().setBody(Long.valueOf(a + b));
	}
	
	public void subtract(Exchange exchange)
	{
		MessageContentsList args = exchange.getIn().getBody(MessageContentsList.class);
		Integer a = Integer.valueOf(args.get(0).toString());
		Integer b = Integer.valueOf(args.get(1).toString());
		exchange.getOut().setBody(Long.valueOf(a - b));
	}
	
	public void multiply(Exchange exchange)
	{
		MessageContentsList args = exchange.getIn().getBody(MessageContentsList.class);
		Integer a = Integer.valueOf(args.get(0).toString());
		Integer b = Integer.valueOf(args.get(1).toString());
		exchange.getOut().setBody(Long.valueOf(a * b));
	}
	
	public void getVersion(Exchange exchange)
	{
		exchange.getOut().setBody("2.14.1");
	}
}


路由配置如下:

<bean id="calculatorMutProcessor" class="com.pp.ws.CalculatorMutProcessor" />
<route>
	<from uri="calcWSEndpoint" />
	<setHeader headerName="CamelBeanMethodName">
		<simple>${in.header.operatioNname}</simple>
	</setHeader>
	<to uri="bean:calculatorMutProcessor" />
</route>


这里主要使用的是CamelBeanMethodName来动态区分需要执行的方法

(3)

写一个上面接口的实现类,去处理ws的请求

package com.pp.ws;

public class CalculatorImpl implements Calculator 
{
	public String getVersion(String request)
	{
		System.out.println(request);
		return "2.14.1";
	}
	
	public Long add(Integer a, Integer b) 
	{
		System.out.println(a + ", " + b);
		return Long.valueOf(a + b);
	}

	public Long subtract(Integer a, Integer b) 
	{
		System.out.println(a + ", " + b);
		return Long.valueOf(a - b);
	}

	public Long multiply(Integer a, Integer b) 
	{
		System.out.println(a + ", " + b);
		return Long.valueOf(a * b);
	}
}


路由配置如下:

<bean id="calculatorImpl" class="com.pp.ws.CalculatorImpl" />
<route>
	<from uri="calcWSEndpoint" />
	<setHeader headerName="CamelBeanMethodName">
		<simple>${in.header.operationName}</simple>
	</setHeader>
	<setHeader headerName="CamelBeanMultiParameterArray">
		<constant>true</constant>
	</setHeader>
	<to uri="bean:calculatorImpl" />
</route>


这里也是使用的是CamelBeanMethodName来动态区分需要执行的方法

注意上面的CamelBeanMultiParameterArray,除非接口的所有方法的参数个数都是1个,否则必须加上这个
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: