アノテーションを使って定義をするEJB3.0はWildFlyで普通に動かせたのですが、悪しき旧式として悪名高く誰も情報を載せてくれないEJB2.1を動かすのに苦労したので経緯を簡単に。
やりながら書いたのではなく、やった結果を思い出しながら書いてるので抜けがあるかも。。ご容赦を。
(しかし、やってみて思ったけどEJB2とEJB3はもはや別物ですね)
WildFlyをインストール
WildFly Download
とりあえずwildfly-8.0.0.Finalを落としてきて使ってみることにし、バイナリを適当なフォルダに展開しておきます。
Eclipseをインストール
これも適当に、自分は「eclipse-jee-luna-SR2-win32-x86_64.zip」を利用。
JBoss ToolをEclipseにインストール
Eclipseを起動し、
[Help]-[Eclipse Marketplace]を起動し、Find: に「JBoss」と入力。
JBoss Tool(Luna) 4.2.3.Finalをインストールしました。
社内プロキシに引っかかりまくって苦労しましたがそれはまた別のお話し。
インタフェースの作成
EJBHomeを継承したHomeインタフェースと、EJBObjectを継承したRemoteインタフェースを作成します。
public interface XXEJBHome extends EJBHome { public XXEJBRemote create() throws RemoteException, CreateException; }
public interface XXEJBRemote extends EJBObject { public String process(String message) throws RemoteException; }
これをまとめてjarにします。
リモートEJBの作成
呼び出されるリモートEJBを作成します。新規のmavenプロジェクトを作成します。
archetypeにjavaee7-essentials-archetypeのVersion1.4を選択しました。
下記の実装クラスを追加。
public class XXEJBRemoteImpl implements SessionBean{ private static final long serialVersionUID = 1L; public XXEJBRemoteImpl() throws Exception{ } public String process(String message){ return "test"; } public void ejbCreate() {} public void ejbRemove() {} public void ejbActivate() {} public void ejbPassivate() {} public void setSessionContext(SessionContext sc) {} }
ejb-jar.xmlを作成
EJB3.0ならアノテーションで済む話をわざわざXMLに記述します。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN" "http://java.sun.com/dtd/ejb-jar_2_0.dtd"> <ejb-jar> <enterprise-beans> <session> <ejb-name>XXEJB</ejb-name> <home>test.ejb.XXEJBRemoteHome</home> <remote>test.ejb.XXEJBRemote</remote> <ejb-class>test.ejb.XXEJBRemoteImpl</ejb-class> <session-type>Stateless</session-type> <transaction-type>Container</transaction-type> </session> </enterprise-beans> <assembly-descriptor> <container-transaction> <method> <ejb-name>XXEJB</ejb-name> <method-name>*</method-name> </method> <trans-attribute>Required</trans-attribute> </container-transaction> </assembly-descriptor> </ejb-jar>
WildFlyへデプロイ
EclipseのServersパースペクティブからWildFlyのサーバを追加し、先ほど作成したリモートEJBのプロジェクトを右クリックメニューの[Add and Remove]から追加します。
このまま起動できることを確認します。
とりあえず起動はできますが、EJBがデプロイされません。
そこで、先ほど作ったejb-jar.xmlと、インタフェースを含んだjarを手でデプロイします。warに入れるよう設定すればこの手順は不要ですが。
「C:\tools\wildfly-8.0.0.Final\standalone\deployments\XXEJBRemote.war\WEB-INF」にejb-jar.xml
「C:\tools\wildfly-8.0.0.Final\standalone\deployments\XXEJBRemote.war\WEB-INF\lib」にinterface.jar
をそれぞれ配置。
で、このまま起動してもうまくいかない罠があります。
ServersからWildFlyを右クリックメニューから「Show」を選択して、OverviewからRuntime Environmentを開き、
Configuration fileを「standalone.xml」から「standalone-full.xml」に変更します。
ここまで終えて起動させると、下記のようなログが出てデプロイされたことが分かります。
15:28:05,109 INFO [org.jboss.as.ejb3.deployment.processors.EjbJndiBindingsDeploymentUnitProcessor] (MSC service thread 1-6) JNDI bindings for session bean named XXEJB in deployment unit deployment “XXEJBRemote.war” are as follows:
java:global/XXEJBRemote/XXEJB!test.ejb.XXEJBRemoteHome
java:app/XXEJBRemote/XXEJB!test.ejb.XXEJBRemoteHome
java:module/XXEJB!test.ejb.XXEJBRemoteHome
java:jboss/exported/XXEJBRemote/XXEJB!test.ejb.XXEJBRemoteHome
java:global/XXEJBRemote/XXEJB!test.ejb.XXEJBRemote
java:app/XXEJBRemote/XXEJB!test.ejb.XXEJBRemote
java:module/XXEJB!test.ejb.XXEJBRemote
java:jboss/exported/XXEJBRemote/XXEJB!test.ejb.XXEJBRemote
リモート呼び出しする
呼び出しはHomeを取得してRemoteEJBをcreateする。
XXEJBRemoteHome home = (XXEJBRemoteHome)javax.rmi.PortableRemoteObject.narrow(c.lookup("ejb:/XXEJBRemote/XXEJB!test.ejb.XXEJBRemoteHome"), XXEJBRemoteHome.class); XXEJBRemote remote = (XXEJBRemote)home.create(); String response = remote.process(""); System.out.println(" response = " + response);
下記の参考URLにもあるが、jndiを「ejb:」にしないと動かない。
実行すると
response = test
やっと動いた。
[参考URL]
EJB 2 on Jboss 7.1 example
JBoss AS 7.1.0 で EJB 2.x を動かす
JaiswalTraining
別プロセスからリモートEJBを呼び出してみる