2011-01-21 20 views
3

の別のインスタンスからステートレスEJBにアクセスすると、私と私はインターネット上でそれを解決するための統一的な方法を見つけることができない問題があります。 Java EE、Glassfish、Netbeansを使用してエンタープライズアプリケーションを開発しています。Glassfish

私はGlassfishのインスタンスを2つ設定しました。私は2つのインスタンスの間でエンタープライズアプリケーションの分割を構築しています。私は、Glassfishの1つのインスタンスで動作するWebページ(いくつかのJSPと2つのHttpServletsを持つ)を持っています。他の例では、私はアプリのビジネスロジックを実装したいと思います。つまり、Java Entity Beanをいくつか持ち、これらのエンティティBeanを使用するリモート・インタフェースを持つEJBも持っています。

私の目標は、glassfishの最初のインスタンス上のサーブレットからEJBにリモートでアクセスできるようにすることです。 this postにある指示に従っていますが、失敗しました。

@Remote 
public interface MyEjbRemote { 
    //... 
} 

とステートレスBeanに:他のインスタンスで

@Stateless(name="ejb/MyEjb") 
public class MyEjb implements MyEjbRemote { 
    //... 
} 

私はGlassfishの、EJBのリモート・インタフェースの1つのインスタンスで...

をより具体的な取得するためのコードスニペットを提供しています:

public class MyServlet extends HttpServlet { 

    @Override 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 
     MyEjbRemote = lookupEjb(); 
     //... 
    } 

    private MyEjbRemote lookupEjb() { 
     Properties props = new Properties(); 
     props.setProperty("java.naming.factory.initial", 
      "com.sun.enterprise.naming.SerialInitContextFactory"); 
     props.setProperty("java.naming.factory.url.pkgs", 
      "com.sun.enterprise.naming"); 
     props.setProperty("java.naming.factory.state", 
      "com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl"); 

     //default: localhost 
     props.setProperty("org.omg.CORBA.ORBInitialHost", 
      "localhost"); 
     //default: 3700 
     props.setProperty("org.omg.CORBA.ORBInitialPort", "2037"); 

     InitialContext ic = new InitialContext(props); 
     return (MyEjbRemote) ic.lookup("ejb/MyEjb"); 
    } 
} 

残念ながら、私は自分のウェブサイトを立ち上げ、リモートのej b以下の例外があります。

WARNING: Internal error flushing the buffer in release() 
WARNING: StandardWrapperValve[jsp]: PWC1406: Servlet.service() for servlet jsp threw exception 
java.io.IOException: Stream closed 
    at org.apache.jasper.runtime.JspWriterImpl.ensureOpen(JspWriterImpl.java:277) 
    at org.apache.jasper.runtime.JspWriterImpl.clearBuffer(JspWriterImpl.java:222) 
    at org.apache.jsp.home_jsp._jspService(home_jsp.java from :76) 
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:109) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:847) 
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:406) 
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:483) 
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:373) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:847) 
    at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1523) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:279) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:188) 
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:641) 
    at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:97) 
    at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:85) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:185) 
    at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:325) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:226) 
    at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:165) 
    at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:791) 
    at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:693) 
    at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:954) 
    at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:170) 
    at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:135) 
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:102) 
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:88) 
    at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:76) 
    at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:53) 
    at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:57) 
    at com.sun.grizzly.ContextTask.run(ContextTask.java:69) 
    at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:330) 
    at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:309) 
    at java.lang.Thread.run(Thread.java:662) 

私の実装には何が欠けていますか?何か提案/アイデアはありますか?私の問題の説明に何かがないか尋ねてください。私はこのサイトで私が初めて投稿したものです。私はあなたの時間を感謝します!

イリアス

+0

私は[ここ](http://glassfish.java.net/javaee5/ejb/EJB_FAQ.html#cross-appserverremoteref)の指示に従って実装を変更しましたが、運がまったくありません。 CORBAの悪いパラメータ(org.omg.CORBA.BAD_PARAM)... – Ilias

答えて

2

ここにいくつかの間違いがあります。

おそらく最も実用的なのは、JSPページからの例外で、サーブレットやEJBアクセスとはまったく関係がないということです。どちらもスタックトレースには現れません。おそらく、というhome.jspというJSPがあります。それはレスポンスに書き込もうとしていますが、それを表すストリームはすでに閉じられています。どこか厄介なことをやっているところですが、おそらくEJBとは無関係です。

理論的に間違っているのは、デザインが大きな反パターンのように見えるということです。 "分離ビジネスロジック"の唯一の目的のためにリモートEJB呼び出しを使用して極端に悪い考えです。ビジネスロジックを分離したい場合は、EJBモジュールをEJBモジュールに、サーブレットとJSPをWEBモジュールに入れて、EARにバンドルします。ローカルインターフェイスを使用します。これをサポートするプロジェクトを作成するのは、通常、NetbeansやEclipseのようなIDEのほんのわずかなクリックであり、デザインのパフォーマンスと健全性ははるかに優れています。

リモートEJBがもっとも確実に使用されていますが、非常にのように使用する必要があります。それらを使用して、そのサーバーの特定のインスタンスが特定の意味を持つリモートサーバーで粗いジョブなどを制御します。例えば。クラスタ内にメッセージ(JMS経由)がキューに入れられ、一括して処理されて外部ネットワークに送信される単一のゲートウェイサーバーがあるとします。リモートEJBを使用して、そのリモートサーバを管理します。

問題の説明から、この2番目のGlassfishインスタンスを「通常の」細かいビジネスロジックに使用したいと思っています。あなたが何をしているかについて100%確信していなければ、特定の問題が絶対に遠隔コミュニケーションを必要としていることを100%確信している場合を除き、

+0

啓発の回答arjanありがとう!私はあなたが言うすべてに同意しなければならないが、私は何かを追加したい。最初のEARにejbsとjsps/servletsを使って、私のアプリケーションはあなたがそれを記述するのとまったく同じだった。それはうまく動作します:)私の実装をやや分散した形で変えなければならないということです。この記事で私がしようとしているのはこの方向です。だから私はアクセスする私のアプリのためのリモートサービスを実装しようとしていると私の考えは別のサーバーで何かを行うejbを構築することでした!あなたは例外については正しいですが、ルックアップはまだ動作しません.. – Ilias

2

コンプリートGlassfishの3.1 +のEclipse Heliosの+ EJB 3.1の例

シンプルMain.java(SIMPLEクライアントプロジェクト配備する必要はありません)

Properties props = new Properties(); 
props.setProperty("java.naming.factory.initial", "com.sun.enterprise.naming.SerialInitContextFactory"); 
props.setProperty("java.naming.factory.url.pkgs", "com.sun.enterprise.naming"); 
props.setProperty("java.naming.factory.state", "com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl"); 

// optional. Defaults to localhost. Only needed if web server is running 
// on a different host than the appserver 
props.setProperty("org.omg.CORBA.ORBInitialHost", "127.0.0.1"); 
// optional. Defaults to 3700. Only needed if target orb port is not 3700. 
props.setProperty("org.omg.CORBA.ORBInitialPort", "3700"); 

InitialContext ic = new InitialContext(props); 
GlassfishSessionBeanRemote gRemote = (GlassfishSessionBeanRemote)ic.lookup("java:global/EJBGFish/GlassfishSessionBean!com.example.GlassfishSessionBeanRemote"); 
gRemote.sayHello(); 

EJBモジュール - すべて展開する必要がありますJARファイルとしての3つ以下(Eclipseでサーバーとして実行) - 展開

@Stateless 
public class GlassfishSessionBean implements GlassfishSessionBeanRemote, GlassfishSessionBeanLocal { 

    @Override 
    public void sayHello() { 
     System.out.println("First Glassfish App!"); 
    } 

リモートとローカルインターフェイスは以下のとおりです。

  1. のGlassFish 3.1 LIBフォルダからメインにGF-client.jarのを追加する必要があります行われるように最も重要なことは、

    @Remote 
    public interface GlassfishSessionBeanRemote { 
    
        public void sayHello(); 
    } 
    
    @Local 
    public interface GlassfishSessionBeanLocal { 
    
        public void sayHello(); 
    } 
    

    。 javaのクラスパス(最初のもの)

  2. EJBプロジェクトをMain.javaのクラスパスに追加します。
+0

' IIOP'を動作させるには、 'ORB'でリスナーを設定する必要はありませんか? – Thufir

0

私はあなたがEJBプロジェクトを展開する必要があると思います。その後、クライアントプロジェクトに次のようなコードを挿入します。

try { 
    Context c = new InitialContext(); 
    HelloRemote z = (HelloRemote) c.lookup("java:global/Pro_EJBModule1/Hello!newpackage.HelloRemote"); 
    System.out.println(z.sayHello("NGA")); 
} catch (NamingException ne) { 
    System.out.println(ne); 
    throw new RuntimeException(ne); 
} 

Pro_EJBModule1はEJBプロジェクトの名前です。

0

デプロイされたクライアントではなく、スタンドアロンのクライアントを占める関連する回答はthis answer as wellにあります。