`
Clayz
  • 浏览: 297800 次
  • 性别: Icon_minigender_1
  • 来自: 东京
社区版块
存档分类
最新评论

EJB3.0初学备注

    博客分类:
  • Java
阅读更多

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开发实例(java工程)

    这个ejb3.0开发实例提供了完整的代码,对于初学者来说,是学习和理解EJB 3.0概念和实践操作的宝贵资源。你可以通过阅读和运行这些代码,逐步掌握EJB 3.0的核心特性,并将其应用于实际项目中。同时,也可以加深对Java...

    EJB3.0入门经典(PDF)

    《EJB3.0入门经典》是关于EJB 3.0的专业技术教程,从实用的角度出发,理论联系实际,用9章的篇幅详细讲解了EJB 3.0开发的方法和技巧。《EJB3.0入门经典》内容丰富,讲解由浅入深,全面系统,在讲解EJB 3.0最新开发...

    ejb3.0开发规范PDF

    EJB(Enterprise JavaBeans)3.0是Java企业级应用开发的一个重要标准,它定义了如何在Java EE(Java Platform, Enterprise Edition)环境中构建可复用的、组件化的服务器端应用程序。EJB 3.0的发布极大地简化了EJB的...

    ejb3.0入门图文教程

    首先,我们来看《EJB3.0开发Entity.pdf》。在EJB 3.0中,Entity Bean代表持久化对象,它存储在数据库中并与数据库进行交互。这个部分将介绍如何定义实体bean,包括使用JPA(Java Persistence API)来注解实体类,...

    精通EJB3.0 pdf

    《精通EJB3.0》是一本深入探讨企业级JavaBeans(EJB)3.0技术的专业书籍,由Rima Patel、Sriganesh、Gerald Brose和Micah Silverman共同编写,由Wiley Publishing出版。该书为读者提供了全面且深入的EJB3.0知识体系...

    EJB 3.0从入门到精通

    本书面向EJB 3.0的实际应用开发,通过大量的实例,循序渐进地为读者介绍了有关EJB 3.0开发所涉及的...本书非常适合EJB 3.0初学者和从事EJB项目开发的人员使用,对于开发大型的企业分布式程序是一本非常好的参考书。

    ejb3.0初学者必看

    ### EJB 3.0 初学者必备知识点详解 #### 一、EJB 3.0 概述 **EJB (Enterprise JavaBeans)** 是Java平台为企业级应用程序提供的一种组件模型,它允许开发者以模块化的方式构建分布式网络计算的应用程序。EJB 3.0...

    Java之精通EJB3.0.pdf

    ### Java之精通EJB3.0 #### 一、EJB3.0简介与改进 企业Java Beans(Enterprise JavaBeans,简称EJB)是Java平台为企业级应用开发提供的一种组件模型。EJB3.0是EJB规范的一个重大版本更新,它在EJB2.0的基础上进行...

    《EJB 3.0入门经典》 源码

    在"ejb3.0入门经典教程-source"这个压缩包中,包含了书中各个章节的示例代码,覆盖了EJB 3.0的各个方面,例如实体Bean的创建、会话Bean的使用、事务管理、安全性设置以及JPA的持久化操作等。这些源码对于初学者来说...

    EJB3.0+JBOSS+MyEclipse初体验(完整代码和过程)

    在"**EJB3.0+JBOSS+MyEclipse初体验(完整代码和过程).txt**"文件中,你将找到一个完整的示例,涵盖了上述所有步骤,包括具体的代码片段和执行过程,这对于初学者来说是一个很好的起点,可以快速理解并实践EJB 3.0在...

    李腾飞EJB3.0 源码 源代码

    "李腾飞EJB3.0 源码 源代码"可能包含的是李腾飞教授或团队关于EJB 3.0技术的实践示例或教学资源。通过分析这些源码,开发者可以深入理解EJB 3.0的实现细节,例如如何使用注解定义Bean、如何处理持久化、如何进行依赖...

    EJB 3.0实例教程.pdf

    **企业级JavaBeans(EJB)3.0详解** 企业级JavaBeans(Enterprise JavaBeans,简称EJB)是Java平台上用于构建分布式企业级应用的重要组件模型。EJB 3.0是EJB规范的一个重大革新,它极大地简化了EJB的开发过程,引入...

    EJB3.0API.rar_ejb_ejb3.0a_ejb3.0api

    压缩包中的文件如“ejb-3_0-fr-spec-persistence.pdf”、“ejb-3_0-fr-spec-simplified.pdf”和“ejb-3_0-fr-spec-ejbcore.pdf”可能是EJB 3.0官方规范的文档,分别详细阐述了持久化、简化的规范和核心EJB 3.0的内容...

    EJB 3.0规范官方文档

    ejb-3_0-fr-spec-simplified.pdf文件可能是EJB 3.0规范的简化版,旨在帮助初学者快速理解核心概念。它可能包含: 1. **简化的API**:展示了一个更简洁、更易用的EJB 3.0 API,让开发者能快速上手。 2. **示例代码*...

    精通EJB3.0 中文版 3/3

    罗时飞精通EJB3.0.zip.001 罗时飞精通EJB3.0.zip.002 罗时飞精通EJB3.0.zip.003 《精通EJB3.0》共分为4个部分:第一部分对EJB编程基础进行介绍,概要性地对EJB进行了阐述;第二部分重点关注EJB编程的具体内容和...

    EJB3.0架包

    EJB3.0是EJB规范的一个重要版本,它在EJB2.x的基础上进行了大量简化,提高了开发效率,并引入了注解驱动的开发方式,使得EJB更易于理解和使用。 在EJB3.0中,主要包含以下关键知识点: 1. **实体Bean(Entity ...

    精通EJB3.0 中文版 1/3

    罗时飞精通EJB3.0.zip.001 罗时飞精通EJB3.0.zip.002 罗时飞精通EJB3.0.zip.003 《精通EJB3.0》共分为4个部分:第一部分对EJB编程基础进行介绍,概要性地对EJB进行了阐述;第二部分重点关注EJB编程的具体内容和...

    ejb2.0与ejb3.0的区别

    ### EJB2.0与EJB3.0的主要区别 #### 一、简介 企业Java Beans(EJB)是Java平台为企业级应用提供的一种组件模型。随着技术的发展,EJB经历了多个版本的迭代,其中EJB 2.0和EJB 3.0是两个重要的里程碑版本。本文将...

    EJB3.0实例教程(PDF)

    **EJB3.0实例教程**是一份详细指导开发者如何使用Enterprise JavaBeans 3.0(EJB3.0)技术进行企业级应用开发的电子文档。EJB3.0是Java EE(Java Platform, Enterprise Edition)规范的一部分,旨在简化企业级组件的...

    EJB3.0规范-EJB3.0 SPECIFICATION

    - `ejb-3_0-fr-spec-simplified.pdf`:这个版本可能提供了一个简化的EJB3.0规范概述,方便初学者快速理解EJB3.0的关键特性。 通过深入学习这些文档,开发者可以全面掌握EJB3.0规范,有效提升在Java企业级应用开发中...

Global site tag (gtag.js) - Google Analytics