因此,Scala DSL当然是使用Scala编程语言的,它在纯Java上有很多花哨的地方。 但是,Scala DSL的普及率不是很高,因为Java和XML DSL对大多数人来说已经足够了。
无论如何,我想Scala DSL的优点之一就是使用闭包作为表达式和谓词等。因此,让我们使用Filter EIP模式做一个小例子,并使用闭包作为过滤谓词。
使用Scala DSL时,应使用org.apache.camel.scala.dsl.builder.RouteBuilder ,这是Scala支持的DSL。
因此,在下面的示例中,当我们定义createMyFilterRoute函数时,我们有一个FilterRoute类 ,在其中使用Scala DSL。
class FilterRoute {
def createMyFilterRoute = new RouteBuilder {
from("direct:start")
.filter(_.in("gold") == "true")
.to("mock:gold")
}
}
从上面的代码中可以看到,在RouteBuilder范围内,我们可以使用Scala DSL。 然后,我们使用过滤器EIP ,该过滤器EIP接受带有Exchange作为参数的函数,该函数默认设置为_符号。 使用具有隐式类型转换器和大小写匹配等功能的Scala功能强大(但有点吓人)的类型系统,将该函数的结果作为谓词进行评估。
in(“ gold”)是我们在Scala DSL中包装的Exchange上的函数,该函数在Camel Exchange ( RichExchange )上添加了其他方法,in是查找标头的函数。
为了对该路线进行单元测试,我想使用现有的功能强大的骆驼测试模块。 该模块提供了CamelTestSupport类,您可以为您的单元测试扩展该类。
因此,单元测试几乎可以像Java中的单元测试一样,但是您需要添加org.apache.camel.scala.dsl.RouteBuilderSupport特性,该特性有助于将Scala RouteBuilder与Java RouteBuilder桥接起来,而CamelTestSupport期望并使用该特性 。 下面的代码显示了一个单元测试示例。
class FilterRouteTest extends CamelTestSupport with RouteBuilderSupport {
override def createRouteBuilder() = new FilterRoute().createMyFilterRoute
@Test
def testFilterRouteGold() {
getMockEndpoint("mock:gold").expectedMessageCount(1)
template.sendBodyAndHeader("direct:start", "Hello World", "gold", "true")
assertMockEndpointsSatisfied()
}
@Test
def testFilterRouteNotGold() {
getMockEndpoint("mock:gold").expectedMessageCount(0)
template.sendBodyAndHeader("direct:start", "Hello World", "gold", "false")
assertMockEndpointsSatisfied()
}
}
如您所见,我们使用RouteBuilderSupport特性,然后重写createRouteBuilder函数以返回之前创建的具有Scala DSL功能的RouteBuilder。 其余代码是带有JUnit @Test批注的标准普通Java代码。
作为单元测试的一部分,该示例在camel-scala模块的源代码中提供。
如果您是Scala的粉丝并且也对Camel感兴趣,那么Camel社区可以使用专门致力于Scala并帮助Scala DSL的人员 。 骆驼队经常忙于生活中的其他问题,因此我们只有一点时间可以和Scala一起玩耍。
参考: Apache Camel –我们的JCG合作伙伴提供的 Scala DSL示例 克劳斯·易卜生( Claus Ibsen)在Apache Camel博客上的克劳斯·易卜生( Claus Ibsen) 。
翻译自: https://www.javacodegeeks.com/2012/02/apache-camel-little-scala-dsl-example.html