VÍ DỤ VỀ MESSAGE-DRIVEN BEANS TRUY XUẤT ENTITY BEAN
VÍ DỤ VỀ MESSAGE-DRIVEN BEANS
Create by: Võ văn Hải
Email: vovanhaiQN.google.com
Home page: http://vovanhai.wordpress.comPDF ver
PDF version here
Kiến trúc tổng quát của Message-Driven Beans

Tổng quát: Khi client gửi 1 message đến mdb của chúng ta, mdb sẽ đổi status của order thành Verified

Bài này sử dụng lại bài CMP OrderEJB ở bài trước.
1. Tạo thư mục MDB_Order_EX
2. Copy thư mục order gồm 2 tập tin Order.class và OrderHome.class vào thư mục MDB_Order_EX.
3. Tạo file OrderVerifierMDB.java có nội dung sau
| package mdb;
import java.rmi.RemoteException; import javax.ejb.EJBException; import javax.ejb.FinderException; import javax.ejb.MessageDrivenBean; import javax.ejb.MessageDrivenContext; import javax.jms.Message; import javax.jms.MessageListener; import javax.jms.TextMessage; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; import javax.rmi.PortableRemoteObject; import order.*; public class OrderVerifierMDB implements MessageDrivenBean, MessageListener { private MessageDrivenContext ctx; public void setMessageDrivenContext(MessageDrivenContext ctx) { print(“setMessageDrivenContext called.\n”); this.ctx = ctx; } public void ejbCreate() { print(“ejbCreate() called.\n”); } public void ejbRemove() { print(“ejbRemove() called.\n”); } public void onMessage(Message msg) { print(“OrderVerifierMDB: onMessage() called.\n”); if(!(msg instanceof TextMessage)){ throw new EJBException (“OrderVerifierMDB handles only Text Messages.”); } try { TextMessage tm = (TextMessage) msg; String orderId = tm.getText(); verifyOrder(orderId); } catch(Exception ex) { ex.printStackTrace(); throw new EJBException(ex); } } private void verifyOrder(String orderId) throws FinderException, NamingException, RemoteException { print(“Verifying order Id:” + orderId); Context context = new InitialContext(); OrderHome orderHome = (OrderHome) PortableRemoteObject.narrow (context.lookup(“order/Order”),OrderHome.class); /*Lấy order theo Id*/ Order order = orderHome.findByPrimaryKey(orderId); /* bây giờ chúng ta có thể thay đổi các thuộc tính của order.Ở đây chúng ta đổi thuộc tính status thành “verified” */ print(“Changing order status to Verified”); order.setStatus(“Verified”); } void print(String s) { System.out.println(s); } } |
4. Tạo thư mục META-INF
5. Tạo tập tin ejb-jar.xml trong thư mục META-INF có nội dung sau
| <!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> <message-driven> <ejb-name>OrderVerifierMDB</ejb-name> <ejb-class>mdb.OrderVerifierMDB</ejb-class> <transaction-type>Container</transaction-type> <message-driven-destination> <destination-type>javax.jms.Topic</destination-type> <subscription-durability>NonDurable</subscription-durability> </message-driven-destination> </message-driven> </enterprise-beans> </ejb-jar> |
6. Tạo tập tin jboss.xml trong thư mục META-INF có nội dung sau
| <?xml version=”1.0″ encoding=”UTF-8″?>
<jboss> <enterprise-beans> <message-driven> <ejb-name>OrderVerifierMDB</ejb-name> <destination-jndi-name>topic/OrderVerifierTopic</destination-jndi-name> </message-driven> </enterprise-beans> </jboss> |
7. Tạo file compile.bat có nội dung sau
| javac -d . *.java
pause |
Chạy file này để biên dịch.
8. Tạo tập tin createJAR.bat có nội dung sau
| jar cvf EJB_MDB2.jar mdb/*.class mdb/order/*.class META-INF/*.xml
pause |
Chạy file này ta sẽ có tập tin EJB_MDB2.jar.
9. Triển khai ứng dụng bằng cách copy vào thư mục %JBOSS_HOME%\server\default\deploy, ta được kết quả như sau nếu thành công
| …
22:19:33,749 INFO [EjbModule] Deploying OrderVerifierMDB 22:19:33,812 INFO [EJBDeployer] Deployed: file:/C:/javaSoft/jboss-4.2.2.GA/serv er/default/deploy/EJB_MDB2.jar … |
10. Tạo thư mục client
11. Copy thư mục order vào đấy
12. Tạo file Client.java trong thư mục client với nội dung sau
| package client;
import javax.jms.Session; import javax.jms.TextMessage; import javax.jms.Topic; import javax.jms.TopicConnection; import javax.jms.TopicConnectionFactory; import javax.jms.TopicPublisher; import javax.jms.TopicSession; import javax.naming.Context; import javax.naming.InitialContext; import mdb.Order; import mdb.OrderHome; public class Client { public static void main(String[] args) { print(“Starting Client . . .”); try { System.setProperty(“java.naming.factory.initial”,”org.jnp.interfaces.NamingContextFactory”); System.setProperty(“java.naming.provider.url”,”localhost:1099″); String orderVerifierJndiName = “topic/OrderVerifierTopic”; String connectionFactoryJndiName = “ConnectionFactory”; print(“Looking up the JMS destination(Topic) via JNDI.”); Context context = new InitialContext(); Topic topic = (Topic) context.lookup(orderVerifierJndiName); print(“Locating connection factory.”); TopicConnectionFactory connectionFactory = (TopicConnectionFactory)context.lookup(connectionFactoryJndiName); print(“Creating a connection and establishing a session.”); TopicConnection connection = connectionFactory.createTopicConnection(); TopicSession session = connection.createTopicSession (false,Session.AUTO_ACKNOWLEDGE); TopicPublisher publisher = session.createPublisher(topic); print(“Creating an order with status:Submitted”); Context initialContext = new InitialContext(); Object object = initialContext.lookup(“order/Order”); OrderHome orderHome = (OrderHome) javax.rmi.PortableRemoteObject.narrow(object,OrderHome.class); Order order = (Order)orderHome.create( “1″, “Submitted”, 100); String orderId = order.getOrderId(); print(“Order id ” + orderId + ” is created”); print(“Creating a text message with order id and publishing it.”); TextMessage tm = session.createTextMessage(); tm.setText(orderId); publisher.publish(tm); print(“Sleeping for 2 sec.”); Thread.sleep(2000); print(“Now the order status is:” + order.getStatus()); } catch(Exception ex) { System.err.println(ex); ex.printStackTrace(); } } static void print(String s) { System.out.println(s); } } |
13. Tạo file compile.bat với nội dung sau
| javac -d . *.java
pause |
Chạy file này để biên dịch
14. Tạo file run.bat với nội dung sau
| java Client
pause |
15. Thực thi file run.bat, kết quả dạng như sau:
| D:\Bai giang Aptech\Aptech – Semester 4\EJB 2\examples\EJB2\Message-Driven Beans\orderEx\client>java Client
Starting Client . . . Looking up the JMS destination(Topic) via JNDI. Locating connection factory. Creating a connection and establishing a session. Creating an order with status:Submitted Order id 1220455622604 is created Creating a text message with order id and publishing it. Sleeping for 2 sec. Now the order status is:Verified … |
Lưu ý:
| Mở file %JBOSS_HOME%\server\default\deploy\jbossjca-service.xml , thêm đoạn xml sau vào để tạo 1 JMS Topic mới:
<mbean code=”org.jboss.mq.server.jmx.Topic” name=”jboss.mq.destination:service=Topic,name=OrderVerifierTopic”> <depends optional-attribute-name= “DestinationManager”>jboss.mq:service=DestinationManager</depends> </mbean> Điều này sẽ tạo 1 Topic là OrderVerifierTopic và đăng ký tới JNDI với tên : topic/OrderVerifierTopic. Trong trường hợp không có topic này, Jboss4.22GA sẽ báo lỗi và tự động tạo ra 1 topic với tên topic/OrderVerifierTopic. |
CHÚC THÀNH CÔNG!