JBoss Start Script

JBoss AS 2008/09/04 07:55

---> jboss.env.sh

#!/bin/sh
# jboss-env.sh - starts a new shell with instance variables set
export JBOSS_HOME=/home/jboss/jboss-eap-4.3/jboss-as
export JAVA_HOME=/opt/java1.5
export PATH=$JAVA_HOME/bin:$JBOSS_HOME/bin:$PATH
echo "Runtime shell executed..."
#$SHELL




---> Start Script

#!/bin/sh
. ./jboss-env.sh
###########################################
RUNNER=`whoami`

if [ $RUNNER != "jboss" ] ;
   then echo "Deny Access : [ $RUNNER ]. Not jboss" ;
   exit 0 ;
fi

echo "###########################################"
echo "JBoss has been gone by [ $RUNNER ]"
echo "###########################################"
echo ""
echo ""

###########################################
export SERVERNAME=YOUR_SERVER

DATE=`date +%Y%m%d%H%M%S`
mv nohupA.out ./log/nohupA.out$DATE

export MEM_ARGS="-Xverbosegc:file=/home/jboss/domains/bizdomain/log/server_gc.log.$DATE"

nohup $JBOSS_HOME/bin/run.sh -Djboss.server.base.dir=/home/jboss/domains -Djboss.server.base.url=file:///home/jboss/domains -c bizdomain -b 0.0.0.0 >> nohupA.out &
tail -f nohupA.out


--> Stop Script

#!/bin/sh
. ./jboss-env.sh
###########################################
RUNNER=`whoami`

if [ $RUNNER != "jboss" ] ;
   then echo "Deny Access : [ $RUNNER ]. Not jboss" ;
   exit 0 ;
fi

echo "###########################################"
echo "JBoss has been gone by [ $RUNNER ]"
echo "###########################################"
echo ""
echo ""

###########################################

$JBOSS_HOME/bin/shutdown.sh -S -s 127.7.0.1:1099 -u admin -p admin

sleep 2

tail -f ./nohupA.out

크리에이티브 커먼즈 라이센스
Creative Commons License
2008/09/04 07:55 2008/09/04 07:55

사용자 삽입 이미지
팁코 랑데뷰같은 시스템을 사용하시다가 JMS Messaging을 이용할 경우 sync방식의 처리가 애매하다고 생각하실 수 있는 데 아래와 같은 방식으로 request-reploy 방식을 구성하여 사용할 수 있습니다. 고객사 요청으로 답변해 드린 내용입니다.

/* Message Session and Message create */
m.setText(request);
m.setJMSReplyTo(replyQueue);
myId = /* generate a unique id */
m.setJMSCorrelationID(myId)

/* send the JMS message */
QueueReceiver receiver = qsession.createReceiver(replyQueue, "JMSCorrelationID = '"+myId+"'");

Then at the other end you do this:

reply.setJMSCorrelationID(request.getJMSCorrelationID());
/* send the JMS reply message */

위의 unique ID는 UUID generator 같은 것을 이용하여 고유의 아이디를 만드세요. 특정한 Web Application Server에 따라 단순히 m.getMessageID() 해서는 엔진이 메시지 ID를 다시 생성해서 correlationID로 교체해버리는 경우가 있습니다.
크리에이티브 커먼즈 라이센스
Creative Commons License
2008/09/01 16:55 2008/09/01 16:55

사용자 삽입 이미지
ZDNet에 연재되고 있는 수퍼 개발자의 길이란 글을 읽어보았습니다. 개발자들에게 무언가 공감할 수 있는 글을 기존의 이름있는 자바 개발자로부터 기고를 받아 연재하는 것이네요. 저는 수퍼 개발자같은 건 꿈꾸지도 않아서인지 내용들이 그렇게 재미있지는 않지만 한 번 읽어봄이 좋을 듯 합니다.

나름 기고자들이 일하고 있는 영역에 대한 부분에서의 수퍼 개발자를 이야기하고 있습니다. 자바를 주로 이야기하다보니 항상 들어오던 친근한 이름들이 거론되었네요. 하지만 기고들의 말미에서는 본인들이 하고 있는 사업이나 프로젝트에 대한 내용도 포함되어 있어 왜 기고에 이것을 선전해야 하나라는 의구심도 생겼었습니다. A회사 소속인들의 기고면 A회사 프로젝트가 나오는 그런 것들이지요.

방도는 없습니다. 실천 의지와 기초에 기반을 둔 실력 쌓기, 그리고 뛰어난 커뮤니티 활동 등이 수퍼라는 이름을 달기 위한 과정이 아닐까 합니다. 또한 가정을 소홀히 할 수밖에 없을 지도 모르죠. 두 마리 토끼를 다 잡는다는 것은 국내에서 이희승씨같은 full time 오픈 소스 개발자 정도가 되면 할 수 있겠네요.

크리에이티브 커먼즈 라이센스
Creative Commons License
2008/09/01 13:17 2008/09/01 13:17

사용자 삽입 이미지
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

오늘 메일링 리스트에 이런게 올라왔네요.
접영 부분은 상당히 미심쩍은 부분이 많습니다. 2MB가 하던 방식을 5MB(오메가)가 썼던 게 아닐까 하는 생각이 듭니다.

사용자 삽입 이미지

크리에이티브 커먼즈 라이센스
Creative Commons License
2008/08/28 09:31 2008/08/28 09:31