BLOG ARTICLE HelloWorld EJB | 1 ARTICLE FOUND

  1. 2008/08/29 JBoss HelloWorld EJB - Stateless

사용자 삽입 이미지
JBoss 시작한지 석달이 지났는데 HelloWorld, 즉 Echo EJB를 이제서야 작성해 보았습니다. 아~ 이 게으름!

여기서의 Test는 EJB Coding Style은 2.1로 그리고 deploy descriptor는 3.0으로 구성하여 EJB3 Container에 deploy했기 때문에 클라이언트에서는 context lookup시 remote interface가 바로 날아오는 특징을 가지고 있습니다.

1. 먼저 Home Interface를 작성합니다.

package com.jboss.ejb.example.echo;

import java.rmi.RemoteException;

import javax.ejb.CreateException;
import javax.ejb.EJBHome;

public interface EchoHome extends EJBHome {
 public Echo create() throws RemoteException, CreateException;
}


2. Remote Interface를 작성합니다.

package com.jboss.ejb.example.echo;

import java.rmi.RemoteException;

import javax.ejb.EJBObject;

public interface Echo extends EJBObject {
 public String sayEcho(String name) throws RemoteException;
}


3. Enterprise Bean 클래스를 작성합니다.

package com.jboss.ejb.example.echo;

import javax.ejb.SessionBean;
import javax.ejb.SessionContext;

public class EchoEJB implements SessionBean {
 public EchoEJB() {
  System.out.println("EchoEJB() method");
 }
 
 //Buseness Method
 public String sayEcho(String name) {
    // System.out.println(name + " enter this server");
    System.out.println("Call EJB!!");
  return "Hi... "+name+"!!!";
 }
 
 //callback method
 public void ejbCreate() {
  System.out.println("ejbCreate() method");
 }

 public void ejbRemove() {
  System.out.println("ejbRemove() method");
 }

 public void ejbActivate() {
  System.out.println("ejbActivate() method");
 }

 public void ejbPassivate() {
  System.out.println("ejbPassivate() method");
 }

 public void setSessionContext(SessionContext sc) {
  System.out.println("setSessionContext() method");
 }
};

4. Deployment Descript를 작성합니다.
4.1 ejb-jar.xml

<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar version="3.0" xmlns="
http://java.sun.com/xml/ns/javaee"
 xmlns:xsi="
http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="
http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd">
 <description>Simple Echo EJB</description>
 <display-name>echo-stateless</display-name>
 <enterprise-beans>
  <session>
   <display-name>EchoEJB</display-name>
   <ejb-name>EchoEJB</ejb-name>
   <home>com.jboss.ejb.example.echo.EchoHome</home>
   <remote>com.jboss.ejb.example.echo.Echo</remote>
   <ejb-class>com.jboss.ejb.example.echo.EchoEJB</ejb-class>
   <session-type>Stateless</session-type>
   <transaction-type>Container</transaction-type>
  </session>
 </enterprise-beans>
 <assembly-descriptor>
   <container-transaction>
        <method>
          <ejb-name>EchoEJB</ejb-name>
          <method-name>*</method-name>
        </method>
        <trans-attribute>NotSupported</trans-attribute>
     </container-transaction>
 </assembly-descriptor>
</ejb-jar>

4.2 jboss.xml

<?xml version="1.0"?>

<jboss xmlns="http://java.sun.com/xml/ns/javaee"
 xmlns:xsi="
http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="
http://java.sun.com/xml/ns/javaee
                            http://www.jboss.org/j2ee/schema/jboss_5_0.xsd"
 version="3.0">
 <enterprise-beans>
  <session>
   <ejb-name>EchoEJB</ejb-name>
   <jndi-name>com.jboss.ejb.example.Hello</jndi-name>
  </session>
 </enterprise-beans>
</jboss>

5. 클라이언트 애플리케이션을 작성합니다.

package com.jboss.ejb.example.echo.client;

import java.util.Hashtable;

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

import com.jboss.ejb.example.echo.Echo;

public class EchoClient {
 public static void main(String[] args) {
  try {

   Hashtable<Object, String> env = new Hashtable<Object, String>();

   env.put(Context.INITIAL_CONTEXT_FACTORY,
     "org.jnp.interfaces.NamingContextFactory");
   env.put(Context.PROVIDER_URL, "localhost:1099");

   Context ctx = new InitialContext(env);
   System.out.println("<<< Before Lookup >>>");

   Echo echo = (Echo)ctx.lookup("com.jboss.ejb.example.Hello");
   System.out.println("<<< After Lookup >>>");


   System.out.println(echo.sayEcho("Ji-Woong Choi"));

   echo.remove();
  } catch (Exception e) {
   e.printStackTrace();
  }
 }
}


 



6. Test를 진행합니다.

Project에 사용한 ant build파일은 다음과 같습니다.

<project name="ejb-basic-statelessSession" default="all" basedir=".">

 <!-- set global properties for this build -->
 <property environment="env" />
 <property name="src.dir" value="ejbModule" />
 <property name="build.dir" value="build" />
 <property name="jboss.home" value="/home/jboss/jboss-4.2.3.GA" />
 <property name="server.name" value="default" />
 <property name="app.name" value="hello-ejb" />

 <property name="jboss.server.dir"
  value="${jboss.home}/server/${server.name}" />

 <!-- Classpath Declaration -->
 <path id="compile.classpath">
  <!--
   <fileset dir="${lib.dir}">
   <include name="**/*.jar"/>
   </fileset>
  -->
  <fileset dir="${jboss.server.dir}/lib">
   <include name="**/*.jar" />
  </fileset>
  <pathelement location="${client.jar}" />
 </path>


 <target name="all" depends="clean, init, compile.ejb, jar.ejb, deploy" />

 <target name="init">
  <!-- Create the time stamp -->
  <tstamp />
  <!-- Create the build directory structure used by compile
   and copy the deployment descriptors into it-->
  <mkdir dir="${build.dir}" />
  <mkdir dir="${build.dir}/META-INF" />
  <copy todir="${build.dir}/META-INF">
   <fileset dir="xml">
    <include name="*.xml" />
    <exclude name="build.xml" />
   </fileset>
  </copy>
 </target>


 <!-- Compile ejb classes into the build directory (jar preparation) -->
 <target name="compile.ejb">
  <echo>compile.classpath</echo>
  <javac srcdir="${src.dir}" destdir="${build.dir}"
   classpathref="compile.classpath" />
 </target>

 <!-- Make a standard ejb jar file, including XML deployment descriptors -->
 <target name="jar.ejb" depends="compile.ejb">
  <jar jarfile="${app.name}.jar" basedir="${build.dir}"></jar>
 </target>

 <target name="clean">
  <delete file="./${app.name}.jar" />
  <delete dir="${build.dir}" />
 </target>
 
 <target name="deploy" depends="jar.ejb">
  <copy todir="${jboss.server.dir}/deploy">
   <fileset dir=".">
    <include name="${app.name}.jar" />
   </fileset>
  </copy>
 </target>

 <taskdef name="jmx" classname="org.jboss.ant.JMX">
  <classpath>
   <pathelement path="${jboss.home}/client/jbossjmx-ant.jar" />
   <pathelement
    path="${jboss.home}/client/jbossall-client.jar" />
  </classpath>
 </taskdef>
 
 <target name="redeploy-war">
  <echo message="Redeploy : file:/${war.path}" />
  <jmx>
   <invoke target="jboss.system:service=MainDeployer" operation="redeploy">
    <parameter type="java.lang.String" arg="file:/${war.path}" />
   </invoke>
  </jmx>
 </target>

</project>



Deploy는 jboss home 디렉토리 밑의 server/default로 테스트 서버를 잡고 복사하면 자동으로 디플로이되어지며 다음과 같은 메시지가 나오면 정상입니다.

17:45:59,781 INFO  [JmxKernelAbstraction] creating wrapper delegate for: org.jboss.ejb3.stateless.StatelessContainer
17:45:59,781 INFO  [JmxKernelAbstraction] installing MBean: jboss.j2ee:jar=hello-ejb.jar,name=EchoEJB,service=EJB3 with dependencies:
17:45:59,789 INFO  [EJBContainer] STARTED EJB: com.jboss.ejb.example.echo.EchoEJB ejbName: EchoEJB
17:45:59,803 INFO  [EJB3Deployer] Deployed: file:/home/jboss/jboss-4.2.3.GA/server/default/deploy/hello-ejb.jar
17:51:25,201 INFO  [STDOUT] EchoEJB() method
17:51:25,213 INFO  [STDOUT] setSessionContext() method
17:51:25,217 INFO  [STDOUT] ejbCreate() method
17:51:25,225 INFO  [STDOUT] Call EJB!!


[첨부자료]
Echo Stateless Session Bean Project sample :
크리에이티브 커먼즈 라이센스
Creative Commons License
2008/08/29 10:24 2008/08/29 10:24