Spring Boot付きApacheキャメル
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プリミティブ(またはオブジェクト)としての抽出や、永続化層への送信など、他にも多くの変換が可能です。
ルートは常に着信メッセージから読み込まれるため、連鎖したルートは発信メッセージを無視します。
私たちの例は準備ができていて、そしてそれを試すことができます。
-
プロンプトコマンドを実行します。
mvn spring-boot:run
-
http://localhost:8080/camel/api/bean
へのPOSTリクエストを行います。
ヘッダパラメータ:
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ユーザーガイド