2017-09-01 11 views
2

サービスへのSOAP呼び出しを行うためにSpring WebserviceTemplateを使用しています。パフォーマンステストを実行して、負荷の下での動作を確認しました。私はまた、私の呼び出しているサービスに私の着信要求からヘッダーパラメーターをコピーするためのインターセプターを持っています。私は、パフォーマンス・テストを実行したときJAXB.marshalブロッキングWebサービスコール

@Component 
public class HeaderPropagationInterceptor implements ClientInterceptor { 

    @Override 
    public boolean handleRequest(MessageContext messageContext) throws WebServiceClientException { 
     SoapMessage request = (SoapMessage) messageContext.getRequest(); 
     Result result = request.getSoapHeader().getResult(); 
     JAXB.marshal(getRequestHeader(), result); 
     return true; 
    } 

、私はこれがブロックされる可能性があります理由があり、以下の文は4-5秒

JAXB.marshal(getRequestHeader(), result); 

ブロッキング参照してください?

+0

クラス['JAXB'](https://docs.oracle.com/javase/8/docs/api/javax/xml/bind/JAXB.html)のjavadocがありますか? "*一般的に言えば、パフォーマンスは必ずしも最適ではありません パフォーマンスクリティカルなコード を書く必要がある人は、残りのJAXB APIを直接使用することが期待されます*" –

+0

ありがとうございます。 100ミリ秒。この問題は、テストを読み込もうとしたときにのみ表示されます。この遅れの原因となる機会があれば同期しますか?クラスを開いたとき、メソッドは静的だが同期していないことがわかった –

+0

'JAXB.marshal'はどこから来たのですか?これはサードパーティのAPIですか? – kolossus

答えて

3

JAXBユーティリティクラスは、JAXBContextを初めて呼び出すときに(高価な操作)作成します。弱くキャッシュされます。つまり、メモリが不足すると、コンテキストがリサイクルされ、次の呼び出しで再作成されます。コンテキストを作成して明示的に保持する必要があります。 (すでに他の人のコメントで提案されているように)このような何かはあなたの問題を解決する必要があります。

@Component 
public class HeaderPropagationInterceptor implements ClientInterceptor 
{ 
    private JAXBContext jaxbContext; 

    @PostConstruct 
    public void createJaxbContext() { 
     try { 
      jaxbContext = JAXBContext.newInstance(RequestHeader.class); 
     } 
     catch(JAXBException e) { 
      throw new IllegalStateException("Unable to create JAXBContext.", e); 
     } 
    } 

    @Override 
    public boolean handleRequest(MessageContext messageContext) throws WebServiceClientException { 
     SoapMessage request = (SoapMessage) messageContext.getRequest(); 
     Result result = request.getSoapHeader().getResult(); 
     jaxbContext.createMarshaller().marshal(getRequestHeader(), result); 
     return true; 
    } 
} 

あなたはあなたのコードで使用される実際のクラスでRequestHeader.classを交換する必要があります。パフォーマンスをさらに改善する必要がある場合は、マーシャラーを再利用するためにスレッドローカルを使用することもできますが、実際にボトルネックであることを確認するためにプロファイリングを行う必要があります。あなたのプロジェクトに幸運を祈る!

+0

'@ PostConstruct'メソッドで' throws JAXBException'を使うことは許されないと思います。 [this](https://stackoverflow.com/questions/23153742/im-gettting-warning-from-postconstruct-annotated-init-method) と[this](https://stackoverflow.com/questions/8740234)を参照してください。/postconstruct-checked-exceptions)の質問です。 'throws'節を削除し、メソッドに' try'/'catch'ロジックを追加する必要があります。 –

+0

@ThomasFritschはい、そうです。私は例を更新します! –

+0

Thanks Per Huss !!! –

関連する問題