2016-12-16 7 views
1

私はTomcatの8.5でのサーブレットの初期化子でのRESTEasy 3.1.0.CR3を使用していますを呼び出していないアプリケーションを介して注釈(なしweb.xmlは):RESTEasyのJAX-RSの@PreDestroy

<dependency> 
     <groupId>org.jboss.resteasy</groupId> 
     <artifactId>resteasy-jaxrs</artifactId> 
     <version>3.1.0.CR3</version> 
    </dependency> 
    <dependency> 
     <groupId>org.jboss.resteasy</groupId> 
     <artifactId>resteasy-servlet-initializer</artifactId> 
     <version>3.1.0.CR3</version> 
    </dependency> 

私はJAX-RSを持っています私はいくつかのリソースを解放することができるように、私は、それがコンテナからアンインストール/破壊される前に知っておく必要があるアプリケーション(スレッドを停止):

@ApplicationPath("/") 
public class MyRESTApplication extends Application { 

    … 

    @Override 
    public Set<Class<?>> getClasses() { 
    … 
    } 

    @Override 
    public Set<Object> getSingletons() { 
    … 
    } 

    @PreDestroy 
    public void end() { 
    //TODO release resources 
    } 

しかし、私のend()メソッドが呼び出されていないようです。私はこれを間違っているのですか? JAX-RSアプリケーションが停止したときを検出する良い方法はありますか?

+0

[これはバグに関連していると思います](https://java.net/jira/browse/JERSEY-1982)そして、申し訳ありませんが、私はエンティティービーンと混同しています。 JAX-RSにPostDestroyメソッドがあるかどうかわかりません – Gatusko

+0

ジャージーバグとRESTEasyの関係は何ですか? –

+0

完全な例でリポジトリを作成できますか?私はあなたが今までに与えたコードで何かが間違っているのを見ることができません。 – Adam

答えて

0

これがサポートされているかわかりません。 @PreDestoryのために同じルールが@PostConstructのためのように適用されます。

このアノテーションは、依存性注入をサポートするすべてのクラスでサポートされなければなりません。

Applicationクラスの依存関係注入はサポートされていますか? JAX-RSの実装では、マネージドBean、EJB、またはCDIを統合できますが、これはオプションです。 JAX-RS自体は@Contextを介して依存性注入を提供するが、Applicationクラス(仕様の第9.2.1章)ではではなくと明示的に依存性注入を提供する。

したがって@PreDestoryは一部の環境で動作する可能性がありますが、保証はありません。

お客様の環境では、ServletContextListenerというカスタムを実装し、#contextDestroyedにリソースをリリースします。あなたのApplicationクラスはvia the ServletContextアクセスできるようにする必要があります

Map<String, ResteasyDeployment> deployments = (Map<String, ResteasyDeployment>) 
    request.getServletContext().getAttribute("resteasy.deployments"); 
ResteasyDeployment deployment = deployments.get("/application/path"); 
Application application = deployment.getApplication(); 

また、ApplicationクラスなしカスタムServletContextListenerのすべてを扱うことができるとのServletContext属性としての参照を格納しています。

+0

私の 'ServletContextListener'はJAX-RSアプリケーションへの参照をどのように取得するのですか? (このアプリケーションの複数のインスタンスが同じサーバー上で実行されており、シャットダウン時に解放する必要があるリソースがそれぞれあります) –

+0

はい正しいです。 –

+0

申し訳ありませんが、あなたは私の質問に答えましたか?そして、私のServletContextListenerは私のJAX-RSアプリケーションへの参照をどのように取得しますか?" –

関連する問題