2013-03-14 19 views
5

2つのコンテキスト(c1、c2(ルートの直後))で2つのWebアプリケーションが実行されています。私は、変数を共有するためにc1にstartupListenerを置き、それを取得するためにc2にもう1つを入れます。同じtomcatのWebアプリケーション間で共有オブジェクト

C1での私のstartuplistenerは次のとおりです。

C2アプリで
public void contextInitialized(ServletContextEvent sce) { 
      HashMap <String,Object> database ; 
      //some code to init database 
      ServletContext context = sce.getServletContext().getContext("/c1"); 
      if (context!=null) 
      { 
       context.setAttribute("crossContext", true); 
       context.setAttribute("cache", database); 
      } 

    } 

が、それはこのようなものです:

 public void contextInitialized(ServletContextEvent sce) { 
      ServletContext context = sce.getServletContext().getContext("/c1"); 
      HashMap<String,Object> database = (HashMap) context.getAttribute("cache"); 

     } 
C2のstartupListenerでコンテキストは常にnullである

、私は「試してみました/ c1 '、' c1 '。私は何が欠けていますか? (私はtomcat6を使用しています(問題がある場合) ありがとう

+0

そのnullで取得された値ではなく、私が推測するコンテキスト? –

+0

いいえ、コンテキストはヌルで、次の行にNPEをトリガします。 –

答えて

2

crossContext =で複数のサービスを開始することを決定することができます本当。 Tomcatのドキュメントから:trueに

設定あなたは ServletContext.getContextに、このアプリケーション内で呼び出しをしたい場合は()に成功し、この仮想ホスト上で実行されている他のWebアプリケーションの要求 ディスパッチャを戻します。 getContext()は常にnullを返すように、セキュリティを意識した環境ではfalse(デフォルト)に設定します。

http://tomcat.apache.org/tomcat-7.0-doc/config/context.html

+0

また、この質問を参照してくださいhttp://stackoverflow.com/questions/661978/what-does-the-crosscontext-attribute-do-in-tomcat-does-it-enable-session-sharin – brad

+0

ちょっとBrad、私はcrossContextを設定しましたアプリc1ではtrueになります。 –

+0

他にも役立つ場合:Bradの回答は正しいですが、crossContext = trueがtomcatフォルダのconfig/context.xmlに設定されていることに注意してください。 –

-1

もう1つのオプションはシリアル化を使用することです。あるアプリケーションでデータをシリアル化し、もう一方のアプリケーションでデータを読み込みます。

+0

OPが同じJVMで約2つのWebアプリケーションを要求しているので、シリアライゼーションは不要です – brad

0

問題:

APP1前APP2に初期化されることがありアプリの初期化中に不一致があります。

可能性「の回避策」がある:あなたが実際にお互いに依存するアプリ2つ(またはそれ以上)をお持ちの場合は、あなたserver.xml:あなたが設定する必要が

<Service name="app1"> 
    <Connector .../> 

    <Engine ...> 
    <Host appbase="app1" ...> 
     ...   
    </Host> 
    </Engine> 
</Service> 
<Service name="app2"> 
    <Connector .../> 

    <Engine ...> 
    <Host appbase="app2" ...> 
     ...   
    </Host> 
    </Engine> 
</Service> 
+0

こんにちは、私はc2が常にc1の後に開始されることを確認できます。 –

関連する問題