`

Stateless Session Bean 示例和注意点

阅读更多

(1)定义远程接口

package examples.ejb20.basic.statelessSession;

import java.rmi.RemoteException;
import javax.ejb.EJBObject;

public interface Trader extends EJBObject {

  public  TradeResult buy (String stockSymbol, int shares)
    throws RemoteException;

  public TradeResult sell (String stockSymbol, int shares)
    throws RemoteException;
}

 

(2) 定义Home接口

package examples.ejb20.basic.statelessSession;

import java.rmi.RemoteException;
import javax.ejb.CreateException;
import javax.ejb.EJBHome;

public interface TraderHome extends EJBHome {
  Trader create() throws CreateException, RemoteException;
}

 

(3)定义EJB的实现类

 

package examples.ejb20.basic.statelessSession;

import javax.ejb.CreateException;
import javax.ejb.SessionBean;
import javax.ejb.SessionContext;
import javax.naming.InitialContext;
import javax.naming.NamingException;

public class TraderBean implements SessionBean {

  private static final boolean VERBOSE = false;
  private SessionContext ctx;
  private int tradeLimit;

  // You might also consider using WebLogic's log service
  private void log(String s) {
    if (VERBOSE) System.out.println(s);
  }

  public void ejbActivate() {
    log("ejbActivate called");
  }

  public void ejbRemove() {
    log("ejbRemove called");
  }

  public void ejbPassivate() {
    log("ejbPassivate called");
  }

  public void setSessionContext(SessionContext ctx) {
    log("setSessionContext called");
    this.ctx = ctx;
  }

  public void ejbCreate () throws CreateException {
    log("ejbCreate called");

    try {
      InitialContext ic = new InitialContext();

      Integer tl = (Integer) ic.lookup("java:/comp/env/tradeLimit");

      tradeLimit = tl.intValue();
    } catch (NamingException ne) {
      throw new CreateException("Failed to find environment value "+ne);
    }
  }

  public TradeResult buy(String stockSymbol, int shares) {

    if (shares > tradeLimit) {
      log("Attempt to buy "+shares+" is greater than limit of "+tradeLimit);
      shares = tradeLimit;
    }

    log("Buying "+shares+" shares of "+stockSymbol);

    return new TradeResult(shares, stockSymbol);
  }

  public TradeResult sell(String stockSymbol, int shares) {

    if (shares > tradeLimit) {
      log("Attempt to sell "+shares+" is greater than limit of "+tradeLimit);
      shares = tradeLimit;
    }

    log("Selling "+shares+" shares of "+stockSymbol);

    return new TradeResult(shares, stockSymbol);
  }

}

 (4) 配置文件

ejb-jar.xml

 

<?xml version="1.0"?>

<!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>statelessSession</ejb-name>
      <home>examples.ejb20.basic.statelessSession.TraderHome</home>
      <remote>examples.ejb20.basic.statelessSession.Trader</remote>
      <ejb-class>examples.ejb20.basic.statelessSession.TraderBean</ejb-class>
      <session-type>Stateless</session-type>
      <transaction-type>Container</transaction-type>
      <env-entry>
        <env-entry-name>WEBL</env-entry-name>
	<env-entry-type>java.lang.Double </env-entry-type>
	<env-entry-value>10.0</env-entry-value>
      </env-entry>
      <env-entry>
        <env-entry-name>INTL</env-entry-name>
	<env-entry-type>java.lang.Double </env-entry-type>
	<env-entry-value>15.0</env-entry-value>
      </env-entry>
      <env-entry>
        <env-entry-name>tradeLimit</env-entry-name>
	<env-entry-type>java.lang.Integer </env-entry-type>
	<env-entry-value>500</env-entry-value>
      </env-entry>
    </session>
  </enterprise-beans>
  <assembly-descriptor>
    <container-transaction>
      <method>
        <ejb-name>statelessSession</ejb-name>
	<method-name>*</method-name>
      </method>
      <trans-attribute>Required</trans-attribute>
    </container-transaction>
  </assembly-descriptor>
  <ejb-client-jar>ejb20_basic_statelessSession_client.jar</ejb-client-jar>
</ejb-jar>

 

weblogic-ejb-jar.xml

<?xml version="1.0"?>

<!DOCTYPE weblogic-ejb-jar PUBLIC 
'-//BEA Systems, Inc.//DTD WebLogic 8.1.0 EJB//EN'
'http://www.bea.com/servers/wls810/dtd/weblogic-ejb-jar.dtd'>

<weblogic-ejb-jar>
  <weblogic-enterprise-bean>
    <ejb-name>statelessSession</ejb-name>
    <enable-call-by-reference>True</enable-call-by-reference>
    <jndi-name>ejb20-statelessSession-TraderHome</jndi-name>
  </weblogic-enterprise-bean>
</weblogic-ejb-jar>

 

(5)EJB client

package examples.ejb20.basic.statelessSession;

import java.rmi.RemoteException;
import java.util.Hashtable;
import javax.ejb.CreateException;
import javax.ejb.RemoveException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.rmi.PortableRemoteObject;

public class Client
{
  private static final String JNDI_NAME = "ejb20-statelessSession-TraderHome";
  private String url;
  private TraderHome home;

  public Client(String url) throws NamingException {
    this.url = url;
    home = lookupHome();
  }

   public static void main(String[] args) throws Exception {
    log("\nBeginning statelessSession.Client...\n");
    String url       = "t3://localhost:7001";
    Client client = null;

    // Parse the argument list
     if (args.length != 1) {
      log("Usage: java examples.ejb20.basic.statelessSession.Client t3://hostname:port");
      return;
    } else {
      url = args[0];
    }

    try {
      client = new Client(url);
      client.example();
    } catch (NamingException ne) {
      log("Unable to look up the beans home: " + ne.getMessage());
      throw ne;
    } catch (Exception e) {
      log("There was an exception while creating and using the Trader.");
      log("This indicates that there was a problem communicating with the server: "+e);
      throw e;
    }

    log("\nEnd statelessSession.Client...\n");
  }

  /**
   * Runs this example.
   */
  public void example()
    throws CreateException, RemoteException, RemoveException
  {
    // create a Trader
    log("Creating a trader");
    Trader trader = (Trader) narrow(home.create(), Trader.class);

    String [] stocks = {"BEAS", "MSFT", "AMZN", "HWP" };

      // execute some buys
    for (int i=0; i<stocks.length; i++) {
      int shares = (i+1) * 100;
      log("Buying "+shares+" shares of "+stocks[i]+".");
      trader.buy(stocks[i], shares);
    }

    // execute some sells
    for (int i=0; i<stocks.length; i++) {
      int shares = (i+1) * 100;
      log("Selling "+shares+" shares of "+stocks[i]+".");
      trader.sell(stocks[i], shares);
    }

    // remove the Trader
    log("Removing the trader");
    trader.remove();
  }

  /**
   * RMI/IIOP clients should use this narrow function
   */
  private Object narrow(Object ref, Class c) {
    return PortableRemoteObject.narrow(ref, c);
  }

  /**
   * Lookup the EJBs home in the JNDI tree
   */
  private TraderHome lookupHome() throws NamingException {
    // Lookup the beans home using JNDI
    Context ctx = getInitialContext();
    try {
      Object home = ctx.lookup(JNDI_NAME);
      return (TraderHome) narrow(home, TraderHome.class);
    } catch (NamingException ne) {
      log("The client was unable to lookup the EJBHome.  Please make sure ");
      log("that you have deployed the ejb with the JNDI name "+
        JNDI_NAME+" on the WebLogic server at "+url);
      throw ne;
    }
  }

  /**
   * Using a Properties object will work on JDK 1.1.x and Java2
   * clients
   */
  private Context getInitialContext() throws NamingException {
    
    try {
      // Get an InitialContext
      Hashtable h = new Hashtable();
      h.put(Context.INITIAL_CONTEXT_FACTORY,
        "weblogic.jndi.WLInitialContextFactory");
      h.put(Context.PROVIDER_URL, url);
      return new InitialContext(h);
    } catch (NamingException ne) {
      log("We were unable to get a connection to the WebLogic server at "+url);
      log("Please make sure that the server is running.");
      throw ne;
    }
  }

  private static void log(String s) { System.out.println(s); }
  
}

 

 

 c:> java weblogic.ejbc  ...  编译ejb.jar  现在都自动完成了

 c:> java weblogic.deploy ...

 

打包成ear的配置文件application.xml

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE application PUBLIC '-//Sun Microsystems, Inc.//DTD J2EE Application 1.3//EN' 'http://java.sun.com/dtd/application_1_3.dtd'>

<application>
  <display-name>Basic StatelessSession ejb20</display-name>
  <description>Basic StatelessSession ejb20</description>

  <module>
    <ejb>ejb20_basic_statelessSession.jar</ejb>
  </module>

</application>

 

 使用ebj对象缓冲池来保存 无状态会话bean的对象。bean的实例都是相同的。缓冲池的设置取决于

(1) weblogic的线程数

(2) 数据库的连接数

 

生命周期的两种状态:

(1) 不存在

(2) 方法就绪池

 

  • 大小: 29.6 KB
  • 大小: 26 KB
  • 大小: 27.9 KB
  • 大小: 27.1 KB
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    Session Bean的使用

    JavaBean和Session Bean是Java企业级应用开发中的重要概念,特别是在使用Enterprise JavaBeans(EJB)技术时。本文将深入探讨这两个概念,以及如何在实际项目中使用它们。 首先,让我们了解什么是JavaBean。...

    Java EJB中有、无状态SessionBean的两个例子.rar

    - 无状态SessionBean示例:同样包含一个Java类和接口,但这个类不会存储任何客户端特定的信息。测试代码可能展示了如何在高并发环境下使用SSB,以展示其效率。 - Swing程序:Swing是Java的一个图形用户界面(GUI)...

    EJB3.0开发Session Bean.rar

    - **无状态Session Bean (Stateless Session Bean)**:每个客户端请求都会创建一个新的实例,不保存任何客户端状态,适合执行计算任务或事务操作。 - **有状态Session Bean (Stateful Session Bean)**:每个客户端...

    EJB的开发及应用,Session Bean的开发

    与Stateful Session Bean(有状态会话Bean)不同,它维护了客户端会话状态,而Stateless Session Bean(无状态会话Bean)则不保留任何客户端状态,每次调用都独立于其他调用。Session Bean主要用于表示业务逻辑,...

    Stateful--sessionbean.zip_sessionBean_stateful

    标题"Stateful--sessionbean.zip_sessionBean_stateful"表明这个压缩包包含有关有状态会话Bean的实现资料,可能包括设计思路、步骤截图和源代码。这些资源对于理解如何创建和使用SFSB至关重要。 描述中的"有状态的...

    itfuture_sessionbean

    "itfuture_sessionbean"的第二部分可能是指一系列教程或学习资料,聚焦于深入理解Session Bean的使用和实现。JBulider作为标签,表明这些材料可能与使用JBulider这一集成开发环境(IDE)来创建和管理Session Bean...

    EJB3开发第一个无状态会话bean

    无状态会话 Bean(Stateless Session Bean)是企业级 Java(EJB)3.0 中的核心组件,主要用于实现业务逻辑,它不保存任何特定客户端的状态信息。本篇文章将深入讲解如何在 EJB3 中开发第一个无状态会话 Bean,以及...

    EJB3.0无状态SessionBean例子

    例如,`@Stateless` 注解用于声明一个类为无状态SessionBean。 - **依赖注入**:通过`@EJB`注解,可以实现Bean之间的依赖关系,简化了代码的结构和管理。 - **简化接口**:EJB3.0支持本地接口(Local Interface)...

    Java EJB中有、无状态SessionBean的两个例子.7z

    根据其设计模式,Session Bean分为有状态(Stateful Session Bean)和无状态(Stateless Session Bean)两种类型。本压缩包文件提供了这两个类型的实例,让我们深入探讨它们的概念、用途以及如何在实际应用中使用。 ...

    ejb sessionbean demo

    在"ejb sessionbean demo"中,我们主要探讨的是如何使用EJB的Session Bean进行开发和演示。Session Bean通常用于实现业务逻辑,它们可以是无状态的,意味着每个请求都会创建一个新的Bean实例,不保留任何先前会话的...

    java源码:Java EJB中有、无状态SessionBean的两个例子.zip

    本压缩包提供了两个关于Java EJB中状态ful(有状态)和stateless(无状态)SessionBean的实例,帮助开发者深入理解这两种类型的Bean。 一、有状态SessionBean(Stateful Session Bean) 有状态SessionBean(SFSB,...

    ejb入门录像 sessionBean

    【ejb入门录像 sessionBean】是针对企业级Java应用(Enterprise JavaBeans,简称EJB)技术的初学者设计的一段教学视频。EJB是Java EE(Java Platform, Enterprise Edition)框架的重要组成部分,它提供了一种标准的...

    Java EJB中有、无状态SessionBean的两个例子.zip_1H1_Java EJB_UOL

    通过这两个示例,你可以学习如何在实际项目中创建和使用这两种类型的Session Bean,以及它们在处理并发请求和资源管理方面的差异。有状态Session Bean在处理并发时需要特别注意,因为它们必须确保同一时间只有一个...

    基于Java的实例源码-EJB中有、无状态SessionBean的两个例子.zip

    无状态SessionBean(Stateless Session Bean)代表了一个业务逻辑单元,它不保存任何客户端的状态信息。这意味着每次客户端调用Bean的方法时,都会得到一个全新的、独立的Bean实例,不会记住之前的操作。无状态...

    基于java的EJB中有、无状态SessionBean的两个例子.zip

    2. 无状态Session Bean(Stateless Session Bean) 无状态Session Bean(SSB)不保留任何特定客户端的状态信息,每个调用都是独立的,不受前一次调用的影响。SSB通常用于执行无状态的业务操作,如计算、查找或验证等...

    基于Java的实例开发源码-EJB中有、无状态SessionBean的两个例子.zip

    本实例可能包含一个或多个演示程序,通过对比有状态和无状态SessionBean的使用场景和实现方式,帮助初学者理解这两种Bean的区别和应用场景。通过深入学习这些示例,你将更好地掌握如何在实际项目中运用EJB技术,提升...

    基于Java的源码-EJB中有、无状态SessionBean的两个例子.zip

    根据会话的状态性,Session Bean分为有状态(Stateful)和无状态(Stateless)两种。无状态Session Bean对于每个方法调用都独立,不保留任何客户端会话信息;而有状态Session Bean则可以维护与特定客户端会话相关的...

    Java 简单的ejb实例代码.rar

    简单的Java ejb实例代码,一个简单的Stateless Session Bean的例子,通过Bean使用远程接口方法访问数据,里面主要实现一个与时间有关的方法函数,同时编写了一个客户端测试程序。创建一个访问EJB的客户端应用程序,...

    weblogic部署EJB2.0 实现本地接口的SessionBean

    它定义了三种主要类型的Bean:Stateless Session Beans(无状态会话bean)、Stateful Session Beans(有状态会话bean)和Message Driven Beans(消息驱动bean)。我们关注的是Session Bean,它们通常代表业务逻辑,...

Global site tag (gtag.js) - Google Analytics