Edited at

Apache CamelのLive Reloadを使ってみた


Live Reload機能とは

Apache Camelのrouteを定義したXMLファイルが変更されたら、自動でrouteをリロードする機能がありました。

調べてみたところ、2017年5月にリリースされたv2.19.0からあった。

全く気付いていませんでした。今までの苦労は一体・・・

以下、リリースノートから。

Apache Camel 2.19 release notes から抜粋


Introduced ReloadStrategy as SPI which allows custom providers to implement logic for triggering live reloads of Camel routes.

The Camel Maven Plugin now allows to live reload route changes from XML files when running Camel. This can also be enabled from the Main class.


対応しているのはXML DSLの場合のみで、Java DSLには対応していません。Java DSLの場合は、Spring Boot DevToolsを使えばいいと思います(試してはいません)。


Live Reloadを使ってみた

1秒ごとにログを出力するサンプルアプリをLiveReloadを試してみます。

以下にアニメーションgifを作成してみました。

(ScreenToGifを使った。これは直感で使い方も分かり便利)

livereload.gif

上のgifでは、最初に出力するログを変更してファイルを保存すると、routeがリロードされています。

次に、実行間隔を1秒から5秒に変更しています。


利用方法

メインプログラムです。

ファイルの変更を開始するディレクトリを監視するために以下のコードを追加します。

main.setFileWatchDirectory("src/main/resources/META-INF/spring");

メインプログラム全体は以下のようになります。


TestMain.java

package sample;

import org.apache.camel.spring.Main;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class TestMain {

Logger logger = LoggerFactory.getLogger("sample.TestMain");

public static void main(String[] args) throws Exception {
Main main = new Main();
main.setApplicationContextUri("META-INF/spring/camel-context.xml");
main.setFileWatchDirectory("src/main/resources/META-INF/spring");
main.run();
}
}


次にcamel-context.xmlでrouteを定義します。

1秒ごとに「test」をログに出力する単純なrouteです。


camel-context.xml

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:camel="http://camel.apache.org/schema/spring"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://camel.apache.org/schema/spring
http://camel.apache.org/schema/spring/camel-spring.xsd"
>

<camelContext
xmlns="http://camel.apache.org/schema/spring">

<route id="mainRoute">
<from uri="timer://run?delay=1000&amp;period=1000" />
<log message="test" />
</route>
</camelContext>
</beans>


あとは、アプリケーションを実行して、camel-context.xmlを修正して保存すれば、最初にアニメーションgifで紹介したLiveReloadをお試しできます。


最後に

今までrouteを書き換えるたびにアプリケーションを再起動していたので面倒でしたが、これでようやく環境が整ってきました。(もっと早く知っていれば!)

ただし、routeをJava DSLで書いている場合は利用できないです。

XMLでごりごり書くのは最近流行りではないようなので、あまり使っている人はいないかもしれません。

今回はCamelスタンドアローンでLiveReload機能を試してみましたが、Camel Maven Plugin、Spring Bootでも利用できるようです。


参考

公式サイト - Camel Example Reload

https://github.com/apache/camel/tree/master/examples/camel-example-reload

Camel Live Reload of XML routes by JBoss Developer

http://planet.jboss.org/post/camel_live_reload_of_xml_routes