2011-11-04 79 views
6

我有我的路线重复图案 - 某个处理器需要同样的3头设置每次我把它的时间,所以我有我的路下面的代码约10+次数:骆驼 - 扩展Java DSL?

.whatever() 
.setHeader("foo1", "bar1") 
.setHeader("foo2", "bar2") 
.setHeader("foo3", "bar3") 
.processRef("processorBazThatNeedsHeaders") 
.whatever() 

标题是每次填充不同,所以这个抽象出成subroute并没有真正买我什​​么。

我喜欢什么,能够做的是子类RouteDefinition有在我的DSL的另一种方法,让我做到这一点:

.whatever() 
.bazProcessor("bar1", "bar2", "bar3") 
.whatever() 

,并在“bazProcessor”,设置的标头,并调用处理器。

我试过这样做,但它似乎只可能与一些严重的可能未来不了的手术,并且似乎others have had similar luck

我需要他们被设置为与直接将它们作为参数提供给处理器,因为这些值的处理器进行路由后也用标头。

有一些隐藏的设备来实现这样的事情?

回答

6

通过继承RouteDefinition你的扩展才可以看到直接from(...)后。这可能是一个限制,如果你想在DSL的后面使用DSL扩展。

一个更简单的方法是将某处封装逻辑,和在实现org.apache.camel.Processor接口的类使用它,然后调用的.process(...)过载,或bean(...)在路由使用的逻辑。如果Processor实例或方法使用有意义的名称,则返回Processor实例,否则实际上您将对DSL扩展非常封闭。这是一个example of the suggested approach。最后,你的代码可能是这样的:

.whatever()
.process(setTheHeadersForBaz
.whatever()

仅供参考:如果你真的需要做一个DSL,有一个扩展Camel DSL based on Groovy的项目。我猜想基于Camel Scala DSL的Scala方法也是一种选择。

+0

这是一个好主意。我需要的是*略有不同,但我认为这是一个好的开始。我会给它一个回应。 –

+0

你能详细解答你的答案吗?我不明白它:( – Edmondo1984

1

所以,你是因为你想要的处理器能够访问这些值只设置标题?

如果是这样那么使用工厂一个简单的例子看起来是这样的:

whatever() 
    .process(BazProcessorFactory.instance("bar1", "bar2", "bar3")) 
    .whatever() 

凡BazProcessorFactory只是在你的处理器的包装:

public class BazProcessorFactory { 
    public Processor instance(final String...vals) { 
    return new Processor() { 
     @Override 
     public void process(Exchange exchange) throws Exception { 
     //access your array of values here 
     System.out.println("Foo1 = "+vals[0]); 
     } 
    } 
    } 
} 
+0

感谢达莫 - 我确实需要将它们设置为标题 - 它们被处理器使用,但它们也在处理器之后用于处理某些路由。我将其添加为对原始问题的说明 –

1

虽然稍不相关的,下面是一个扩展Scala DSL的例子。

我们可以通过隐类中创建一个隐含的方法来DSL特质。

object DSLImplicits { 
    implicit class RichDSL(val dsl: DSL) { 
    def get = dsl.setHeader(Exchange.HTTP_METHOD, _ => HttpMethods.GET.name) 

    def post = dsl.setHeader(Exchange.HTTP_METHOD, _ => HttpMethods.POST.name) 
    } 
} 

并且像这样使用它。

import DSLImplicits.RichDSL 
//---------------------------- 
from("someWhere") 
    //Do some processing 
    .get.to("http://somewhere.com") 

更多细节@ http://siliconsenthil.in/blog/2013/07/11/apache-camel-with-scala-extending-dsl/

+0

@kleopatra:谢谢..完成。:) – siliconsenthil