Võ Văn Hải's blog

Chỉ có một điều tuyệt đối đó là mọi thứ đều tương đối…

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: https://vovanhai.wordpress.comPDF ver

PDF version here

Kiến trúc tổng quát của Message-Driven Beans

Thiết kế 1 ví dụ ứng dụng:

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”&gt;

<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!

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

 
%d bloggers like this: