👋

Apache Camel 入門 2++

2023/02/02に公開

本記事はApache Camel 入門の続編の続編です。
Spring Boot連携機能で、作ったものと同じものをQuarkus使って作成してみます。nativeコンパイルも簡単にできたのでそこまで。

Quarkus のCamelサポート

  • Camel Quarkusとして全面的にサポート
  • 公式

Getting Started

plugins {
    id 'java'
    id 'io.quarkus'
}

repositories {
    mavenCentral()
    mavenLocal()
}

dependencies {
    implementation enforcedPlatform("${quarkusPlatformGroupId}:${quarkusPlatformArtifactId}:${quarkusPlatformVersion}")
    implementation enforcedPlatform("${quarkusPlatformGroupId}:quarkus-camel-bom:${quarkusPlatformVersion}")
    implementation 'org.apache.camel.quarkus:camel-quarkus-core'
    implementation 'org.apache.camel.quarkus:camel-quarkus-timer'
    implementation 'org.apache.camel.quarkus:camel-quarkus-bean'
    implementation 'org.apache.camel:camel-endpointdsl'
    implementation 'io.quarkus:quarkus-arc'
    testImplementation 'io.quarkus:quarkus-junit5'
}

group 'com.example'
version '1.0-SNAPSHOT'

java {
    sourceCompatibility = JavaVersion.VERSION_17
    targetCompatibility = JavaVersion.VERSION_17
}

test {
    systemProperty "java.util.logging.manager", "org.jboss.logmanager.LogManager"
}
compileJava {
    options.encoding = 'UTF-8'
    options.compilerArgs << '-parameters'
}

compileTestJava {
    options.encoding = 'UTF-8'
}

Beanを使ったTimerログルートの作成

ルート定義

  • EndpointBuilderを継承して、configureメソッドをオーバーライドする。QuarkusのCDIに登録する
  • URIの構造はドキュメントを参照
package com.example.quarkuscamel;

import org.apache.camel.builder.endpoint.EndpointRouteBuilder;

import javax.enterprise.context.ApplicationScoped;

@ApplicationScoped
public class TimerRoute extends EndpointRouteBuilder {
    @Override
    public void configure() throws Exception {
        from(timer("foo")
                .fixedRate(true)
                .period(3000)
                .repeatCount(3))
                .bean(HelloService.class)
                .bean(WorldService.class)
                .log("${body} !!");
    }
}
  • HelloService
package com.example.quarkuscamel;

import javax.enterprise.context.ApplicationScoped;

@ApplicationScoped
public class HelloService {
    public String hello(){
        return "Hello";
    }
}
  • WorldService
package com.example.quarkuscamel;

import javax.enterprise.context.ApplicationScoped;

@ApplicationScoped
public class WorldService {

    public String world(String hello){
        return String.join(" ",hello,"World");
    }
}

  • メインクラスは省略可能

  • devモードで実行

./gradlew quarkusDev

結果

2023-02-02 23:06:31,029 INFO  [route1] (Camel (camel-1) thread #1 - timer://foo) Hello World !!
2023-02-02 23:06:34,025 INFO  [route1] (Camel (camel-1) thread #1 - timer://foo) Hello World !!
2023-02-02 23:06:37,026 INFO  [route1] (Camel (camel-1) thread #1 - timer://foo) Hello World !!

Native ビルド

./gradlew build -Dquarkus.package.type=native

  • 実行
 ./build/quarkus-camel-1.0-SNAPSHOT-runner

- 結果

2023-02-02 23:06:31,029 INFO  [route1] (Camel (camel-1) thread #1 - timer://foo) Hello World !!
2023-02-02 23:06:34,025 INFO  [route1] (Camel (camel-1) thread #1 - timer://foo) Hello World !!
2023-02-02 23:06:37,026 INFO  [route1] (Camel (camel-1) thread #1 - timer://foo) Hello World !!

簡単にnativeアプリを作れた。素晴らしい。nativeでのコンテナイメージも簡単。k8sとかで動かすならこれで行きたい

GitHubで編集を提案

Discussion