2017-04-25 1 views
0

以前はEJBを使用しましたが、実際の動作を理解していることを再確認したいと思います。リモートスタンドアロンクライアントを使用してEJB 3.1セッションBeanを呼び出す

私はシンプルセッションBean EJB(3.1)を作成し、これを.ear(クライアントジャーも同様に)としてパッケージ化しました。下記の抜粋です:

セッションBeanの実装:

package com.example; 
import javax.ejb.Stateless; 

    @Stateless 
    public class FirstSessionEJB implements FirstSessionEJBRemote { 

    public FirstSessionEJB() { 

    } 

    @Override 
    public String print() { 

     return "Hello"; 
    } 
} 

リモートインターフェース:

package com.example; 

import javax.ejb.Remote; 

@Remote 
public interface FirstSessionEJBRemote { 
    public String print(); 
} 

私はの.earとしてこのEJBを展開し、それが正常にWildfly 10.xに配備されました。

ここでは、別のJVMで実行されるスタンドアロンのJavaクライアントを使用してアクセスしたいと考えています。

ここにクライアントコードがあります(主にJNDIのために呼び出す方法がわからないため、完了しない可能性があります)。

package com.example.main; 

import java.util.Hashtable; 

import javax.naming.Context; 
import javax.naming.InitialContext; 
import javax.naming.NamingException; 

import com.example.FirstSessionEJBRemote; 

public class Main { 

    public static void main(String[] args) throws NamingException { 

     String GLOBAL_JNDI_NAME="java:global/FirstEJBProjEAR/FirstEJBProj/FirstSessionEJB!com.example.FirstSessionEJBRemote"; 

     Hashtable<String,String> jndiProperties = new Hashtable<>(); 
     jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming"); 

     InitialContext ic = new InitialContext(jndiProperties); 

     FirstSessionEJBRemote ejbRemote = null; 
     ejbRemote = (FirstSessionEJBRemote)ic.lookup(GLOBAL_JNDI_NAME); 
     ejbRemote.print(); 
    } 
} 

は、私が(しかし、それは動作していない、すべてのパラメータが中に使用するとどのような。)JNDIルックアップを行う方法についてthisリンクと呼ば

をリンクでは、それはWildfly特定を持っていることを述べていますJNDIルックアップなしで動作するjar

1)すべてのプロパティは、私はJNDIルックアップのために設定する必要がありますどのような:

誰も私が理解するのに役立つことはできますか?

2)クライアントサイドアプリケーションに存在する必要がある特定のjarファイルはありますか?

特定のWildflyジャーを使用したくない、つまり伝統的なJNDIルックアップを使用したいと思っています。

シンプルな「Hello world」のEJBを書くのは難しいです。私はいくつかの本はうまくいきますが、JNDIとJarファイルを含めるためには、すべてのプロパティを含める必要があることを実際には伝えずに、単に "参照"コードを提供しています。

答えて

2

記事にはテキストの山に隠されていますが、Wildbirdサーバーのインストール(bin/client/jboss-client.jar)にあるjboss-client.jarが必要です。 ;クライアントのランタイムクラスパス上にある必要があります。あなたのコードで参照されているorg.jboss.ejb.client.namingパッケージから始まります。

jarには、クライアントがEJBリモート呼び出しをWildflyサーバーでセットアップおよび維持できる余分な魔法が含まれています.JNDIを使用するだけで、それを切断することはありません。また、すべてのコンテナ(Wildfly、Glassfish、Weblogicなど)には、クライアントライブラリ用の独自の実装が用意されています。


クライアントアプリケーションからEJBを呼び出すことは非常に古い学校であることに注意してください(読んでください:そうしたくありません)。 EJBテクノロジーのより現実的で現代的な視点は、RESTfulサービスの一環として、Webアプリケーション/戦争などのエンタープライズコンテナ自体内でEJBテクノロジーを使用することです。 EARファイルの余分なレイヤーを必要としない場合でも、すべてを1つのwarアプリケーションにきちんと組み込むことができます。

この場合、クライアントアプリケーションを使用すると、そのクライアントはRESTfulなサービス、つまりはるかに単純でクロスサーバ型のクロスプラットフォーム通信インターフェイスと通信できます。

+0

あなたの答えをありがとう、私はそのクライアントの瓶を見ました。 JNDIの必要がないということを使用している場合、そのジャーが言及しているジャーであるかどうかは疑問です。私はいくつかのクライアント側のjarファイルの必要性があることを理解しています(これは低レベルの通信を行い、異なるアプリケーションサーバーでは異なります)。しかし、リンクに記載されている瓶は、JNDIが起こることができる「標準」(もちろん、異なるASで異なる名前になる)のようなものですか?また、その例では、 "java"ではなく "ejb"を使用しているため、Wildflyに固有のものですか? – CuriousMind

+0

JavaEE標準では、コンテナがリモートインタフェースを提供する必要があるだけであり、実装するコンテナの標準を指定するものではありません。私が言及したように、それぞれは独自のインプリメンテーション・ジャー内に格納された独自のインターフェースを持っています。彼らが共有する唯一のことは、JNDIの上に構築されていることですが、これについては何も標準化されていません。 JBossの古いバージョンに接続するためにWildfly jarを使用することはできません。 – Gimby

関連する問題