-
Notifications
You must be signed in to change notification settings - Fork 0
JavaEE_Simplest_EJB3_Tutorial
史上最简单的EJB3示例教程
-
Stateless Bean
-
客户端在每次调用的时候服务器都使用相应的Bean生成一个Object来执行相关的操作,但服务器可能会使用不同的Object来响应同一客户端的调用,在此期间无法保证执行响应某个客户端调用的是同一个Object。这就好比让快递公司送包裹,客户只知道包裹是否送到,并不知道也不必知道是哪个投递员负责自己的包裹。
-
注: 某些应用服务器会根据用户指定的数量在内存中为某些Stateless Bean预先生成一定数量的Object以提高服务的响应速度。
-
下面是Stateless Bean的例子:
部署在服务器端的Bean
KennyBean.java (注: 此文件名改为KennyImpl.java比较合适)
Toggle line numbers
1 package test.ejb;
2 import javax.ejb.Stateless;
3 @Stateless // 指出面向客户端的是一个Stateless Bean
4 public class KennyBean implements Kenny {
5 public String say() {
6 return "Hello";
7 }
8 }
Kenny.java
Toggle line numbers
1 package test.ejb;
2 import javax.ejb.Remote;
3 @Remote // 面向远程客户端的接口,相反的是@Local,面对本地
4 public interface Kenny { // 此Bean面向客户端的接口
5 String say();
6 }
客户端
Toggle line numbers
1 package test.ejb;
2 import javax.naming.InitialContext;
3 import javax.naming.Context;
4 import java.util.Properties;
5 public class Main {
6 public static void main(String[] args) {
7 try {
8 Properties props = new Properties();
9 props.put("org.omg.CORBA.ORBInitialHost", "localhost"); // EJB服务器地址
10 props.put("org.omg.CORBA.ORBInitialPort", "37000"); // EJB服务器端口
11 InitialContext context = new InitialContext(props);
12 Kenny kenny = (Kenny)context.lookup(Kenny.class.getName()); // 通过JNDI获取Bean接口
13 System.out.println("Say something Kenny.");
14 System.out.println("Kenny: ".concat(kenny.say()));
15 }catch(Exception e) {
16 System.err.println("Error: ".concat(e.getMessage()));
17 }
18 }
19 }
运行结果
Say something Kenny. Kenny: Hello
II. Stateful Bean
-
一次会话可以有多次操作,在会话期间总能保证客户端能让服务器上的Bean认出自己,这类Bean就叫做Stateless Bean。 将上面的例子稍加改动:
部署在服务器端的Bean
KennyBean.java (注: 此文件名改为KennyImpl.java比较合适)
Toggle line numbers
1 package test.ejb;
2 import javax.ejb.Stateful;
3 import javax.ejb.Init;
4 import javax.ejb.Remove;
5 @Stateful // 指出这是一个Stateful Bean
6 public class KennyBean implements Kenny {
7 public String say() {
8 return "Hello";
9 }
10 @Init // 初始化Bean的方法
11 public void create() {
12 System.out.println("Kenny comes.");
13 }
14 @Remove // 销毁Bean的方法
15 public void remove() {
16 System.out.println("Kenny leaves.");
17 }
18
19 }
Kenny.java
Toggle line numbers
1 package test.ejb;
2 import javax.ejb.Remote;
3 @Remote // 远端借口
4 public interface Kenny {
5 String say();
6 void create();
7 void remove();
8
9 }
客户端
Toggle line numbers
1 package test.ejb;
2 import javax.naming.InitialContext;
3 import javax.naming.Context;
4 import java.util.Properties;
5 public class Main {
6 public static void main(String[] args) {
7 try {
8 Properties props = new Properties();
9
10 props.put("org.omg.CORBA.ORBInitialHost", "localhost"); // EJB服务器的地址
11 props.put("org.omg.CORBA.ORBInitialPort", "3700"); // EJB服务器的端口
12
13 InitialContext context = new InitialContext(props);
14 Kenny kenny = (Kenny)context.lookup(Kenny.class.getName()); // 获取Bean
15 kenny.create(); // 初始化
16 System.out.println("Say something Kenny.");
17 System.out.println("Kenny: ".concat(kenny.say()));
18 kenny.remove(); // 销毁Bean
19 }catch(Exception e) {
20 System.err.println("Error: ".concat(e.getMessage()));
21 }
22 }
23 }
运行结果
客户端处显示
Say something Kenny. Kenny: Hello
服务器端显示
Kenny comes. Kenny leaves.
III. Message Driven Bean
-
送过去一个信息,让Bean执行某项操作。
部署在服务器端的Bean
KennyInBox.java
Toggle line numbers
1 package test.message.ejb;
2 import javax.ejb.MessageDriven;
3 import javax.jms.Message;
4 import javax.jms.MessageListener;
5 import javax.annotation.Resource;
6 import javax.ejb.MessageDrivenContext;
7 @MessageDriven(mappedName = "jms/Queue")
8 public class KennyInBox implements MessageListener {
9
10 @Resource
11 MessageDrivenContext mdc;
12
13 public KennyInBox() {
14 }
15 public void onMessage(Message message) {
16 System.out.println("Kenny received your message.");
17 }
18
19 }
客户端
Toggle line numbers
1 package test.message.ejb.client;
2 import javax.jms.Connection;
3 import javax.jms.QueueConnectionFactory;
4 import javax.jms.MessageProducer;
5 import javax.jms.Session;
6 import javax.jms.Queue;
7 import javax.jms.TextMessage;
8 import javax.naming.InitialContext;
9 import java.util.Properties;
10 public class Main {
11 public static void main(String[] args) {
12
13 Connection connection = null;
14 Session session = null;
15 MessageProducer messageProducer = null;
16 TextMessage message = null;
17
18 try {
19 Properties props = new Properties();
20
21 props.put("org.omg.CORBA.ORBInitialHost", "localhost");
22 props.put("org.omg.CORBA.ORBInitialPort", "3700");
23
24 InitialContext context = new InitialContext(props);
25 QueueConnectionFactory connectionFactory = (QueueConnectionFactory)context.lookup("jms/QueueFactory");
26 Queue queue = (Queue)context.lookup("jms/Queue");
27 connection = connectionFactory.createConnection();
28 session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
29 messageProducer = session.createProducer(queue);
30 message = session.createTextMessage();
31 message.setText("Hello");
32 messageProducer.send(message);
33 System.out.println("Message sent.");
34 }catch(Exception e) {
35 System.err.println("Error: ".concat(e.getMessage()));
36 }finally {
37 try {
38 connection.close();
39 }catch (Exception e0) {
40 System.out.println("Error: ".concat(e0.getMessage()));
41 }
42 System.exit(0);
43 }
44 }
45 }
客户端处显示
Message sent.
服务器端显示
Kenny received your message.
(待续…)
注: 笔者使用的工作环境
-
JDK 1.6.0 *
GlassFish 9.1 * Netbeans 6.0 Beta 2
None: SimplestEJB3Tutorial (last edited 2008-05-13 23:36:54 by Iacob)