SpringBootを搭載したApacheCamel
1. 概要
中核となるApacheCamelは統合エンジンであり、簡単に言えば、さまざまなテクノロジー間の相互作用を促進するために使用できます。
サービスとテクノロジーの間のこれらのブリッジはルートと呼ばれます。ルートはエンジン( CamelContext )に実装され、いわゆる「交換メッセージ」と通信します。
2. Mavenの依存関係
まず、Spring Boot、Camel、SwaggerとJSONを使用したRestAPIの依存関係を含める必要があります。
<dependencies>
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-servlet-starter</artifactId>
<version>3.15.0</version>
</dependency>
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-jackson-starter</artifactId>
<version>3.15.0</version>
</dependency>
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-swagger-java-starter</artifactId>
<version>3.15.0</version>
</dependency>
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-spring-boot-starter</artifactId>
<version>3.15.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
Apache Camelの依存関係の最新バージョンは、ここにあります。
3. メインクラス
まず、Spring Bootアプリケーションを作成しましょう。
@SpringBootApplication
@ComponentScan(basePackages="com.baeldung.camel")
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
4. SpringBootのCamel構成
次に、構成ファイル(プロパティ)から始めて、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
この例は、ログバック構成へのパスも設定するapplication.propertiesファイルを示しています。 IPを「0.0.0.0」に設定することにより、SpringBootが提供する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サーブレットの設定
Camelの使用を開始する1つの方法は、Camelをサーブレットとして登録することです。これにより、HTTPリクエストをインターセプトして、アプリケーションにリダイレクトできます。
前述のように、Camelのバージョン2.18以下を使用すると、最終的なURLのパラメーターを作成することで、application.ymlを利用できます。 後でそれは私たちのJavaコードに注入されます:
baeldung:
api:
path: '/camel'
Application クラスに戻ると、コンテキストパスのルートにCamelサーブレットを登録する必要があります。これは、baeldung.api.pathのから挿入されます。アプリケーションの起動時のX194X]application.yml:
@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()メソッドをオーバーライドします。
Camelには常にCamelContextインスタンスが必要です。これは着信メッセージと発信メッセージが保持されるコアコンポーネントです。
この単純な例では、 DefaultCamelContext で十分です。これは、作成する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 (
同様に、GET、PUT、DELETEなどのHTTPアクションもすべて、 get()、 put()、 delete()の形式で使用できます。
最後に、 to()メソッドは、別のルートへのブリッジを作成します。 ここでは、コンテキスト/エンジン内で、作成する別のルートを検索するようにCamelに指示します。このルートは、値/ID「direct:…」によって名前が付けられ、検出されます。これは、 from()メソッド。
6.3. from()ルートと transform()
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()メソッドは、Camelコンテキストメッセージから消費することを除いて、 rest()メソッドと同じ原則に従い、多くの同じメソッドを備えています。 これが、前述のメソッド rest()。to()へのリンクを作成するパラメーター「direct-route」の理由です。
Javaプリミティブ(またはオブジェクト)としての抽出や永続層への送信など、他の多くの変換が利用可能です。 ルートは常に着信メッセージから読み取るため、チェーンルートは発信メッセージを無視することに注意してください。
私たちの例は準備ができており、試すことができます:
- プロンプトコマンドを実行します: mvn spring-boot:run
- http:// localhost:8080 / camel / api / bean に対して、ヘッダーパラメーター Content-Type:application / json とペイロード{“を使用してPOSTリクエストを実行しますid”:1、” name”:“ World”}
- 201のリターンコードと応答を受け取るはずです: Hello、World
6.4. シンプルなスクリプト言語
この例では、 traceing()メソッドを使用してロギングを出力します。 ${}プレースホルダーを使用していることに注意してください。 これらは、SIMPLEと呼ばれるCamelに属するスクリプト言語の一部です。 これは、メッセージ内の本文のように、ルートを介して交換されるメッセージに適用されます。
この例では、SIMPLEを使用して、Camelメッセージ本文内にあるBean属性をログに出力しています。
transform()メソッドで示したように、これを使用して単純な変換を行うこともできます。
6.5. from()ルートと process()
処理されたデータを返すためにサービスレイヤーを呼び出すなど、もっと意味のあることをしましょう。 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とbody: {“ id”:10、” name”:“ Hello、World”}で返されるようになりました。
7. 結論
数行のコードで、比較的完全なアプリケーションを作成することができました。 すべての依存関係は、単一のコマンドで自動的に構築、管理、および実行されます。 さらに、あらゆる種類のテクノロジーを結び付けるAPIを作成できます。
このアプローチはコンテナにも非常に適しているため、オンデマンドで簡単に複製できる非常に無駄のないサーバー環境になります。 追加の構成の可能性は、コンテナーテンプレート構成ファイルに簡単に組み込むことができます。
このRESTの例は、GitHubのにあります。
最後に、 filter()、 process()、 transform()、および marshall() APIを超えて、他の多くの統合パターンCamelではデータ操作を利用できます。