开发有状态bean,示例代码如下:
// 指定有状态bean
@Stateful
无状态bean使用实例池管理bean
有状态bean使用激活(activation)管理bean(为每一个用户创建一个bean,应用求场景:如购物车)
在ejb中调用其他ejb有以两种方式:
1 通过jndi查找的方式
????????????未实现,需查找jndi查找方法
2 通过注解方式注入并使用其他ejb或者服务,示例代码如下:
/**
* Copyright (C) 2016
*
* FileName:Second.java
*
* Author:<a href="mailto:zhenhuayue@sina.com">Retacn</a>
*
* CreateTime: 2016-7-21
*/
// Package Information
package cn.yue.ejb.bean;
/**
* 测试其他 ejb的调用,被调用接口
*
* @version
* @Description:
* @author <ahref="mailto:zhenhuayue@sina.com">Retacn</a>
* @since 2016-7-21
*/
public interface Second {
public String saySecond();
}
/**
* Copyright (C) 2016
*
* FileName:SecondBean.java
*
* Author:<ahref="mailto:zhenhuayue@sina.com">Retacn</a>
*
* CreateTime: 2016-7-21
*/
// Package Information
package cn.yue.ejb.bean;
import javax.ejb.Local;
import javax.ejb.Stateless;
/**
* 测试调用其他ejb,被调用bean
*
* @version
* @Description:
* @author <ahref="mailto:zhenhuayue@sina.com">Retacn</a>
* @since 2016-7-21
*/
// 指定为无状态 bean
@Stateless
// 指定为本地接口
@Local(Second.class)
public class SecondBean implementsSecond {
@Override
public String saySecond() {
return "second";
}
}
/**
* Copyright (C) 2015
*
* FileName:HelloWorldBean.java
*
* Author:<a href="mailto:zhenhuayue@sina.com">Retacn</a>
*
* CreateTime: 2015-1-14
*/
// Package Information
package cn.yue.ejb.bean;
import java.util.Hashtable;
import javax.ejb.EJB;
import javax.ejb.Local;
import javax.ejb.Remote;
import javax.ejb.Stateless;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
//import javax.ejb.Stateless;
/**
* 实现业务接口 并添加两个注释 测试调用其他ejb
*
* @version
* @Description:
* @author<a href="mailto:zhenhuayue@sina.com">Retacn</a>
* @since 2015-1-14
*/
// 指定为无状态会话bean
@Stateless
// 指定有状态bean
// @Stateful
// 指定远程接口
@Remote(RemoteHelloWorld.class)
// 指定为本地接口
@Local(LocalHelloWorld.class)
publicclass HelloWorldBean implements LocalHelloWorld, RemoteHelloWorld {
@EJB(beanName = "SecondBean")
Second second;
@Override
public String SayHello(String name) {
// try {
// Properties props = newProperties();
//props.setProperty("java.naming.factory.initial",
//"org.jnp.interfaces.NamingContextFactory");
//props.setProperty("java.naming,provider.url", "localhost:1099");
//props.setProperty("java.naming.factory.url.pkgs",
// "org.jboss.naming");
//
// InitialContext ctx;
// ctx = newInitialContext(props);
// HelloWorld helloworld =(HelloWorld)
//ctx.lookup("HelloWorldBean/romote");
// // out.println(helloworld.SayHello("retacn"));
// } catch (NamingException e) {
// e.printStackTrace();
// }
// 调用其他ejb有两种方式:
// 1 通过jndi查找
// try {
//System.out.println("start-----");
// System.out.println("调用其他ejb: " + callByJndi().saySecond());
// } catch (NamingException e) {
//System.out.println("exception-----");
// e.printStackTrace();
// }
//System.out.println("end----");
// 2 通过依赖注入
return name + " say:hello world! this ismy first EJB test! " + second.saySecond();
}
@Override
public String localSay(String name) {
return"local---" + name + " say:hello world! this ismy first EJB test!";
}
@SuppressWarnings("unchecked")
public Second callByJndi() throws NamingException {
@SuppressWarnings("rawtypes")
final Hashtable jndiProperties = new Hashtable();
jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
final Context context = new InitialContext(jndiProperties);
// 如果服务器布署的是.ear包,则appname为.ear之后的包名,如果的war或是jar包,appName可以为空
final String appName = "";
final String moduleName = "HelloWorldEJB";
final String distinctName = "";
final String beanName = "SecondBean";
final String viewClassName = Second.class.getName();
final String namespace = "ejb: " + appName + "/" + moduleName + "/" + distinctName
+ "/"
+ beanName + "!" + viewClassName;
System.out.println("调用其他ejb,namespace:" + namespace);
Second second = (Second)context.lookup(namespace);
return second;
}
}