我的路线中有一个重复的模式 - 每次调用时,某个处理器需要相同的3个Header设置,所以我的路由中有以下代码大约10次以上:
.whatever()
.setHeader("foo1", "bar1")
.setHeader("foo2", "bar2")
.setHeader("foo3", "bar3")
.processRef("processorBazThatNeedsHeaders")
.whatever()
Run Code Online (Sandbox Code Playgroud)
每次都会以不同的方式填充标题,因此将其抽象为子路径并不能真正为我买任何东西.
我喜欢能够做的是将RouteDefinition子类化为在我的DSL中使用另一种方法来允许我这样做:
.whatever()
.bazProcessor("bar1", "bar2", "bar3")
.whatever()
Run Code Online (Sandbox Code Playgroud)
在'bazProcessor'中,设置标题并调用处理器.
我试图做到这一点,但似乎只有一些严重的可能不会用于未来的手术,并且似乎其他人也有类似的运气.
我需要将它们设置为标题,而不是将它们作为参数直接传递给处理器,因为这些值也在处理器之后用于路由.
是否有一些隐藏的设施来实现这样的目标?
通过子类化RouteDefinition您的扩展只会在之后直接显示from(...).如果您想在DSL之后使用DSL扩展,这可能是一个限制filter(...).
一种更简单的方法是将逻辑封装在某处,并在实现org.apache.camel.Processor接口的类中使用它,然后调用路由器的重载.process(...)或bean(...)路由以使用逻辑.如果您为实例使用有意义的名称Processor或返回该Processor实例的方法,您实际上将非常关闭DSL扩展.以下是建议方法的示例.最后,您的代码可能如下所示:
.whatever()
.process(setTheHeadersForBaz)
.whatever()
仅供参考:如果您真的需要做DSL,那么有一个项目可以扩展基于Groovy的Camel DSL.我想基于Camel Scala DSL的Scala方式也可以选择.
| 归档时间: |
|
| 查看次数: |
1972 次 |
| 最近记录: |