Flex Gateway新着情報
Governance新着情報
Monitoring API Managerこのデコレーターの例では、スコープの基本構造がわかります。これには、実行される Chain
と、スコープの実行が完了すると呼び出される CompletionCallback
があります。 (yes, すべてのスコープは非ブロック操作として宣言されます。):
@Extension(name = "Docs")
@Operations(LogDecorator.class)
public class DocsModule {
}
public void logDecorator(Chain operations,
CompletionCallback<Object, Object> callback) {
LOGGER.debug("Invoking child operations")
operations.process(
result -> {
LOGGER.debug(result.getOutput());
callback.success(result);
},
(error, previous) -> {
LOGGER.error(error.getMessage());
callback.error(error);
});
}
もちろん、操作の Chain
を受け取る場合、何らかの方法でそれらを実行する必要があります。それが process(successCallback, errorCallback)
で実行される内容です。
この例では、これを使用して、非ブロック形式で Chain
を実行し、成功またはエラーの場合に結果をリスンします。ここでは、Chain
のすべての操作の実行が成功すると、その実行結果を使用して successCallback
がコールされます。いずれかの子操作の実行中にエラーが発生すると、エラーと最後の成功結果の両方を引数として errorCallback
がコールされます。
Mule アプリケーションでスコープを使用する例を次に示します。
<flow name="logDecoratorSampleFlow">
<docs:log-decorator>
<http:request config-ref="config" path="/" method="GET"/>
</docs:log-decorator>
</flow>
これにより、LOGGER
の呼び出しでラップされた http:request
子操作が実行されます。
他のスコープやルーターが含まれるスコープ内で任意の数の操作を実行できます。
スコープは、他の単純な @Parameters
および @ParameterGroups
を受け取ることができます。スコープは子要素として宣言される複雑なパラメーターを受け取ることができないため、これらは単純です。たとえば、デコレーターのログレベルをカスタマイズする場合、それをパラメーターとして受け取ることができるようになります。
public void logDecorator(@Optional(defaultValue="true") boolean debug,
Chain operations,
CompletionCallback<Object, Object> callback) {
if (debug){
LOGGER.debug("Invoking child operations")
}
operations.process(
result -> {
Object message = result.getOutput();
if (debug){
LOGGER.debug(message);
} else {
LOGGER.info(message);
}
callback.success(result);
},
(error, previous) -> {
LOGGER.error(error.getMessage());
callback.error(error);
});
}
スコープの API の変更は最小限です。
<flow name="logDecoratorSampleFlow">
<docs:log-decorator debug="false">
<http:request config-ref="config" path="/" method="GET"/>
</docs:log-decorator>
</flow>
デフォルトでは、コンテナスコープで受信したメッセージを使用して Chain
が実行されますが、process
メソッドの他の定義を使用すると、スコープのユーザーは、Chain
の実行に使用されるペイロードや属性をカスタマイズできます。
Stereotypes
を使用すると、Chain
内に存在できる操作を制限できます。これにより、その用途の一貫性を確保できます。特定の Stereotypes
のある操作のみをスコープ内で宣言できます。
public void assertAll(@AllowedStereotypes(AssertionStereotype.class) Chain assertions,
@Optional boolean failOnError,
CompletionCallback<Boolean, Void> callback) {
assertions.process(
result -> {
callback.success(Result.<Boolean, Void>builder().output(true).build());
},
(error, previous) -> {
if (failOnError){
callback.error(error);
} else {
callback.success(Result.<Boolean, Void>builder().output(false).build());
}
});
}
<flow name="logDecoratorSampleFlow">
<docs:assert-all>
<docs:not-null value="#[payload]">
<docs:not-empty-collection value="#[payload]">
</docs:assert-all>
</flow>
すべてのスコープは、それらの結果を伝えるために CompletionCallback
を受け取る void
メソッドとして定義されている必要があります。つまり、すべてのスコープはデフォルトで非ブロックになります。
「非ブロック操作」を参照してください。