0

次の使用例があります: Web サービス プロキシとして Camel を使用し、A から要求を取得し、SOAP ヘッダーを強化して B に転送します。B の応答が A に返されます (実際の製品名を A & B に置き換えました)。 )

私のルートは次のようになります。

    <route id="orderLimitRoute">
        <from uri="cxf:bean:aOrderLimit?dataFormat=CXF_MESSAGE" />
        <to uri="bean:soapHeadersEnricher"/>
        <to uri="cxf:bean:bOrderLimit?dataFormat=CXF_MESSAGE" />
    </route>

このようなルートは機能しますが、それは問題ではありません。

エンリッチャーはアクセスキーをどこかから取得し、SOAP ヘッダーに挿入します。B は、有効なアクセスキーを持つリクエストのみを受け入れます。アクセスキーの取得は高価な操作であるため、これにはプールを使用します。また、B はアクセスキーがいつ無効になるかを実際には定義しません。したがって、これがあります(キャメル以外のシナリオの場合):

public Object execute(Call call) throws AbstractBWebServiceException {
    Object result = null;
    AccessKey accessKey = null;
    int tries = maxTries > 0 ? maxTries : accessKeyPool.getMaxActive() + 1;

    for (int i = 0; i < tries && accessKey == null; i++) {
        try {
            accessKey = borrowAccessKey();
            result = call.execute(accessKey);
        } catch (BWebServiceLoginException loginException) {
            invalidate(accessKey);
            accessKey = null;
        } finally {
            if (accessKey != null) {
                returnAccessKey(accessKey);
            }
        }
    }

    if (accessKey == null) {
        throw new BWebServiceAccessKeyException("Couldn't get a valid accesskey");
    }

    return result;
}

call.execute(accessKey) は B への呼び出しを行います。次に、Camel ルートでその Java コードを使用したいと思います。直接、または Camel ロジックに変換します。しかし、これを行う方法がわかりません.Camelのドキュメントを何度も見ましたが、関連するものが見つかりません.

4

2 に答える 2

1

Java コードから ProducerTemplate を使用して、任意の Camel エンドポイントにメッセージを送信できます。 http://camel.apache.org/producertemplate.html

于 2013-04-07T07:27:13.420 に答える
0

これが私が解決した方法です。「soapHeadersEnricher」は、アクセスキーをsoapheaderに挿入し、交換にも配置するBeanです。アクセスキーが無効と見なされると、特定のコードを含む SOAPFault が返されます。「bLoginExceptionPredicate」はその特定のコードをチェックし、そのタイプの例外に対して再配信が有効になります。「onRedelivery」は、取引所から無効なアクセスキーを取得し、プールに対して無効であるとマークし、新しいものを要求して、取引所と SOAP ヘッダーに設定します。最終プロセッサは、アクセスキーをプールに返します。

from("cxf:bean:brokerOrderLimit?dataFormat=PAYLOAD&allowStreaming=false")
            .process(soapHeadersEnricher)
            .onException(SoapFault.class)
            .onWhen(bLoginExceptionPredicate)
            .handled(false) // return fault to client
            .maximumRedeliveries(2)
            .redeliveryDelay(5000) 
            .retryAttemptedLogLevel(LoggingLevel.WARN)
            .logHandled(false)
            .onRedelivery(soapHeadersEnricher)
            .end()
            .to("cxf:bean:bOrderLimit?dataFormat=PAYLOAD&allowStreaming=false")
            .process(new Processor() {
                @Override
                public void process(Exchange exchange) throws Exception {
                    AccessKey accessKey = exchange.getProperty(BSoapHeadersEnricher.ACCESKEY_PROPERTY, AccessKey.class);
                    accessKeyProvider.returnAccessKey(accessKey);
                }
            });
于 2013-04-09T09:26:57.987 に答える