第180章 velocity


velocity

velocity: コンポーネントを使用すると、Apache Velocity テンプレートを使用してメッセージを処理できます。これは、Templating を使用してリクエストの応答を生成する場合に理想的です。

URI 形式

velocity:templateName[?options]
Copy to Clipboard Toggle word wrap
templateName は、呼び出すテンプレートのクラスパスローカル URI、またはリモートテンプレートの完全な URL (例: file://folder/myfile.vm)に置き換えます。
URI にクエリーオプションは ?option=value&option=value&.. の形式で追加できます。

オプション

Expand
オプション デフォルト 説明
allowContextMapAll (producer)
false
コンテキストマップが前詳細へのアクセスを許可するかどうかを設定します。デフォルトでは、メッセージの本文とヘッダーにのみアクセスできます。このオプションは、現在の Exchange および CamelContext へのフルアクセスに対して有効にできます。これを行うと、CamelContext API の全機能へのアクセスが開かれるため、潜在的なセキュリティーリスクが発生します。
allowTemplateFromHeader (producer)
false
ヘッダーのリソーステンプレートの使用を許可するかどうか (デフォルトは false)。このオプションを有効にすると、セキュリティーの問題があります。たとえば、ヘッダーに信頼されていないコンテンツやユーザー派生コンテンツが含まれている場合、これは最終的にエンドアプリケーションの信頼性および完全性に影響を与える可能性があるため、このオプションは注意して使用してください。
loaderCache true Velocity ベースのファイルローダーキャッシュ。
contentCache true ロード時のリソースコンテンツのキャッシュ。注記:Camel 2.9 でキャッシュされたリソースコンテンツは、エンドポイントの clearContentCache 操作を使用して JMX 経由でクリアできます。
encoding null リソースコンテンツの文字エンコーディング。
propertiesFile null Camel 2.1 の新機能:VelocityEngine の初期化に使用されるプロパティーファイルの URI。

メッセージヘッダー

velocity コンポーネントは、メッセージに 2 つのヘッダーを設定します(これらは独自に設定できず、Camel 2.1 velocity コンポーネントからもこれらのヘッダーを設定しないため、動的テンプレートのサポートに副作用が生じます)。
Expand
ヘッダー説明
CamelVelocityResourceUriString オブジェクトとしての templateName
CamelVelocitySupplementalContextCamel 2.16: 使用された VelocityContext に追加情報を追加するには、以下を行います。このヘッダーの値は、追加するキー/値を持つ Map である必要があります(同じ名前の既存のキーを上書きします)。これは、velocity エンドポイントで再利用する一般的なキー/値の一部を設定するために使用できます。
Velocity 評価中に設定されたヘッダーはメッセージに返され、ヘッダーとして追加されます。その後、事実上 Velocity から Message に値を返すことができます。たとえば、Velocity テンプレート template.tm でヘッダー値 fruit を設定するには、次のコマンドを実行します。
$in.setHeader("fruit", "Apple")
Copy to Clipboard Toggle word wrap
fruit ヘッダーが message.out.headers からアクセス可能になりました。

Velocity コンテキスト

Apache Camel は Velocity コンテキストで交換情報を提供します(マップのみ Exchange は以下のように転送されます。
Expand
key value
exchange Exchange 自体。
exchange.properties Exchange プロパティー。
ヘッダー In メッセージのヘッダー。
camelContext Camel Context インスタンス。
request In メッセージ。
in In メッセージ。
ボディー In メッセージのボディー。
out Out メッセージ(InOut メッセージ交換パターンにのみ有効)。
response Out メッセージ(InOut メッセージ交換パターンにのみ有効)。
Camel-2.14 以降、以下のようにメッセージヘッダー CamelVelocityContext を設定して、カスタムの Velocity Context を独自に設定できます。
VelocityContext velocityContext = new VelocityContext(variableMap);
exchange.getIn().setHeader("CamelVelocityContext", velocityContext);
Copy to Clipboard Toggle word wrap

ホットリロード

Velocity テンプレートリソースは、デフォルトでは、ファイルとクラスパスリソース(展開された jar)の両方に対してホットリロードが可能です。contentCache=true を設定すると、Apache Camel はリソースを 1 度だけロードするため、ホットリロードはできません。このシナリオは、リソースが変更されない場合に実稼働環境で使用することができます。
注記
velocity は、ref: を接頭辞として使用して、レジストリーからリソースファイルをロードできます。

動的テンプレート

Camel 2 .1 Camel では利用可能な 2 つの ヘッダーで、テンプレートまたはテンプレートコンテンツ自体の異なるリソースの場所を定義できます。これらのヘッダーのいずれかが設定されている場合、Camel は設定されたエンドポイントでこれを使用します。これにより、ランタイム時に動的テンプレートを指定できます。
Expand
ヘッダー タイプ 説明
CamelVelocityResourceUri 文字列 Camel 2.1: 設定されたエンドポイントの代わりに使用するテンプレートリソースの URI。
CamelVelocityTemplate 文字列 Camel 2.1: 設定されたエンドポイントの代わりに使用するテンプレート。

サンプル

たとえば、以下のようなものを使用できます。
from("activemq:My.Queue").
  to("velocity:com/acme/MyResponse.vm");
Copy to Clipboard Toggle word wrap
Velocity テンプレートを使用して InOut メッセージエクスチェンジ( JMSReplyTo ヘッダーがある)のメッセージへの応答を形成するには、以下を実行します。
InOnly を使用してメッセージを消費し、別の宛先に送信する場合は、以下のルートを使用できます。
from("activemq:My.Queue").
  to("velocity:com/acme/MyResponse.vm").
  to("activemq:Another.Queue");
Copy to Clipboard Toggle word wrap
また、コンテンツキャッシュを使用するには、たとえば .vm テンプレートは変更されません。
from("activemq:My.Queue").
  to("velocity:com/acme/MyResponse.vm?contentCache=true").
  to("activemq:Another.Queue");
Copy to Clipboard Toggle word wrap
また、ファイルベースのリソースは以下のようになります。
from("activemq:My.Queue").
  to("velocity:file://myfolder/MyResponse.vm?contentCache=true").
  to("activemq:Another.Queue");
Copy to Clipboard Toggle word wrap
Camel 2.1 では、以下のように、コンポーネントがヘッダーを介して動的に使用するテンプレートを指定できます。
from("direct:in").
  setHeader("CamelVelocityResourceUri").constant("path/to/my/template.vm").
  to("velocity:dummy?allowTemplateFromHeader=true");
Copy to Clipboard Toggle word wrap
Camel 2.1 では、以下のように、コンポーネントはヘッダーを介して動的に使用する必要があるヘッダーとしてテンプレートを直接指定できます。
from("direct:in").
  setHeader("CamelVelocityTemplate").constant("Hi this is a velocity template that can do templating ${body}").
  to("velocity:dummy?allowTemplateFromHeader=true");
Copy to Clipboard Toggle word wrap
警告
allowTemplateFromHeader オプションを有効にすると、セキュリティーの問題があります。たとえば、ヘッダーに信頼できないコンテンツまたはユーザー派生コンテンツが含まれる場合、これは最終的に、エンドアプリケーションの確実性と整合性に及ぼす可能性があるため、このオプションを使用してください。

電子メールのサンプル

この例では、注文確認メールに Velocity テンプレートを使用します。メールテンプレートは、以下のように Velocity に配置されます。
Dear ${headers.lastName}, ${headers.firstName}

Thanks for the order of ${headers.item}.

Regards Camel Riders Bookstore
${body}
Copy to Clipboard Toggle word wrap
Java コード:
private Exchange createLetter() {
    Exchange exchange = context.getEndpoint("direct:a").createExchange();
    Message msg = exchange.getIn();
    msg.setHeader("firstName", "Claus");
    msg.setHeader("lastName", "Ibsen");
    msg.setHeader("item", "Camel in Action");
    msg.setBody("PS: Next beer is on me, James");
    return exchange;
}

@Test
public void testVelocityLetter() throws Exception {
    MockEndpoint mock = getMockEndpoint("mock:result");
    mock.expectedMessageCount(1);
    mock.expectedBodiesReceived("Dear Ibsen, Claus\n\nThanks for the order of Camel in Action.\n\nRegards Camel Riders Bookstore\nPS: Next beer is on me, James");

    template.send("direct:a", createLetter());

    mock.assertIsSatisfied();
}

protected RouteBuilder createRouteBuilder() throws Exception {
    return new RouteBuilder() {
        public void configure() throws Exception {
            from("direct:a").to("velocity:org/apache/camel/component/velocity/letter.vm").to("mock:result");
        }
    };
}
Copy to Clipboard Toggle word wrap
トップに戻る
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。 最新の更新を見る.

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

Theme

© 2025 Red Hat