camel中如何使用一个实现类去处理web service的请求

孤好梦中X人 发布于 2015/09/24 14:37
阅读 1K+
收藏 1

@滄海一夢 你好,想跟你请教个问题:

在camel里面,发布一个web service,一般做法如下:

1:定义一个接口,2:写一个processor去处理请求的逻辑,3:xml文件里面配置

如:

public interface Bank 
{
	public String getBankId(Long id);
	public String getBankName(Long id);
	public Integer getNumbers(Long id);
}



public class BankProcessor implements Processor
{
	public void process(Exchange exchange) throws Exception 
	{
		String methodName = exchange.getIn().getHeader("operationName", String.class);
		if("getBankId".equals(methodName))
		{
			//..
		}
		else if("getBankName".equals(methodName))
		{
			//..
		}
		else if("getNumbers".equals(methodName))
		{
			//..
		}
	}
}



<cxf:cxfEndpoint id="bankEndpoint"
                   serviceClass="com.lala.bank.Bank"
                   address="http://127.0.0.1:9492/rest/v2/bank"/>



这样太麻烦了,

我能不能这样做,写一个实现类,实现Bank接口,然后,请求来了,我就交给这个实现类处理。

而不像上面那里,还要判断是请求的哪个参数,然后去执行对应的请求


谢谢

加载中
0
vidy_tu
vidy_tu

你们之前是怎么区分多参数的, 方法要显示的支持多参数的话,再加个CamelBeanMultiParameterArray,但是这样也不一定适合你.


public class BeanTest {
	public static void main(String[] args) throws Exception {
		DefaultCamelContext context = new DefaultCamelContext();
		RouteBuilder rb = new RouteBuilder() {

			@Override
			public void configure() throws Exception {
				from("direct://a").to("bean:local.camel.BeanTest");

			}
		};
		rb.addRoutesToCamelContext(context);
		context.start();
		ProducerTemplate template = context.createProducerTemplate(1);
		DefaultExchange exc = new DefaultExchange(context);
		exc.getIn().setHeader("CamelBeanMethodName", "say");
		exc.getIn().setHeader("CamelBeanMultiParameterArray", "true");
		exc.getIn().setBody(new String[]{"vidy","1001"});
		template.send("direct://a", exc);
		context.shutdown();
	}
	public void say(String user,String id){
		System.out.println(user+":"+id);
	}
}




0
vidy_tu
vidy_tu

BankProcessor 不去实现Processor ,直接在消息头部指定 CamelBeanMethodName ,不知道这样是否满足你的要求

package local.camel;

import org.apache.camel.ProducerTemplate;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.impl.DefaultCamelContext;

public class BeanTest {
	public static void main(String[] args) throws Exception {
		DefaultCamelContext context = new DefaultCamelContext();
		RouteBuilder rb = new RouteBuilder() {

			@Override
			public void configure() throws Exception {
				from("direct://a").to("bean:local.camel.BeanTest");

			}
		};
		rb.addRoutesToCamelContext(context);
		context.start();
		ProducerTemplate template = context.createProducerTemplate(1);
		template.sendBodyAndHeader("direct://a", "abc", "CamelBeanMethodName", "say");
		context.shutdown();
	}
	public void say(String str){
		System.out.println(str);
	}
}



0
孤好梦中X人
孤好梦中X人

引用来自“滄海一夢”的评论

BankProcessor 不去实现Processor ,直接在消息头部指定 CamelBeanMethodName ,不知道这样是否满足你的要求

package local.camel;

import org.apache.camel.ProducerTemplate;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.impl.DefaultCamelContext;

public class BeanTest {
	public static void main(String[] args) throws Exception {
		DefaultCamelContext context = new DefaultCamelContext();
		RouteBuilder rb = new RouteBuilder() {

			@Override
			public void configure() throws Exception {
				from("direct://a").to("bean:local.camel.BeanTest");

			}
		};
		rb.addRoutesToCamelContext(context);
		context.start();
		ProducerTemplate template = context.createProducerTemplate(1);
		template.sendBodyAndHeader("direct://a", "abc", "CamelBeanMethodName", "say");
		context.shutdown();
	}
	public void say(String str){
		System.out.println(str);
	}
}



大哥,不行。

如果方法只有一个参数,就可以了。

如果方法有多个参数,就不行了,从第二个参数开始,参数都是null

请教,如何处理

0
孤好梦中X人
孤好梦中X人

引用来自“滄海一夢”的评论

你们之前是怎么区分多参数的, 方法要显示的支持多参数的话,再加个CamelBeanMultiParameterArray,但是这样也不一定适合你.


public class BeanTest {
	public static void main(String[] args) throws Exception {
		DefaultCamelContext context = new DefaultCamelContext();
		RouteBuilder rb = new RouteBuilder() {

			@Override
			public void configure() throws Exception {
				from("direct://a").to("bean:local.camel.BeanTest");

			}
		};
		rb.addRoutesToCamelContext(context);
		context.start();
		ProducerTemplate template = context.createProducerTemplate(1);
		DefaultExchange exc = new DefaultExchange(context);
		exc.getIn().setHeader("CamelBeanMethodName", "say");
		exc.getIn().setHeader("CamelBeanMultiParameterArray", "true");
		exc.getIn().setBody(new String[]{"vidy","1001"});
		template.send("direct://a", exc);
		context.shutdown();
	}
	public void say(String user,String id){
		System.out.println(user+":"+id);
	}
}




可以,可以。楼主果然精通camel , 在下佩服

竟然还有这么多隐藏的参数,请问楼主,这些都是在哪里找到的。

能否给个文档地址

vidy_tu
vidy_tu
其他的可以不看,camel-core的源码还是有必要研究下的
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部