'OpenEJB'에 해당되는 글 5

  1. 2011.12.08 [정리] Build, deploy, and test EJB components in just a few seconds
  2. 2011.12.06 EJB Test with EJBContainer of OpenEJB
  3. 2011.12.06 OpenEJB - Apache TomEE
  4. 2011.12.06 OpenEJB - Hello world
  5. 2009.06.13 Developing an Application Client to access EJB - Geronimo Tutorial

[정리] Build, deploy, and test EJB components in just a few seconds

- http://www.javaworld.com/javaworld/jw-06-2005/jw-0613-ejb.html

EJB 개발은 시간이 많이 걸리고 단위테스트도 쉽지 않다.
EJB 컨테이너에 배포해야만 실행시킬수 있는데 복잡하고 시간이 걸린다.

컨테이너에서 테스트를 돌리지 않고 테스트에서 컨테이너를 돌리자.

OpenEJB는 가볍고 EJB 명세를 잘 따른다. 기능에 충실하다.
OpenEJB, EJB 컴포넌트, JUnit테스트가 같은 JVM에서 돌아간다.

개발시에서는 내장 OpenEJB를 사용해서 빠르고 쉽게 테스트하고 통합테스트는 실제 사용되는 EJB 컨테이너에서 테스트하자.
=> EJB 3.1에서 제공하는 EJBContainer를 이용하면 EJB 컴포넌트를 배포하지 않고도 테스트할 수 있다.

XStream을 이용하면 테스트시 반복되는 입력을 XML로 처리할 수 있다.
=> XStream은 유용할거 같은데 반복되는 데이터를 자동으로 처리하는 방법은 좋은 방법이 더 많으니깐...

EJB Test with EJBContainer of OpenEJB

- http://openejb.apache.org/examples-trunk/simple-stateless/README.html


- OpenEJB 4.0.0-beta-1 사용
모든 라이브러리를 포함시킨다.[각주:1]
package org.superbiz.stateless.basic;

import javax.ejb.Stateless;

@Stateless
public class CalculatorBean {

    public int add(int a, int b) {
        return a + b;
    }
    ...

EJB 3.1에서 제공하는 EJBContainer를 이용해서 테스트한다. 
package org.superbiz.stateless.basic;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;

import javax.ejb.embeddable.EJBContainer;

import org.junit.Before;
import org.junit.Test;

public class CalculatorTest {

    private CalculatorBean calculator;

    /**
     * Bootstrap the Embedded EJB Container
     *
     * @throws Exception
     */
    @Before public void setUp() throws Exception {

        EJBContainer ejbContainer = EJBContainer.createEJBContainer();
        Object object = ejbContainer.getContext().lookup("java:global/PROJECT_NAME/CalculatorBean");
        assertTrue(object instanceof CalculatorBean);
        calculator = (CalculatorBean) object;
    }

    /**
     * Test Add method
     */
    @Test public void testAdd() {

        assertEquals(10, calculator.add(4, 6));
    }
    ...

- EJBContainer를 BeforeClass에서 하는게 좋을듯. 속도차이가 10배 정도 차이가 난다.
  1. 의존 관계가 복잡하므로 이렇게 하는게 정신건강에 이롭다. [본문으로]

OpenEJB - Apache TomEE

- 예전에 Tomcat에서 EJB를 구동시키려고 찾다가 OpenEJB를 알게 되었는데 Apache TomEE[각주:1]라는 이름으로 발전해 나가려고 하는거 같다.

- Apache TomEE Plus
Tomcat + OpenEJB인듯.


- Apache Tomcat Drop-in wars
예전의 OpenEJB war인듯.


- Apache OpenEJB Standalone Server
OpenEJB

  1. 이름 하나는 정말 잘 짓는다. [본문으로]

OpenEJB - Hello world

- http://openejb.apache.org/hello-world.html


openejb-3.1.4_hello> set OPENEJB_HOME=D:/java/openejb/openejb-3.1.4
openejb-3.1.4_hello> set JAVA_HOME=C:\Program Files\Java\jdk1.6.0_26
openejb-3.1.4_hello> set path=%path%;%openejb_home%/bin;%java_home%/bin

package org.acme;

import javax.ejb.Remote;

@Remote
public interface Hello{
	public String sayHello();
}
package org.acme;

import javax.ejb.Stateless;

@Stateless
public class HelloBean implements Hello{
    public String sayHello(){
        return "Hello World!!!!";
    }
} 
openejb-3.1.4_hello> javac -cp %OPENEJB_HOME%/lib/javaee-api-5.0-3.jar -d . *.java
openejb-3.1.4_hello> jar cvf hello.jar org
추가된 manifest
추가 중: org/(내부 = 0) (외부= 0)(0%가 저장되었습니다.)
추가 중: org/acme/(내부 = 0) (외부= 0)(0%가 저장되었습니다.)
추가 중: org/acme/Hello.class(내부 = 203) (외부= 168)(17%가 감소되었습니다.)
추가 중: org/acme/HelloBean.class(내부 = 383) (외부= 274)(28%가 감소되었습니다.)
package org.acme;

import java.util.Properties;
import javax.naming.InitialContext;
import javax.naming.Context;
import javax.rmi.PortableRemoteObject;

public class HelloClient{
	public static void main(String[] args) throws Exception{ 
		Properties props = new Properties();
		props.put(Context.INITIAL_CONTEXT_FACTORY,"org.apache.openejb.client.RemoteInitialContextFactory"); 
		props.put(Context.PROVIDER_URL,"ejbd://127.0.0.1:4201"); 
		Context ctx = new InitialContext(props); 
		Object ref = ctx.lookup("HelloBeanRemote"); 

		Hello h = (Hello)PortableRemoteObject.narrow(ref,Hello.class); 
		String result = h.sayHello(); 
		System.out.println(result); 
	}
}
openejb-3.1.4_hello> javac -d . HelloClient.java

openejb-3.1.4_hello> start %OPENEJB_HOME%/bin/openejb start
Apache OpenEJB 3.1.4    build: 20101112-03:32
http://openejb.apache.org/
log4j:WARN No appenders could be found for logger (org.apache.openejb.resource.activemq.ActiveMQResourceAdapter).
log4j:WARN Please initialize the log4j system properly.
[init] OpenEJB Remote Server
  ** Starting Services **
  NAME                 IP              PORT
  httpejbd             127.0.0.1       4204
  admin thread         127.0.0.1       4200
  ejbd                 127.0.0.1       4201
  ejbd                 127.0.0.1       4203
  hsql                 127.0.0.1       9001
  telnet               127.0.0.1       4202
-------
Ready!

openejb-3.1.4_hello> %OPENEJB_HOME%/bin/openejb deploy hello.jar
Application deployed successfully at "hello.jar"
App(id=D:\resources\programs\java\openejb\openejb-3.1.4\apps\hello.jar)
    EjbJar(id=hello.jar, path=D:\resources\programs\java\openejb\openejb-3.1.4\apps\hello.jar)
        Ejb(ejb-name=HelloBean, id=HelloBean)
            Jndi(name=HelloBeanRemote)

openejb-3.1.4_hello> java -cp %OPENEJB_HOME%/lib/openejb-client-3.1.4.jar;%OPENEJB_HOME%/lib/javaee-api-5.0-3.jar;. org.acme.HelloClient
Hello World!!!!

Developing an Application Client to access EJB - Geronimo Tutorial

- Developing an Application Client to access EJB

1. openejb-jar.xml 그대로 사용

2. Lookup
3. 라이브러리 추가
Add External JARs : <GERONIMO_HOME>\repository\org\apache\openejb\openejb-client\3.0.1\openejb-client-3.0.1.jar

4. SimpleEJB.jar 로 만들어서 Geronimo Console에서 배치하지 않고 그냥 서버 실행
Geronimo Console - Applications - EJB JARs 에서 등록된 것을 확인할 수 있다.

5. 로그 확인
2009-06-13 14:55:56,859 INFO  [startup] Jndi(name=CountryCapitalBeanRemote) --> Ejb(deployment-id=SimpleEJB/CountryCapitalBean)