jboss4.x下的第一个ejb2.0程序(2)---使用log4j的无状态sessionBean

增加log4j...
 
首先将Hello.java改成:
package com.rox;
import java.rmi.RemoteException;
import javax.ejb.EJBException;
import javax.ejb.SessionBean;
import javax.ejb.SessionContext;
import org.apache.log4j.Logger;
 
/**
 * XDoclet-based session bean.  The class must be declared
 * public according to the EJB specification.
 *
 * To generate the EJB related files to this EJB:
 *  - Add Standard EJB module to XDoclet project properties
 *  - Customize XDoclet configuration for your appserver
 *  - Run XDoclet
 *
 * Below are the xdoclet-related tags needed for this EJB.
 *
 * @ejb.bean name="Hello"
 *           display-name="Name for Hello"
 *           description="Description for Hello"
 *           jndi-name="ejb/Hello"
 *           type="Stateless"
 *           view-type="remote"
 */
public class Hello implements SessionBean {
    /** The session context */
    private SessionContext context;
    private  final Logger log = Logger.getLogger(Hello.class);
    public Hello() {
        super();
        // TODO Auto-generated constructor stub
    }
    /**
     * Set the associated session context. The container calls this method
     * after the instance creation.
     *
     * The enterprise bean instance should store the reference to the context
     * object in an instance variable.
     *
     * This method is called with no transaction context.
     *
     * @throws EJBException Thrown if method fails due to system-level error.
     */
    public void setSessionContext(SessionContext newContext)
        throws EJBException {
        context = newContext;
        log.info("setSessionContext");
    }
    public void ejbCreate() throws EJBException, RemoteException {
        // TODO Auto-generated method stub
        log.info("ejb create");
    }
    public void ejbRemove() throws EJBException, RemoteException {
        // TODO Auto-generated method stub
        log.info("ejb remove");
    }
    public void ejbActivate() throws EJBException, RemoteException {
        // TODO Auto-generated method stub
        log.info("ejb activate");
    }
    public void ejbPassivate() throws EJBException, RemoteException {
        // TODO Auto-generated method stub
        log.info("ejb passivate");
    }
    /**
     * An example business method
     *
     * @ejb.interface-method view-type = "remote"
     *
     * @throws EJBException Thrown if method fails due to system-level error.
     */
    public String sayIt() throws EJBException {
        log.info("hello didi");
        return "hello didi.";
    }
}
 
  上面org.apache.log4j.Logger类继承自org.apache.log4j.Category类,log4j有三个重要的组件:categories, appenders和layouts.categories有各种方法来发送日志信息,可以将日志信息发送到控制台,文件,socket....,而这些终端就被称为appenders,可以理解为往内容中"append"的意思,layouts就是日志信息的格式,例如HTMLLayout就是html的格式.
  log4j输出日志是分级别(priority)的: debug,info,warn,error,fatal.这五个级别的等级由低到高,即如果配置文件的日志级别设置为debug时,所有log信息都会输出;而如果设置为fatal时只有fatal信息会输出,并且程序会终止运行.
  当运行EjbTest类时,会在控制台打印出:
11:43:00,587 INFO  [Hello] setSessionContext
11:43:00,587 INFO  [Hello] ejb create
11:43:00,603 INFO  [Hello] hello didi
 
1.从输出信息也可以看出无状态bean的回调方法(容器调用的方法)中,ejbActivate,ejbPassivate是不会被调用的.
2.如果再次调用EjbTest,控制台中只会输出
11:43:00,603 INFO  [Hello] hello didi
这说明jboss直接从缓存中取出已经实例化的ejb对象,而不是重新实例化.
3.如果将Hello.jar从deploy中移出,控制台将会输出ejb remove的信息.
如果要更改日志的输出级别,请更改jboss中deploy同级的conf目录中的log4j.xml.找到如下语句:
   <appender class="org.apache.log4j.ConsoleAppender" name="CONSOLE"></appender>
      <errorhandler class="org.jboss.logging.util.OnlyOnceErrorHandler"></errorhandler>
     
      INFO
"/>
      <layout class="org.apache.log4j.PatternLayout"></layout>
         <!---->
         %d{ABSOLUTE}
%-5p [%c{1}] %m%n"/>
     
  
将红色的INFO替换成其他的级别即可,jboss过几秒钟就会自动侦测到log4j.xml的变化,自动进行配置.
如果要改变日志输出的样式,可以改变以上内容中的兰色部分,假如去掉%-5p,你将会发现日志输出中将没有日志级别的信息.
 
 
   好了,到此日志输出部分划上句号,下一步将研究配合entiyBean使用.

你可能感兴趣的:(apache,log4j,bean,jboss,ejb)