Camel中的dynamicRouter为啥会死循环执行method的方法?

孤好梦中X人 发布于 2015/09/06 17:20
阅读 841
收藏 0

<bean id="bean1" class="com.pp.bean.Bean1" />
<bean id="methodSlip" class="com.pp.bean.MethodSlip" />

<route autoStartup="true">
	<from uri="direct:dynamicRouter" />
	<dynamicRouter uriDelimiter=",">
		<method ref="methodSlip" method="slip" />
	</dynamicRouter>
</route>



package com.pp.bean;
import java.util.Map;
import org.apache.camel.Headers;
public class MethodSlip 
{
	public String slip(@Headers Map<String, Object> headers)
	{
		System.out.println("slip : " + headers);
		return "bean:bean1";
	}
}



最后,运行direct:dynamicRouter这个路由的时候,发现MethodSlip的slip方法一直在执行(一直在输出)

死循环。

请问,为什么,是我用错了吗?

求指点?



加载中
0
vidy_tu
vidy_tu

dynamicRouter 是 返回一个endpoint 调用完,再次执行,再返回一个endpoint ,再执行,直到返回为空时退出

官方例子:http://camel.apache.org/dynamic-router.html

要么你把方法slip增加一个null的退出,要么用routingSlip

vidy_tu
vidy_tu
回复 @刀下流人 : 可以研究下DynamicRouter这个类.看下实现,
vidy_tu
vidy_tu
回复 @刀下流人 : 不太明白你的意思,你换成routingSlip试试先, 这么说吧,dynamicRoute的实现和routingSlip实现是一么一样的,就是多了个循环.必须返回null才能退出路由.
孤好梦中X人
孤好梦中X人
关键是我想要根据不同的逻辑,定位到不同的节点上去 而routingSlip是根据消息来动态的路由到一个多个结点。二者的用途是不一样的
0
孤好梦中X人
孤好梦中X人

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

dynamicRouter 是 返回一个endpoint 调用完,再次执行,再返回一个endpoint ,再执行,直到返回为空时退出

官方例子:http://camel.apache.org/dynamic-router.html

要么你把方法slip增加一个null的退出,要么用routingSlip

routingSlip是一次性执行多个to,如下代码

pt.send("direct:routingSlip", new Processor()
{
	public void process(Exchange exch) throws Exception 
	{
		exch.getIn().setHeader("endlist", "bean:bean1,bean:bean2,bean:bean3");
	}
});



<route autoStartup="false">
	<from uri="direct:routingSlip" />
	<routingSlip uriDelimiter="," ignoreInvalidEndpoints="true">
		<header>endlist</header>
	</routingSlip>
</route>



而dynamicRouter是一次只执行一个,根据不同的条件,路由到不同的to
代码如下:

public class MethodSlip 
{
	public String slip(@Headers Map<String, Object> headers)
	{
		String type = headers.get("type").toString();
		if("1".equals(type))
		{
			return "bean:bean1";
		}
		else if("2".equals(type))
		{
			return "bean:bean2";
		}
		else if("3".equals(type))
		{
			return "bean:bean3";
		}
		return null;
	}
}

pt.send("direct:routingSlip", new Processor()
{
	public void process(Exchange exch) throws Exception 
	{
		/**
		 * 这里传1,就执行bean:bean1
		 * 传2,就执行bean:bean2
		 * 传3,就执行bean:bean3
		 */
		exch.getIn().setHeader("type", "1");
	}
});





0
vidy_tu
vidy_tu

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

dynamicRouter 是 返回一个endpoint 调用完,再次执行,再返回一个endpoint ,再执行,直到返回为空时退出

官方例子:http://camel.apache.org/dynamic-router.html

要么你把方法slip增加一个null的退出,要么用routingSlip

引用来自“刀下流人”的评论

routingSlip是一次性执行多个to,如下代码

pt.send("direct:routingSlip", new Processor()
{
	public void process(Exchange exch) throws Exception 
	{
		exch.getIn().setHeader("endlist", "bean:bean1,bean:bean2,bean:bean3");
	}
});



<route autoStartup="false">
	<from uri="direct:routingSlip" />
	<routingSlip uriDelimiter="," ignoreInvalidEndpoints="true">
		<header>endlist</header>
	</routingSlip>
</route>



而dynamicRouter是一次只执行一个,根据不同的条件,路由到不同的to
代码如下:

public class MethodSlip 
{
	public String slip(@Headers Map<String, Object> headers)
	{
		String type = headers.get("type").toString();
		if("1".equals(type))
		{
			return "bean:bean1";
		}
		else if("2".equals(type))
		{
			return "bean:bean2";
		}
		else if("3".equals(type))
		{
			return "bean:bean3";
		}
		return null;
	}
}

pt.send("direct:routingSlip", new Processor()
{
	public void process(Exchange exch) throws Exception 
	{
		/**
		 * 这里传1,就执行bean:bean1
		 * 传2,就执行bean:bean2
		 * 传3,就执行bean:bean3
		 */
		exch.getIn().setHeader("type", "1");
	}
});





你说的那只是routingSlip的一种用法,这样子也是可以的

routingSlip也可以通过方法返回下一个节点,不仅仅是从head中获取下一个节点

package local.camel;

import java.util.Map;

import org.apache.camel.Headers;
import org.apache.camel.ProducerTemplate;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.impl.DefaultCamelContext;
import org.apache.camel.model.language.MethodCallExpression;

public class RoteTest {

	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").routingSlip(new MethodCallExpression(RoteTest.class, "slip"));
				from("direct://b").bean(RoteTest.class, "log");
				from("direct://c").bean(RoteTest.class, "log");

			}
		};
		rb.addRoutesToCamelContext(context);
		context.start();
		ProducerTemplate template = context.createProducerTemplate(1);
		template.sendBodyAndHeader("direct://a", "Hello", "next", "b");
		context.shutdown();

	}

	public String log(String str) {
		str = Thread.currentThread().getId() + ":" + str;
		System.out.println(str);
		return str;
	}

	public String slip(@Headers Map<String, Object> head) {
		String next = (String) head.get("next");
		if ("b".equals(next)) {
			return "direct://b";
		} else
			return "direct://c";
	}
}



OSCHINA
登录后可查看更多优质内容
返回顶部
顶部