Статьи

Apache Camel — маленький пример Scala DSL

Итак, у нас есть Scala DSL в Apache Camel уже много лет, и я думаю, что пришло время написать небольшую запись в блоге об этом (уже давно в моем списке задач).

Таким образом, 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