Таким образом, Scala DSL, конечно, использует язык программирования Scala, который имеет множество наворотов по сравнению с простой Java. Однако использование Scala DSL не очень высоко, так как Java и XML DSL достаточно хороши для большинства людей.
В любом случае, я думаю, что одна из приятных вещей в Scala DSL — это использование замыканий в качестве выражений, предикатов и т. Д. Итак, давайте сделаем небольшой пример с использованием шаблона Filter EIP и используем замыкание в качестве предиката фильтра.
При использовании Scala DSL вы должны использовать org.apache.camel.scala.dsl.builder.RouteBuilder , который является DSL, наделенным полномочиями Scala.
Итак, в следующем у нас есть класс FilterRoute, в котором мы используем DSL Scala, когда мы определяем функцию createMyFilterRoute .
1
2
3
4
5
6
7
|
class FilterRoute { def createMyFilterRoute = new RouteBuilder { from( "direct:start" ) .filter(_.in( "gold" ) == "true" ) .to( "mock:gold" ) } } |
Как видно из приведенного выше кода, в рамках RouteBuilder у нас есть Scala DSL. Затем мы используем фильтр EIP, который принимает функцию с Exchange в качестве параметра, который по умолчанию становится символом _. Результат этой функции оценивается как предикат с использованием мощной (но немного пугающей) системы типов Scala с неявным преобразователем типов, сопоставлением регистра и т. Д.
In («золото») — это функция в Exchange, включенная в Scala DSL, которая добавляет дополнительные методы в Camel Exchange ( RichExchange ), а in — это функция, которая ищет заголовок.
Для модульного тестирования этого маршрута я хотел использовать существующий и мощный верблюжий тестовый модуль. Этот модуль предлагает класс CamelTestSupport, который вы можете расширить для своих модульных тестов.
Таким образом, модульные тесты могут быть почти такими же, как в Java, но вам необходимо добавить признак org.apache.camel.scala.dsl.RouteBuilderSupport, который помогает связать Scala RouteBuilder с Java RouteBuilder, который ожидает и использует CamelTestSupport . Код ниже показывает пример модульного теста.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
|
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, который мы создали ранее. Остальная часть кода является стандартным и простым Java-кодом с аннотациями JUnit @Test.
Этот пример приведен в исходном коде модуля camel-scala как часть модульного теста.
Если вы являетесь поклонником Scala и также заинтересованы в Camel, то сообщество Camel может использовать людей, которые преданы Scala и помогают с Scala DSL . Команда Camel часто занята другими проблемами в нашей жизни, поэтому у нас есть немного времени, чтобы повеселиться и поиграть со Scala.
Справка: Apache Camel — небольшой пример Scala DSL от нашего партнера по JCG