我的路由中有一个重复的模式--某个处理器每次我调用它时都需要设置相同的3个标头,所以我在路由中有以下关于10+时间的代码:
.whatever()
.setHeader("foo1", "bar1")
.setHeader("foo2", "bar2")
.setHeader("foo3", "bar3")
.processRef("processorBazThatNeedsHeaders")
.whatever()每次填充的头都是不同的,所以把它抽象成一个子路由并不能给我带来任何好处。
我喜欢做的是在我的DSL中有另一个方法的子类RouteDefinition,它允许我这样做:
.whatever()
.bazProcessor("bar1", "bar2", "bar3")
.whatever()在“bazProcessor”中,设置头部并调用处理器。
我试过这样做,但似乎只有一些严重的可能不是未来预防的手术才能做到这一点,而且似乎others have had similar luck。
我需要将它们设置为headers,而不是直接将它们作为参数传递给处理器,因为这些值也会在处理器之后用于路由。
有没有什么隐蔽的工具来实现这样的事情?
发布于 2011-11-04 23:31:01
通过将RouteDefinition子类化,您的扩展将只在from(...)之后直接可见。如果您想要使用DSL扩展,这可能是一个限制,例如在filter(...) DSL之后。
一种更简单的方法是将逻辑封装在某个地方,并在实现org.apache.camel.Processor接口的类中使用它,然后在路由中调用.process(...)重载或bean(...)来使用该逻辑。如果您为Processor实例或返回该Processor实例的方法使用了一个有意义的名称,那么实际上您将非常接近DSL扩展。这是一个example of the suggested approach。最后,您的代码可能如下所示:
.process(setTheHeadersForBaz)
.whatever() .whatever()
仅供参考:如果你真的需要做数字用户线,有一个扩展Camel DSL based on Groovy的项目。我猜基于Camel Scala DSL的Scala方式也是一种选择。
发布于 2011-11-22 11:07:57
所以您只设置了头文件,因为您希望处理器能够访问这些值?
如果是这样,那么使用Factory的一个简单示例可能如下所示:
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]);
}
}
}
}发布于 2013-07-22 00:33:53
下面是一个扩展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/
https://stackoverflow.com/questions/8010084
复制相似问题