Apache Camelを使用してWebサービスリクエストを処理する3つの方法

5362 ワード

1:
まず、Webサービスを公開するためのインタフェースを書きます.
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サービスの公開
ブループリントで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サービス要求を処理するには、以下の3つの方法がある.
(1)
プロセス実装orgを書く.apache.camel.プロセスインタフェースは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を使用して実行する方法を動的に区別します
上のCamelBeanMultiparamerArrayに注意してください.インタフェースのすべてのメソッドのパラメータ数が1つでない限り、これを追加する必要があります.