骆驼(Camel) - 扩展Java DSL?

11

我在我的路由中有一个重复的模式 - 每次调用特定处理器时需要设置相同的3个头文件,因此我在我的路由中有大约10多行以下代码:

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

每次标题的填充方式都不同,因此将其抽象成子路由并不能带来什么好处。

我希望能够通过子类化RouteDefinition,在我的DSL中添加另一种方法,使我能够做到这一点:

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

在'bazProcessor'中设置头文件并调用处理器。我试图做到这一点,但似乎只有通过一些严重的、可能不具备未来可靠性的手术才能实现,而且似乎其他人也遇到了类似的问题。我需要将它们设置为头文件,而不是直接将它们作为参数传递给处理器,因为这些值在处理器之后还用于路由。是否有一些隐藏的方法可以实现这样的操作?
3个回答

7
通过子类化RouteDefinition,您的扩展将仅在from(...)之后直接可见。如果您想在filter(...) DSL之后使用DSL扩展,这可能会有限制。
一个更简单的方法是将逻辑封装到某个地方,并在实现org.apache.camel.Processor接口的类中使用它,然后调用.process(...)bean(...)的重载,在路由中使用该逻辑。如果您为Processor实例或返回该Processor实例的方法使用有意义的名称,则实际上非常接近DSL扩展。这里是建议方法的示例。最终,您的代码可能如下所示:

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

仅供参考:如果您确实需要进行DSL,有一个项目可以扩展基于Groovy的Camel DSL。我猜基于Camel Scala DSL的Scala方式也是一个选项。


这是一个好主意。我需要的略微不同,但我认为这是一个很好的开端。我会尝试一下并回复。 - Roy Truelove
你能详细说明一下你的答案吗?我没听懂 :( - Edmondo

2

以下是一个扩展Scala DSL的示例,虽然有些不相关。

我们可以通过隐式类为DSL trait创建隐式方法。

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/

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]);
      }
    }
  }
}

谢谢Damo - 我确实需要将它们设置为标题 - 它们被处理器使用,但在处理器之后也用于处理一些路由。我会将其添加为原始问题的注释。 - Roy Truelove

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接