首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Camel - extend DSL?

Camel - extend DSL?
EN

Stack Overflow用户
提问于 2011-11-04 21:42:57
回答 3查看 2.2K关注 0票数 10

我的路由中有一个重复的模式--某个处理器每次我调用它时都需要设置相同的3个标头,所以我在路由中有以下关于10+时间的代码:

代码语言:javascript
复制
.whatever()
.setHeader("foo1", "bar1")
.setHeader("foo2", "bar2")
.setHeader("foo3", "bar3")
.processRef("processorBazThatNeedsHeaders")
.whatever()

每次填充的头都是不同的,所以把它抽象成一个子路由并不能给我带来任何好处。

我喜欢做的是在我的DSL中有另一个方法的子类RouteDefinition,它允许我这样做:

代码语言:javascript
复制
.whatever()
.bazProcessor("bar1", "bar2", "bar3")
.whatever()

在“bazProcessor”中,设置头部并调用处理器。

我试过这样做,但似乎只有一些严重的可能不是未来预防的手术才能做到这一点,而且似乎others have had similar luck

我需要将它们设置为headers,而不是直接将它们作为参数传递给处理器,因为这些值也会在处理器之后用于路由。

有没有什么隐蔽的工具来实现这样的事情?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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方式也是一种选择。

票数 6
EN

Stack Overflow用户

发布于 2011-11-22 11:07:57

所以您只设置了头文件,因为您希望处理器能够访问这些值?

如果是这样,那么使用Factory的一个简单示例可能如下所示:

代码语言:javascript
复制
whatever()
  .process(BazProcessorFactory.instance("bar1", "bar2", "bar3"))
  .whatever()

其中BazProcessorFactory只是处理器的包装器:

代码语言:javascript
复制
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]);
      }
    }
  }
}
票数 1
EN

Stack Overflow用户

发布于 2013-07-22 00:33:53

下面是一个扩展Scala DSL的示例,尽管有点不相干。

我们可以通过隐式类创建DSL特征的隐式方法。

代码语言:javascript
复制
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)
  }
}

像这样使用它。

代码语言:javascript
复制
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/

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8010084

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档