`

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
分享到:
评论
发表评论

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

相关推荐

    java面试题精选

    Session Bean 还可以再细分为 Stateful Session Bean 与 Stateless Session Bean ,这两种的 Session Bean都可以将系统逻辑放在 method之中执行,不同的是 Stateful Session Bean 可以记录呼叫者的状态,因此通常来...

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

    NULL 博文链接:https://diaochenlong2.iteye.com/blog/1846828

    Java 简单的ejb实例代码.rar

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

    eclipse + JBoss 5 + EJB3开发指南

    [7] 建立 HelloWorld Stateless Session Bean 及 Local, Remote interfaces: 19 [8] 建立客户端测试程序: 20 [9] 使用 ANT 建立 EJB-JAR 并执行 Client 程序: 20 MyEclipse EJB 3.0 Tutorial 22 Table of ...

    JBOSS使用指南

    2.3 Stateless Session Bean与Stateful Session Bean的区三别 2.4 Session Bean的生命周期 3.消息驱动Bean (Message Driven Bean) 3.1 Queue消息的发送与接收(PTP消息传递模型) 3.2 Topic消息的发送与接收(Pub/sub ...

    简单的ejb实例,Java初学实例

    一个简单的Stateless Session Bean的例子,里面主要实现一个与时间有关的方法函数。  同时编写了一个客户端测试程序,展现的是一个简单的Stateless Session Bean的实现过程,希望能够对复杂的EJB的开发起一些...

    关于JAVA面试的100题及其答案

    Session Bean 还可以再细分为 Stateful Session Bean 与 Stateless Session Bean ,这两种的 Session Bean都可以将系统逻辑放在 method之中执行,不同的是 Stateful Session Bean 可以记录呼叫者的状态,因此通常来...

    进销存系统文档作业例子

    Session Bean 还可以再细分为 Stateful Session Bean 与 Stateless Session Bean ,这两种的 Session Bean都可以将系统逻辑放在 method之中执行,不同的是 Stateful Session Bean 可以记录呼叫者的状态,因此通常来...

    Enterprise JavaBean (EJB) 是可重用的、可移植的 J2EE 组件。EJB 由封装业务逻辑的方法组成。譬如说,EJB 可能有这样的业务逻辑:

    /*A simple stateless session bean implementing the incrementValue() method of the * CalculateEJB interface.*/ @Stateless(name="CalculateEJB") public class CalculateEJBBean implements ...

    EJB3.0 实例教程 -- 切片2

    4.3 STATELESS SESSION BEAN与STATEFUL SESSION BEAN的区别...22 4.4 如何改变SESSION BEAN的JNDI 名称22 4.5 SESSION BEAN的生命周期..........23 4.6 拦截器(INTERCEPTOR) ...26 4.7 依赖注入(DEPENDENCY ...

    sca-ejbbinding-1.1-spec-cd02.

    This document explains the EJB SCA binding. This proposal describes ...deployed stateless session bean into an SCA assembly, and how to expose SCA services to clients which use the EJB programming model.

    EJB葵花宝典(题集)

    3.4Stateless SessionBean(无状态会话Bean) 3.4.1需求 19 3.4.2Remote接口 20 3.4.3Local接口 21 3.4.4Bean类 22 3.4.5远程客户 23 3.4.6本地客户 24 3.5Stateful SessionBean(有状态会话Bean) 25 3.6State...

    浅析C# 状态机Stateless

    主要介绍了C# 状态机Stateless的的相关资料,文中讲解非常详细,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下

    SSH笔记-管理Session和批量操作数据库

    SSH笔记-管理Session和批量操作数据库(通过JDBC api 批量操作、通过session进行批量操作、通过statelesssession进行批量操作)

    EJB3.0 实例教程 -- 切片1

    4.3 STATELESS SESSION BEAN与STATEFUL SESSION BEAN的区别...22 4.4 如何改变SESSION BEAN的JNDI 名称22 4.5 SESSION BEAN的生命周期..........23 4.6 拦截器(INTERCEPTOR) ...26 4.7 依赖注入(DEPENDENCY ...

    JAVA面试题最全集

    10.session bean 和 entity bean的区别 11.ejb中的transaction机制 12.synchronized (生产者和消费) 13.String 和 StringBuffer 14.Serializable 15.MVC (Struts的工作流程) 16.什么是MDA 17.tcp与udp的...

    一个iptables的stateless NAT模块实现

    如果你在寻找Linux上配置诸如Cisco设备上的static双向NAT的方法,这个或许就是你想要的; what?你觉得它完不成PAT?是的,它不行。但是想做PAT为何不使用现有的iptables实现呢?它可以自动为你解决元组唯一性问题...

    超级有影响力霸气的Java面试题大全文档

     Session Bean 还可以再细分为 Stateful Session Bean 与 Stateless Session Bean ,这两种的 Session Bean都可以将系统逻辑放在 method之中执行,不同的是 Stateful Session Bean 可以记录呼叫者的状态,因此通常...

    java 面试题 总结

    Session Bean 还可以再细分为 Stateful Session Bean 与 Stateless Session Bean ,这两种的 Session Bean都可以将系统逻辑放在 method之中执行,不同的是 Stateful Session Bean 可以记录呼叫者的状态,因此通常来...

Global site tag (gtag.js) - Google Analytics