1概要

基本的に、Apache Camelは統合エンジンです。簡単に言えば、これを使用して、さまざまなテクノロジ間の対話を容易にすることができます。

サービスとテクノロジ間のこれらのブリッジは

routesと呼ばれます。ルートはエンジン(

CamelContext__)に実装され、いわゆる「交換メッセージ」と通信します。


2 Mavenの依存関係

はじめに、Spring Boot、Camel、Swaggerを使用したRest API、およびJSONの依存関係を含める必要があります。

<dependencies>
    <dependency>
        <groupId>org.apache.camel</groupId>
        <artifactId>camel-servlet-starter</artifactId>
        <version>${camel.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.camel</groupId>
        <artifactId>camel-jackson-starter</artifactId>
        <version>${camel.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.camel</groupId>
        <artifactId>camel-swagger-java-starter</artifactId>
        <version>${camel.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.camel</groupId>
        <artifactId>camel-spring-boot-starter</artifactId>
        <version>${camel.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>${spring-boot-starter.version}</version>
    </dependency>
</dependencies>

Apache Camelの依存関係の最新バージョンはhttps://search.maven.org/classic/#search%7Cga%7C1%7Cg%3A%22org.apache.camel%22[here]にあります。

** 3メインクラス

まずSpring Boot

Application

を作成しましょう。

@SpringBootApplication
@ComponentScan(basePackages="com.baeldung.camel")
public class Application {
    public static void main(String[]args) {
        SpringApplication.run(Application.class, args);
    }
}

** 4 Spring Boot +用のキャメル設定

**

設定ファイル(プロパティ)から始めて、Springでアプリケーションを設定しましょう。

たとえば、

src/main/resources



application.properties

ファイルにアプリケーションのログを設定しましょう。

logging.config=classpath:logback.xml
camel.springboot.name=MyCamel
server.address=0.0.0.0
management.address=0.0.0.0
management.port=8081
endpoints.enabled = true
endpoints.health.enabled = true

この例では、パスをLogback設定にも設定する

application.properties

ファイルを示しています。 IPを「0.0.0.0」に設定することで、Spring Bootが提供するWebサーバーでの

admin

および

management

アクセスを完全に制限します。また、ヘルスチェックエンドポイントだけでなく、アプリケーションエンドポイントへの必要なネットワークアクセスも可能にします。

他の設定ファイルは

application.yml

です。その中に、アプリケーションルートに値を挿入するのに役立ついくつかのプロパティを追加します。

server:
  port: 8080
camel:
  springboot:
    name: ServicesRest
management:
  port: 8081
endpoints:
  enabled: false
  health:
    enabled: true
quickstart:
  generateOrderPeriod: 10s
  processOrderPeriod: 30s

5


キャメルサーブレットの設定


Camelを使い始める1つの方法はそれをサーブレットとして登録することです。そうすればそれはHTTPリクエストを傍受してそれらを我々のアプリケーションにリダイレクトすることができます。

先に述べたように、Camelのバージョン2.18以下を見れば、

application.yml

を利用することができます – 最終的なURLのパラメータを作成することによって。後でそれが私たちのJavaコードに挿入されます。

baeldung:
  api:
    path: '/camel'


Application

クラスに戻り、コンテキストパスのルートにCamelサーブレットを登録する必要があります。これは、アプリケーションの起動時に

application.yml

の参照

baeldung.api.path

からインジェクトされます。

@Value("${baeldung.api.path}")
String contextPath;

@Bean
ServletRegistrationBean servletRegistrationBean() {
    ServletRegistrationBean servlet = new ServletRegistrationBean
      (new CamelHttpTransportServlet(), contextPath+"/** ");
    servlet.setName("CamelServlet");
    return servlet;
}

Camelのバージョン2.19以降、

CamelServlet

はデフォルトで

“/camel”

に設定されているため、この設定は削除されました。


6. ルートを作る

Camelから

RouteBuilder

クラスを拡張し、それを

@ Component

として設定してWebサーバーの初期化中にそれを見つけることができるようにして、ルートの作成を始めましょう。

@Component
class RestApi extends RouteBuilder {
    @Override
    public void configure() {
        CamelContext context = new DefaultCamelContext();

        restConfiguration()...
        rest("/api/")...
        from("direct:remoteService")...
    }
}

このクラスでは、Camelの

RouteBuilder

クラスの

configure()

メソッドをオーバーライドします。

  • キャメルは常に

    CamelContext

    インスタンスを必要とします** – 着信および発信メッセージが保持されるコアコンポーネント。

この単純な例では、__Default CamelContextは、メッセージをブラインドしてルーティングするので、作成するRESTサービスのように十分です。


6.1.

restConfiguration()

ルート

次に、

restConfiguration()

メソッドで作成する予定のエンドポイント用のREST宣言を作成します。

restConfiguration()
  .contextPath(contextPath)
  .port(serverPort)
  .enableCORS(true)
  .apiContextPath("/api-doc")
  .apiProperty("api.title", "Test REST API")
  .apiProperty("api.version", "v1")
  .apiContextRouteId("doc-api")
  .component("servlet")
  .bindingMode(RestBindingMode.json)

ここでは、YAMLファイルから注入された属性でコンテキストパスを登録します。私たちのアプリケーションの移植にも同じ論理が適用されました。

CORSが有効になっているため、このWebサービスをクロスサイトで使用できます。バインディングモードでは、引数を許可してAPIに変換します。

次に、以前に設定したURI、タイトル、およびバージョンにSwaggerのドキュメントを追加します。 REST Webサービスのメソッド/エンドポイントを作成すると、Swaggerのドキュメントが自動的に更新されます。

このSwaggerコンテキストはそれ自体がCamelルートであり、スタートアッププロセス中にサーバーログでそれに関するいくつかの技術情報を見ることができます。私たちのサンプルドキュメントはデフォルトで


http://localhost:8080/camel/api-doc

.

にあります。


6.2.

rest()

ルート

それでは、上記の

configure()

メソッドから

rest()

メソッド呼び出しを実装しましょう。

rest("/api/")
  .id("api-route")
  .consumes("application/json")
  .post("/bean")
  .bindingMode(RestBindingMode.json__xml)
  .type(MyBean.class)
  .to("direct:remoteService");

この方法は、APIに精通している人にとっては非常に簡単です。

id

は、

CamelContext

内のルートのIDです。次の行はMIMEタイプを定義します。

restConfiguration()

でモードを設定できることを示すために、バインディングモードがここで定義されています。


post()

メソッドはAPIに操作を追加して“

POST/bean

”エンドポイントを生成し、

MyBean



Integer id



String name

を持つ通常のJava Bean)は予期されるパラメータを定義します。

同様に、GET、PUT、DELETEなどのHTTPアクションもすべて

get()



put()



delete()

の形式で使用できます。

最後に、

to()

メソッドは他のルートへのブリッジを作成します。ここでは、Camelにコンテキスト/エンジン内で、これから作成しようとしている別のルートを検索するように指示します。 __ 方法。


6.3.

transform()


を使用した

from()

ルート

Camelを使用している場合、ルートはパラメータを受け取り、次にこれらのパラメータを変換、変換、および処理します。その後、これらのパラメータを別の経路に送信し、その結果を目的の出力(ファイル、データベース、SMTPサーバー、またはREST API応答)に転送します。

この記事では、オーバーライドしている

configure()

メソッド内に別のルートを作成するだけです。これが最後の

to()

ルートの目的地ルートになります。

from("direct:remoteService")
  .routeId("direct-route")
  .tracing()
  .log(">>> ${body.id}")
  .log(">>> ${body.name}")
  .transform().simple("Hello ${in.body.name}")
  .setHeader(Exchange.HTTP__RESPONSE__CODE, constant(200));


from()

メソッドは、キャメルコンテキストメッセージから消費することを除いて、

rest()

メソッドと同じ原則に従い、多くの同じメソッドを持ちます。これが、前述のメソッド

rest()。to()

へのリンクを作成するパラメータ「

direct-route

」の理由です。

Javaプリミティブ(またはオブジェクト)としての抽出や、永続化層への送信など、他にも多くの変換が可能です。

ルートは常に着信メッセージから読み込まれるため、連鎖したルートは発信メッセージを無視します。

私たちの例は準備ができていて、そしてそれを試すことができます。

ヘッダパラメータ:

Content-Type:application/json

、およびペイロード

\ {“ id”:1、“ name”:“ World”}

** 戻りコード201と応答:__Hello、

世界__


6.4. 単純なスクリプト言語

この例では、

tracing()

メソッドを使用してロギングを出力しています。

$ \ {}

プレースホルダーを使用したことに注意してください。これらは、SIMPLEと呼ばれるキャメルに属するスクリプト言語の一部です。メッセージ内の本文のように、経路上で交換されるメッセージに適用されます。

この例では、Camelメッセージ本文内にあるBean属性をログに出力するためにSIMPLEを使用しています。


transform()

メソッドで示したように、単純な変換を行うためにも使用できます。


6.5.

process()を使った

from()

ルート


処理したデータを返すためにサービス層を呼び出すなど、もっと意味のあることをしましょう。 SIMPLEは重いデータ処理を目的としたものではないので、

transform()



process()

メソッドに置き換えます。

from("direct:remoteService")
  .routeId("direct-route")
  .tracing()
  .log(">>> ${body.id}")
  .log(">>> ${body.name}")
  .process(new Processor() {
      @Override
      public void process(Exchange exchange) throws Exception {
          MyBean bodyIn = (MyBean) exchange.getIn().getBody();
          ExampleServices.example(bodyIn);
          exchange.getIn().setBody(bodyIn);
      }
  })
  .setHeader(Exchange.HTTP__RESPONSE__CODE, constant(200));

これにより、データを以前は

type()

メソッドで定義したのと同じBeanに抽出し、それを

ExampleServices

レイヤーで処理できます。

以前に

bindingMode()

をJSONに設定したので、応答はすでに適切なJSON形式になっており、POJOに基づいて生成されています。これは、

ExampleServices

クラスの場合、次のようになります。

public class ExampleServices {
    public static void example(MyBean bodyIn) {
        bodyIn.setName( "Hello, " + bodyIn.getName() );
        bodyIn.setId(bodyIn.getId() **  10);
    }
}

同じHTTPリクエストがレスポンスコード201と本文で返されます。


\ {“ id”:10、“ name”:“こんにちは、ワールド”}


7. 結論

数行のコードで、比較的完成度の高いアプリケーションを作成できました。すべての依存関係は、単一のコマンドで自動的に構築、管理、および実行されます。さらに、あらゆる技術を結び付けるAPIを作成することもできます。

このアプローチはコンテナにも非常に優しいため、要求に応じて簡単に複製できる非常にリーンなサーバ環境になります。追加の設定の可能性は、コンテナテンプレート設定ファイルに簡単に組み込むことができます。

このRESTの例はhttps://github.com/eugenp/tutorials/tree/master/spring-boot-camel[over on GitHub]にあります。

最後に、

filter()



process()



transform()

、および

marshall()

API以外にも、Camelでは他の多くの統合パターンおよびデータ操作を使用できます。

統合パターン]**

Camelユーザーガイド