1

私は先週、いくつかのCorbaMarshallingExceptionsで苦労しました。あるGlassfishWebアプリは、同じマシン、同じドメイン、同じEAR上の別のWebアプリケーションからデータを取得しようとしていました。StackOverflowで正しい答えを見つけました。1つのオブジェクトがシリアル化できませんでした。この小さな問題を修正した後、glassfishサーバーはしばらくの間stを実行するのに非常に忙しくなりました。私の疑惑は、それが非常に大きなオブジェクトをシリアル化しているということでした。したがって、あるアプリから別のアプリに転送される「ポインタ」はごくわずかであるという私の考えは間違っているようです。構造全体をコピーします。

私の質問は今です。「あるアプリから別のアプリにejbインジェクションを行うのは賢いですか?」オブジェクトを小さく(「一時的」など)保つと、十分に速く動作すると思います。しかし、一部のデータを読み取るために、他のアプリの他のオブジェクトにのみアクセスすることはできませんか?

助けてくれてありがとう。

4

1 に答える 1

3

あなたがやりたいことは間違いなく可能です。いくつかの用語の説明。

あなたが持っているのは、Beanのリモートインターフェースを使用したモジュール間EJBインジェクションです。

必要なのは、Beanのローカルインターフェースを使用したモジュール間EJBインジェクションです。

したがって、用語に関するいくつかの説明:

アプリケーションとモジュール

2つのWARファイルが同じEARにある場合、仕様に関しては、1つのアプリケーションと2つのモジュールがあります。

他のすべての状況(2つのEAR、EARにないWAR)では、アプリケーションからアプリケーションへの移行があり、それを処理するのははるかに困難です。

重要なのは、EARが親になる1つのクラスローダーを作成し、各WARがEARの子クラスローダーになることです。そのため、WARファイルは互いのクラスを見ることができませんが、EAR内の共有クラスを見ることができます。ここに私たちのソリューションがあります-それについてはもう少し詳しく説明します。

リモートとローカルの参照

リモート参照は値渡しです(データのコピーを取得します)ローカル参照は参照渡しです(あなたが言うように「ポインター」)

どちらの場合も同じ注釈@EJBが使用されており、どちらを使用しているかを判断する方法がないことに注意してください。BeanクラスまたはBeanのインターフェースのいずれかを介して@Remote、またはその上で公開する参照の種類を決定するのは、Bean自体だけです。@Local

解決

EARがあるので、Bean(EJB)をwarファイルから移動して、WARファイルの隣のEARファイルのルートに配置されている共有jarに移動することができます。これを機能させるには、WARファイルからBeanクラスとそのインターフェースも削除する必要があります。

次に@Remote、Beanのインターフェースをに変更できます@Local

これを行うと、参照渡しのセマンティクスが得られ、2つのWARファイルはCORBAなどの重いものなしでデータを共有できます。それらは、Javaでオブジェクトが渡されるのと同じ方法でJavaオブジェクトを渡すだけです。

アプリケーションからアプリケーションへの状況が本当にあった場合は、実際に値渡しのセマンティクスを使用する必要がありますが、@Remoteこれはもちろん何倍も遅くなります。

このEJBを他のアプリケーション(サーバーの外部や他のEARなど)にも公開している場合でも、注釈付きのBeanに2番目のインターフェースを追加することで公開できます@Remote。単一のEJBが、RESTサービスビューだけでなく、インターフェイス(または仕様でビューと呼んでいるビュー)を公開@Localおよびインターフェースすることは可能であり、簡単です。@Remote@WebService

于 2012-07-01T20:39:13.690 に答える