Fuse 6 is no longer supported
As of February 2025, Red Hat Fuse 6 is no longer supported. If you are using Fuse 6, please upgrade to Red Hat build of Apache Camel.第180章 velocity
velocity リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
velocity: コンポーネントを使用すると、Apache Velocity テンプレートを使用してメッセージを処理できます。これは、Templating を使用してリクエストの応答を生成する場合に理想的です。
URI 形式 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
velocity:templateName[?options]
velocity:templateName[?options]
templateName は、呼び出すテンプレートのクラスパスローカル URI、またはリモートテンプレートの完全な URL (例:
file://folder/myfile.vm
)に置き換えます。
URI にクエリーオプションは
?option=value&option=value&.. の形式で追加できます。
オプション リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
オプション | デフォルト | 説明 |
---|---|---|
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 コンポーネントからもこれらのヘッダーを設定しないため、動的テンプレートのサポートに副作用が生じます)。
ヘッダー | 説明 |
---|---|
CamelVelocityResourceUri | String オブジェクトとしての templateName 。 |
CamelVelocitySupplementalContext | Camel 2.16: 使用された VelocityContext に追加情報を追加するには、以下を行います。このヘッダーの値は、追加するキー/値を持つ Map である必要があります(同じ名前の既存のキーを上書きします)。これは、velocity エンドポイントで再利用する一般的なキー/値の一部を設定するために使用できます。 |
Velocity 評価中に設定されたヘッダーはメッセージに返され、ヘッダーとして追加されます。その後、事実上 Velocity から Message に値を返すことができます。たとえば、Velocity テンプレート
template.tm
でヘッダー値 fruit
を設定するには、次のコマンドを実行します。
$in.setHeader("fruit", "Apple")
$in.setHeader("fruit", "Apple")
fruit
ヘッダーが message.out.headers
からアクセス可能になりました。
Velocity コンテキスト リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Apache Camel は Velocity コンテキストで交換情報を提供します(マップのみ
)
。Exchange
は以下のように転送されます。
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);
VelocityContext velocityContext = new VelocityContext(variableMap);
exchange.getIn().setHeader("CamelVelocityContext", velocityContext);
ホットリロード リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Velocity テンプレートリソースは、デフォルトでは、ファイルとクラスパスリソース(展開された jar)の両方に対してホットリロードが可能です。
contentCache=true
を設定すると、Apache Camel はリソースを 1 度だけロードするため、ホットリロードはできません。このシナリオは、リソースが変更されない場合に実稼働環境で使用することができます。
注記
velocity は、
ref:
を接頭辞として使用して、レジストリーからリソースファイルをロードできます。
動的テンプレート リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Camel 2 .1 Camel では利用可能な 2 つの ヘッダーで、テンプレートまたはテンプレートコンテンツ自体の異なるリソースの場所を定義できます。これらのヘッダーのいずれかが設定されている場合、Camel は設定されたエンドポイントでこれを使用します。これにより、ランタイム時に動的テンプレートを指定できます。
ヘッダー | タイプ | 説明 |
---|---|---|
CamelVelocityResourceUri | 文字列 | Camel 2.1: 設定されたエンドポイントの代わりに使用するテンプレートリソースの URI。 |
CamelVelocityTemplate | 文字列 | Camel 2.1: 設定されたエンドポイントの代わりに使用するテンプレート。 |
サンプル リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
たとえば、以下のようなものを使用できます。
from("activemq:My.Queue"). to("velocity:com/acme/MyResponse.vm");
from("activemq:My.Queue").
to("velocity:com/acme/MyResponse.vm");
Velocity テンプレートを使用して InOut メッセージエクスチェンジ(
JMSReplyTo
ヘッダーがある)のメッセージへの応答を形成するには、以下を実行します。
InOnly を使用してメッセージを消費し、別の宛先に送信する場合は、以下のルートを使用できます。
from("activemq:My.Queue"). to("velocity:com/acme/MyResponse.vm"). to("activemq:Another.Queue");
from("activemq:My.Queue").
to("velocity:com/acme/MyResponse.vm").
to("activemq:Another.Queue");
また、コンテンツキャッシュを使用するには、たとえば
.vm
テンプレートは変更されません。
from("activemq:My.Queue"). to("velocity:com/acme/MyResponse.vm?contentCache=true"). to("activemq:Another.Queue");
from("activemq:My.Queue").
to("velocity:com/acme/MyResponse.vm?contentCache=true").
to("activemq:Another.Queue");
また、ファイルベースのリソースは以下のようになります。
from("activemq:My.Queue"). to("velocity:file://myfolder/MyResponse.vm?contentCache=true"). to("activemq:Another.Queue");
from("activemq:My.Queue").
to("velocity:file://myfolder/MyResponse.vm?contentCache=true").
to("activemq:Another.Queue");
Camel 2.1 では、以下のように、コンポーネントがヘッダーを介して動的に使用するテンプレートを指定できます。
from("direct:in"). setHeader("CamelVelocityResourceUri").constant("path/to/my/template.vm"). to("velocity:dummy?allowTemplateFromHeader=true");
from("direct:in").
setHeader("CamelVelocityResourceUri").constant("path/to/my/template.vm").
to("velocity:dummy?allowTemplateFromHeader=true");
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");
from("direct:in").
setHeader("CamelVelocityTemplate").constant("Hi this is a velocity template that can do templating ${body}").
to("velocity:dummy?allowTemplateFromHeader=true");
警告
allowTemplateFromHeader
オプションを有効にすると、セキュリティーの問題があります。たとえば、ヘッダーに信頼できないコンテンツまたはユーザー派生コンテンツが含まれる場合、これは最終的に、エンドアプリケーションの確実性と整合性に及ぼす可能性があるため、このオプションを使用してください。
電子メールのサンプル リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
この例では、注文確認メールに Velocity テンプレートを使用します。メールテンプレートは、以下のように Velocity に配置されます。
Java コード: