Session Bean Example
@Stateless
1. Create a remote interface
package com.ejb3;
/**
* @author Clay Zhong - Email: zjclay@gmail.com
* @date Aug 31, 2008
*/
public interface HelloWorld {
public String sayHello(String name);
}
2. Create a local interface
package com.ejb3;
/**
* @author Clay Zhong - Email: zjclay@gmail.com
* @date Aug 31, 2008
*/
public interface HelloWorldLocal extends HelloWorld {
public String getInfo();
}
3. Write stateless session bean
package com.ejb3.impl;
import com.ejb3.HelloWorld;
import com.ejb3.HelloWorldLocal;
import javax.ejb.*;
import org.jboss.annotation.ejb.RemoteBinding;
import org.jboss.annotation.ejb.LocalBinding;
/**
* Session Bean implementation class HelloWorldBean
*/
@Stateless
@Local( { HelloWorldLocal.class })
@LocalBinding(jndiBinding = "ejbtest/LocalHelloWorld")
@Remote( { HelloWorld.class })
@RemoteBinding(jndiBinding = "ejbtest/RemoteHelloWorld")
public class HelloWorldBean implements HelloWorld, HelloWorldLocal {
public HelloWorldBean() {}
/**
* @see HelloWorld#sayHello(String)
*/
public String sayHello(String name) {
return "Hello " + name;
}
@Override
public String getInfo() {
return "This is local method.";
}
}
4. Write test class to invoke session bean
import java.util.*;
import javax.naming.*;
import com.ejb3.HelloWorld;
import com.ejb3.HelloWorldLocal;
/**
* @author Clay Zhong - Email: zjclay@gmail.com
* @date Aug 31, 2008
*/
public class EJBTest {
public static void main(String[] args) throws NamingException {
Properties properties = new Properties();
properties.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
properties.put(Context.PROVIDER_URL, "jnp://localhost");
InitialContext ctx = new InitialContext(properties);
try {
HelloWorld helloWorld = (HelloWorld) ctx.lookup("ejbtest/RemoteHelloWorld");
System.out.println(helloWorld.sayHello("Clay"));
} catch (Exception e) {
System.out.println("Lookup remote class failed.");
}
try {
HelloWorldLocal helloWorldLocal = (HelloWorldLocal) ctx
.lookup("ejbtest/LocalHelloWorld");
System.out.println(helloWorldLocal.getInfo());
} catch (Exception e) {
System.out.println("Lookup local class failed.");
}
ctx.close();
}
}
@Stateful
1. Create a remote interface
package com.ejb3;
/**
* @author Clay Zhong - Email: zjclay@gmail.com
* @date Aug 31, 2008
*/
public interface HelloWorldRemote {
public String sayHello(String name);
}
2. Write stateful bean
package com.ejb3.impl;
import com.ejb3.HelloWorldRemote;
import com.ejb3.HelloWorldLocal;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.ejb.*;
import org.jboss.annotation.ejb.RemoteBinding;
import org.jboss.annotation.ejb.LocalBinding;
/**
* Session Bean implementation class HelloWorldBean
*/
@Stateful
@Local( { HelloWorldLocal.class })
@LocalBinding(jndiBinding = "ejbtest/LocalHelloWorld")
@Remote( { HelloWorldRemote.class })
@RemoteBinding(jndiBinding = "ejbtest/RemoteHelloWorld")
public class HelloWorldBean implements HelloWorldRemote, HelloWorldLocal {
public HelloWorldBean() {}
@Init
public void initialize() {
// 这个注释指定了有状态session bean初始化的方法。它区别于@PostConstruct注释在于:
// 多个@Init注释方法可以同时存在于有状态session bean中, 但每个bean实例只会有一个@Init注释的方法会被调用。
// 这取决于bean是如何创建的.
System.out.println("HelloWorld bean initialize...");
}
/**
* @see HelloWorldRemote#sayHello(String)
*/
public String sayHello(String name) {
return "Hello " + name;
}
@Override
public String getInfo() {
return "This is local method.";
}
@PostConstruct
public void Construct() {
// 当bean对象完成实例化后,使用了这个注释的方法会被立即调用。
// 这个注释同时适用于有状态和无状态的会话bean。
System.out.println("Construct()方法被调用");
}
@PreDestroy
public void exit() {
// 使用这个注释的方法会在容器从它的对象池中销毁一个无用的或者过期的bean实例之前调用。
// 这个注释同时适用于有状态和无状态的会话bean。
System.out.println("exit()方法被调用");
}
@PrePassivate
public void serialize() {
// 当一个有状态的session bean实例空闲过长的时间, 容器将会钝化(passivate)它,并把它的状态保存在缓存当中。
// 使用这个注释的方法会在容器钝化bean实例之前调用。 这个注释适用于有状态的会话bean。
// 当钝化后,又经过一段时间该bean仍然没有被操作, 容器将会把它从存储介质中删除。
// 以后,任何针对该 bean方法的调用容器都会抛出例外。
System.out.println("serialize()方法被调用");
}
@PostActivate
public void activate() {
// 当客户端再次使用已经被钝化的有状态session bean时, 新的实例被创建, 状态被恢复。
// 使用此注释的session bean会在bean的激活完成时调用。这个注释只适用于有状态的会话bean。
System.out.println("activate()方法被调用");
}
@Remove
public void stopSession() {
// 调用该方法以通知容器移除该 bean 实例、终止会话。方法体可以是空的。
System.out.println("stopSession()方法被调用");
}
}
Interceptor
1. Add annotation: @Interceptors({HelloInterceptor.class})
2. Write interceptor class
package com.ejb3.impl;
import javax.interceptor.AroundInvoke;
import javax.interceptor.InvocationContext;
/**
* @author Clay Zhong - Email: zjclay@gmail.com
* @date Sep 21, 2008
*/
public class HelloInterceptor {
@AroundInvoke
public Object log(InvocationContext ctx) throws Exception {
System.out.println("HelloInterceptor intercepting...");
long start = System.currentTimeMillis();
try {
if (ctx.getMethod().getName().equals("sayHello")) {
System.out.println("HelloWorld.sayHello() invoked");
}
return ctx.proceed();
}
catch (Exception e) {
throw e;
}
finally {
long time = System.currentTimeMillis() - start;
System.out.println("Invoke times: " + time + "ms");
}
}
}
除了可以在外部定义拦截器之外, 还可以将Session Bean中的一个或多个方法定义为拦截器,如:
@AroundInvoke
public Object log(InvocationContext ctx) throws Exception {
try {
if (ctx.getMethod().getName().equals("sayHello")) {
System.out.println("HelloWorld.sayHello() invoked");
}
return ctx.proceed();
}
catch (Exception e) {
throw e;
}
}
Message Driven Bean
package com.ejb3.impl;
import javax.ejb.MessageDriven;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
import javax.ejb.ActivationConfigProperty;
/**
* @author Clay Zhong - Email: zjclay@gmail.com
* @date Sep 23, 2008
*/
@MessageDriven(activationConfig = {
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
@ActivationConfigProperty(propertyName = "destination", propertyValue = "queue/fortest") })
public class MDBean implements MessageListener {
@Override
public void onMessage(Message msg) {
try {
TextMessage textMessage = (TextMessage) msg;
System.out.println("MessageDrivenBean: " + textMessage.getText());
}
catch (Exception e) {
e.printStackTrace();
}
}
}
Test Class:
/**
*
*/
import java.util.*;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueSender;
import javax.jms.QueueSession;
import javax.jms.TextMessage;
import javax.naming.*;
import com.ejb3.HelloWorldRemote;
import com.ejb3.HelloWorldLocal;
/**
* @author Clay Zhong - Email: zjclay@gmail.com
* @date Aug 31, 2008
*/
public class EJBTest {
public static void main(String[] args) throws NamingException {
Properties properties = new Properties();
properties.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
properties.put(Context.PROVIDER_URL, "jnp://localhost");
InitialContext ctx = new InitialContext(properties);
try {
QueueConnectionFactory factory = (QueueConnectionFactory) ctx
.lookup("ConnectionFactory");
QueueConnection queueConnection = factory.createQueueConnection();
// 建立不需要事务的并且能自动接收消息收条的会话, 在非事务Session中, 消息传递的方式有三种:
// 1. Session.AUTO_ACKNOWLEDGE: 当客户机调用的receive方法成功返回,
// 或当MessageListenser成功处理了消息, session将会自动接收消息的收条。
// 2. Session.CLIENT_ACKNOWLEDGE: 客户机通过调用消息的acknowledge方法来接收消息。接收发生在session层。
// 接收到一个被消费的消息时, 将自动接收该session已经消费的所有消息。例如:
// 如果消息的消费者消费了10条消息, 然后接收15个被传递的消息, 则前面的10个消息的收据都会在这15个消息中被接收。
// 3. Session.DUPS_ACKNOWLEDGE: 指示session缓慢接收消息。
QueueSession queueSession = queueConnection.createQueueSession(false,
QueueSession.AUTO_ACKNOWLEDGE);
TextMessage msg = queueSession.createTextMessage("Hi, This is Clay");
QueueSender sender = queueSession.createSender((Queue) ctx.lookup("queue/fortest"));
sender.send(msg);
queueSession.close();
}
catch (Exception e) {
System.out.println("Lookup message driven bean failed.");
}
ctx.close();
}
}
分享到:
相关推荐
《EJB3.0入门经典》是关于EJB 3.0的专业技术教程,从实用的角度出发,理论联系实际,用9章的篇幅详细讲解了EJB 3.0开发的方法和技巧。《EJB3.0入门经典》内容丰富,讲解由浅入深,全面系统,在讲解EJB 3.0最新开发...
本书面向EJB 3.0的实际应用开发,通过大量的实例,循序渐进地为读者介绍了有关EJB 3.0开发所涉及的...本书非常适合EJB 3.0初学者和从事EJB项目开发的人员使用,对于开发大型的企业分布式程序是一本非常好的参考书。
ejb3.0入门图文教程,包括EJB3.0开发Entity.pdf、EJB3.0开发Message Driven Bean.pdf、EJB3.0开发Session Bean.pdf
罗时飞精通EJB3.0.zip.001 罗时飞精通EJB3.0.zip.002 罗时飞精通EJB3.0.zip.003 《精通EJB3.0》共分为4个部分:第一部分对EJB编程基础进行介绍,概要性地对EJB进行了阐述;第二部分重点关注EJB编程的具体内容和...
罗时飞精通EJB3.0.zip.001 罗时飞精通EJB3.0.zip.002 罗时飞精通EJB3.0.zip.003 《精通EJB3.0》共分为4个部分:第一部分对EJB编程基础进行介绍,概要性地对EJB进行了阐述;第二部分重点关注EJB编程的具体内容和...
EJB3.0中文文档,实例教程.EJB3.0中文文档,实例教程.EJB3.0中文文档,实例教程.EJB3.0中文文档,实例教程.
期待已久的 EJB3.0 最终规范已经发布了。虽然 EJB3.0 最终规范出来了一段时间,但对 EJB3.0 的应用还停留在介 绍之中,应用实例更是少之又少,所以作者拟写本书,以简单的实例展现 EJB3.0 的开发过程,希望对大家有所...
ejb3.0开发规范,开发ejb3.0过程中的参考文档
ejb3.0教材,适合ejb初学者阅读!
ejb 3.0 jar 包 很全ejb 3.0 jar 包 很全ejb 3.0 jar 包 很全ejb 3.0 jar 包 很全ejb 3.0 jar 包 很全ejb 3.0 jar 包 很全ejb 3.0 jar 包 很全
EJB 3.0实例教程.pdf EJB 3.0实例教程.pdf
本书是关于EJB 3.0的专业技术教程,从实用的角度出发,理论联系实际,用9章的篇幅详细讲解了EJB 3.0开发的方法和技巧。 本书内容丰富,讲解由浅入深,全面系统,在讲解EJB 3.0最新开发技术的同时,精心设计了与...
EJB3.0规范和EJB3.0经典入门(含源码) 本材料适合Java程序员、项目经理和系统架构师。学习本材料,您不需要EJB2.x知识,如果具备一些Web和jdbc知识,学习效率会更快些。学习本材料,初级Java程序员应在1个月左右,...
本书是关于EJB 3.0的专业技术教程,从实用的角度出发,理论联系实际,用9章的篇幅详细讲解了EJB 3.0开发的方法和技巧。 本书内容丰富,讲解由浅入深,全面系统,在讲解EJB 3.0最新开发技术的同时,精心设计了与...
ejb3.0开发实例,会话bean开发,完整代码,适合入门学者
EJB3.0入门图文教程电子书,Jbuilder 2007,新版JBuilder2007基于Eclipse平台,与以往的JBuilder版本完全不 同.借助于Eclipse的开放平台以及丰富的插件,使得JBulider对当前的流行的框架支持非 常好,同时支持EJB3.0的...
EJB3.0规范 EJB3.0 SPECIFICATION 官方规范英文版
给初学者的一个好例子 介绍EJB3.0开发的过程,方便初学者学习EJB3.0
在Myeclipse,基于JBOSS EJB3.0实现了EJB3.0的初次体验,确实比EJB2.0方便了许多。文中有完整的过程和代码。
EJB 3.0 开发指南之定时服务非常经典