Technical Blog Of JackCHAN

July 27, 2010

Create Message Driven Bean (3) –JMS Topic and Topic Client

Filed under: ejb, jboss, myeclipse — Tags: , , , — kaisechen @ 2:19 am

1. Build a TopicEJB class in MessageDrivenEJB project

Add annotation ‘@ActivationConfigProperty(propertyName = “destination”, propertyValue = “topic/weatherTopic”)’

import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;
import javax.jms.BytesMessage;
import javax.jms.JMSException;
import javax.jms.MapMessage;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.ObjectMessage;
import javax.jms.StreamMessage;
import javax.jms.TextMessage;

@MessageDriven(mappedName = "jms/TopicEJB", activationConfig = {
 @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"),
 @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Topic"),
 @ActivationConfigProperty(propertyName = "clientId", propertyValue = "TopicEJB"),
 @ActivationConfigProperty(propertyName = "destination", propertyValue = "topic/weatherTopic"),
 @ActivationConfigProperty(propertyName = "subscriptionName", propertyValue = "TopicEJB") })
public class TopicEJB implements MessageListener {

 public void onMessage(Message msg) {
 try {
 System.out.println(msg.getJMSDestination());// the name of message queue

 if (msg instanceof TextMessage) { //         1.text message
 TextMessage message = (TextMessage) msg;
 System.out.println(message.getText());
 } else if (msg instanceof MapMessage) {//    2.map message
 MapMessage mapMessage = (MapMessage) msg;
 System.out.println(mapMessage.getString("hello"));
 } else if (msg instanceof ObjectMessage) {// 3. object message
 ObjectMessage objectMessage = (ObjectMessage) msg;
 System.out.println(objectMessage.getObject());
 } else if (msg instanceof BytesMessage) {//  4. byte message
 BytesMessage bytesMessage = (BytesMessage) msg;
 System.out.println(bytesMessage.getStringProperty("byte"));
 } else if (msg instanceof StreamMessage) {// 5.stream message
 StreamMessage streamMessage = (StreamMessage) msg;
 System.out.println(streamMessage.getStringProperty("stream"));
 }

 } catch (JMSException e) {
 e.printStackTrace();
 }
 }

}

2.In destinations-service.xml, add topic mbean

<?xml version="1.0" encoding="UTF-8"?>
<server>
 <mbean code="org.jboss.mq.server.jmx.Queue" name="jboss.mq.destination:service=Queue,name=ztfQueue">
 <attribute name="JNDIName">queue/ztfQueue</attribute>
 <depends optional-attribute-name="DestinationManager">jboss.mq:service=DestinationManager</depends>
 </mbean>
 <mbean code="org.jboss.mq.server.jmx.Topic" name="jboss.mq.destination:service=Topic,name=weatherTopic">
 <attribute name="JNDIName">topic/weatherTopic</attribute>
 <depends optional-attribute-name="DestinationManager">jboss.mq:service=DestinationManager</depends>
 </mbean>
</server>

Make sure the propertyValue of destination in TopicEJB class is same of attribute of JNDIName in destinations-service.xml

3. Re-deploy the MessageDrivenEJB project into jboss5 server

4. Re-start jboss5 server

5. Create a MessageDrivenEJB class in MessageDrivenEJBClient project

import java.util.Properties;

import javax.jms.BytesMessage;
import javax.jms.JMSException;
import javax.jms.MapMessage;
import javax.jms.ObjectMessage;
import javax.jms.Session;
import javax.jms.StreamMessage;
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.InitialContext;
import javax.naming.NamingException;

public class TopicMDBClient {

 public static void main(String[] args) {
 Properties env = new Properties();
 env.put("java.naming.factory.initial",
 "org.jnp.interfaces.NamingContextFactory");
 env.put("java.naming.factory.url.pkgs",
 "org.jboss.naming:org.jnp.interfaces");
 env.put("java.naming.provider.url", "localhost");

 InitialContext ctx;
 try {
 ctx = new InitialContext(env);

 TopicConnectionFactory topicConnectionFactory = (TopicConnectionFactory) ctx
 .lookup("ConnectionFactory");
 TopicConnection topicConnection = topicConnectionFactory
 .createTopicConnection();
 TopicSession session =
 topicConnection.createTopicSession(false,
 Session.CLIENT_ACKNOWLEDGE);

 // find the topic
 Topic topic = (Topic) ctx.lookup("topic/weatherTopic");
 TopicPublisher publisher = session.createPublisher(topic);

 /**
 * There are five type message
 */

 // 1. text message
 TextMessage msg = session
 .createTextMessage("Hello, this is a text message. I got it.");
 publisher.send(msg);

 // 2. map message
 MapMessage mapMessage = session.createMapMessage();
 mapMessage.setString("hello",
 "I have seen the part of the world of Map Message");
 publisher.send(mapMessage);

 // 3. byte message
 BytesMessage bytesMessage = session.createBytesMessage();
 bytesMessage.setStringProperty("byte", "This is a byte message");
 publisher.send(bytesMessage);

 // 4. object message
 ObjectMessage objectMessage = session.createObjectMessage();
 objectMessage.setObject(new String(
 "The object can be any type of object"));
 publisher.send(objectMessage);

 // 5. stream message
 StreamMessage streamMessage = session.createStreamMessage();
 streamMessage.setStringProperty("stream",
 "stream messages usually are file and picture");
 publisher.send(streamMessage);

 } catch (JMSException e) {
 e.printStackTrace();
 } catch (NamingException e) {
 e.printStackTrace();
 }
 }

}

6.Run TopicMDBClient in MessageDrivenEJBClient project

7.Switch to jboss5 Console

12:16:40,109 INFO  [STDOUT] JBossTopic[weatherTopic]
12:16:40,109 INFO  [STDOUT] JBossTopic[weatherTopic]
12:16:40,109 INFO  [STDOUT] Hello, this is a text message. I got it.
12:16:40,109 INFO  [STDOUT] JBossTopic[weatherTopic]
12:16:40,109 INFO  [STDOUT] This is a byte message
12:16:40,109 INFO  [STDOUT] stream messages usually are file and picture
12:16:40,109 INFO  [STDOUT] JBossTopic[weatherTopic]
12:16:40,109 INFO  [STDOUT] JBossTopic[weatherTopic]
12:16:40,109 INFO  [STDOUT] I have seen the part of the world of Map Message
12:16:40,109 INFO  [STDOUT] The object can be any type of object

Create Message Driven Bean (2) –JMS Queue Client

Filed under: ejb, java, jboss, myeclipse — Tags: , , , — kaisechen @ 2:04 am

1. Create a Java project in MyEclipse, which name is MessageDrivenEJBClient

2.Import Jboss5 User Library in this project

3.Build a client class

import java.util.Properties;

import javax.jms.BytesMessage;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MapMessage;
import javax.jms.MessageProducer;
import javax.jms.ObjectMessage;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueSender;
import javax.jms.QueueSession;
import javax.jms.StreamMessage;
import javax.jms.TextMessage;
import javax.naming.InitialContext;
import javax.naming.NamingException;

public class QueueMDBClient {

 public static void main(String[] args) {
 Properties env = new Properties();
 env.put("java.naming.factory.initial",
 "org.jnp.interfaces.NamingContextFactory");
 env.put("java.naming.factory.url.pkgs",
 "org.jboss.naming:org.jnp.interfaces");
 env.put("java.naming.provider.url", "localhost");

 InitialContext ctx;
 try {
 ctx = new InitialContext(env);

 QueueConnectionFactory factory = (QueueConnectionFactory) ctx.lookup("ConnectionFactory");
 QueueConnection conn = factory.createQueueConnection();

 QueueSession session = conn.createQueueSession(false,QueueSession.AUTO_ACKNOWLEDGE);
 // find the destination
 Destination destination  = (Destination) ctx.lookup("queue/ztfQueue");
 MessageProducer producer = session.createProducer(destination);

 /**
 * There are five type message
 */
 // 1. text message (Yes)
 TextMessage msg = session
 .createTextMessage("Hello, this is a text message. I got it.");
 producer.send(msg);
 // 2. map message (No)
 MapMessage mapMessage = session.createMapMessage();
 mapMessage.setString("hello", "I have seen the part of the world of Map Message");
 producer.send(mapMessage);
 // 3. byte message (No)
 BytesMessage bytesMessage = session.createBytesMessage();
 bytesMessage.setStringProperty("byte", "This is a byte message");
 producer.send(bytesMessage);
 // 4. object message (No)
 ObjectMessage objectMessage = session.createObjectMessage();
 objectMessage.setObject(new String("The object can be any type of object"));
 producer.send(objectMessage);
 // 5. stream message (OK)
 StreamMessage streamMessage = session.createStreamMessage();
 streamMessage.setStringProperty("stream", "stream messages usually are file and picture");
 producer.send(streamMessage);
 producer.close();
 //EJB 2.1 rule
 Queue queue = (Queue)ctx.lookup("queue/ztfQueue");
 QueueSender sender = session.createSender(queue);
 msg = session.createTextMessage("Now, we use EJB 2.1 rule to send message.Hello, this is a text message.");
 sender.send(msg);
 sender.send(mapMessage);
 sender.send(bytesMessage);
 sender.send(objectMessage);
 sender.send(streamMessage);
 sender.close();
 //close session
 session.close();
 //close connection
 conn.close();
 } catch (JMSException e) {
 e.printStackTrace();
 } catch (NamingException e) {
 e.printStackTrace();
 }
 }
}

4. Run the java project

5. Swith to jboss5 Server Console in MyEclipse

We can see that the Queue MDB receives variety messages and prints them to console.

1:55:02,390 INFO  [STDOUT] JBossQueue[ztfQueue]
11:55:02,390 INFO  [STDOUT] JBossQueue[ztfQueue]
11:55:02,390 INFO  [STDOUT] JBossQueue[ztfQueue]
11:55:02,390 INFO  [STDOUT] JBossQueue[ztfQueue]
11:55:02,390 INFO  [STDOUT] JBossQueue[ztfQueue]
11:55:02,390 INFO  [STDOUT] Now, we use EJB 2.1 rule to send message.Hello, this is a text message.
11:55:02,390 INFO  [STDOUT] JBossQueue[ztfQueue]
11:55:02,406 INFO  [STDOUT] JBossQueue[ztfQueue]
11:55:02,406 INFO  [STDOUT] This is a byte message
11:55:02,406 INFO  [STDOUT] JBossQueue[ztfQueue]
11:55:02,406 INFO  [STDOUT] JBossQueue[ztfQueue]
11:55:02,406 INFO  [STDOUT] This is a byte message
11:55:02,406 INFO  [STDOUT] JBossQueue[ztfQueue]
11:55:02,406 INFO  [STDOUT] I have seen the part of the world of Map Message
11:55:02,406 INFO  [STDOUT] Hello, this is a text message. I got it.
11:55:02,406 INFO  [STDOUT] stream messages usually are file and picture
11:55:02,406 INFO  [STDOUT] stream messages usually are file and picture
11:55:02,421 INFO  [STDOUT] The object can be any type of object
11:55:02,421 INFO  [STDOUT] The object can be any type of object
11:55:02,421 INFO  [STDOUT] I have seen the part of the world of Map Message

Create Message Driven Bean (1) –JMS Queue

Filed under: ejb, java, jboss, myeclipse — Tags: , , — kaisechen @ 1:43 am

1. Create a new EJB project in MyEclipse, which name is MessageDrivenEJB

chose EJB3.0, don’t tick ‘Add support for Entity beans’

2.create a new Message Driven Bean class


chose Queue Destination Type

3. The QueueEJB class will automatically implements MessageListener and it will add MessageDriven etc annotation.

add ‘@ActivationConfigProperty(propertyName = “destination”, propertyValue = “queue/ztfQueue”)’

import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;
import javax.jms.BytesMessage;
import javax.jms.JMSException;
import javax.jms.MapMessage;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.ObjectMessage;
import javax.jms.StreamMessage;
import javax.jms.TextMessage;

@MessageDriven(mappedName = "jms/QueueEJB", activationConfig = {
 @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"),
 @ActivationConfigProperty(propertyName = "destination", propertyValue = "queue/ztfQueue"),
 @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue") })
public class QueueEJB implements MessageListener {

 public void onMessage(Message msg) {
 try {
 if(msg ==null){
 System.out.println("msg is null");
 return;
 }
 System.out.println(msg.getJMSDestination());// the name of message queue
 if (msg instanceof TextMessage) { //         1.text message
 TextMessage message = (TextMessage) msg;
 System.out.println(message.getText());
 } else if (msg instanceof MapMessage) {//    2.map message
 MapMessage mapMessage = (MapMessage) msg;
 if(mapMessage!=null){
 System.out.println(mapMessage.getString("hello"));
 }else{
 System.out.println(mapMessage);
 }
 } else if (msg instanceof ObjectMessage) {// 3. object message
 ObjectMessage objectMessage = (ObjectMessage) msg;
 if(objectMessage!=null){
 System.out.println(objectMessage.getObject());
 }else{
 System.out.println("objectMessage is null");
 }
 } else if (msg instanceof BytesMessage) {//  4. byte message
 BytesMessage bytesMessage = (BytesMessage) msg;
 System.out.println(bytesMessage.getStringProperty("byte"));
 } else if (msg instanceof StreamMessage) {// 5.stream message
 StreamMessage streamMessage = (StreamMessage) msg;
 System.out.println(streamMessage.getStringProperty("stream"));
 }
 } catch (JMSException e) {
 e.printStackTrace();
 }
 }

}

4.Build a destinations-service.xml under META-INF directory in MessageDrivenEJB project

destinations-service.xml

<?xml version="1.0" encoding="UTF-8"?>
<server>
<mbean code="org.jboss.mq.server.jmx.Queue" name="jboss.mq.destination:service=Queue,name=ztfQueue">
<attribute name="JNDIName">queue/ztfQueue</attribute>
<depends optional-attribute-name="DestinationManager">jboss.mq:service=DestinationManager</depends>
</mbean>
<mbean code="org.jboss.mq.server.jmx.Topic" name="jboss.mq.destination:service=Topic,name=weatherTopic">
<attribute name="JNDIName">topic/weatherTopic</attribute>
<depends optional-attribute-name="DestinationManager">jboss.mq:service=DestinationManager</depends>
</mbean>
</server>

5.run or restart Jboss5 server

6. Deploy the project into Jboss5 server


7. The result shown in console

11:38:48,203 INFO  [EJBContainer] STARTED EJB: com.jack.ejb.QueueEJB ejbName: QueueEJB
11:38:48,531 INFO  [EJBContainer] STARTED EJB: com.jack.ejb.TopicEJB ejbName: TopicEJB
11:38:48,859 INFO  [QueueService] Queue[queue/ztfQueue] started, fullSize=200000, pageSize=2000, downCacheSize=2000
11:38:49,062 INFO  [TopicService] Topic[topic/weatherTopic] started, fullSize=200000, pageSize=2000, downCacheSize=2000

July 26, 2010

EJB3 Annotation

Filed under: ejb, java, Technology — Tags: , , — kaisechen @ 6:06 am

1. Bean Types and Transaction and Security

2. Callbacks and Resources

3.Interceptors, Ealier View Client, Queries, ResultSetMapping

4.Object-Relational-Mapping

5.Relations, Inheritance

6.Embedded Values,Generators,Legend

Create EJB Enitiy Bean Example In MyEclipse (2)

Filed under: ejb, java, jboss, myeclipse, Technology — Tags: , , , — kaisechen @ 2:35 am

Now, we will create a JAVA project as the remote client invoking stateless session bean in EntityEJBUserManager project.

1. Create a Java project which name is ‘EntityEJBUserManagerClient’

2.import ‘EntityEJBUserManager.jar’ which exported through ‘EntityEJBUserManager’ project

3.import Jboss5 User Library which includes all jar in D:/jboss5/client/

4.import Hibernate3 User Library which includes the necessary jar of Hibernate 3.3.1

5. Create a client class

import java.util.List;
import java.util.Properties;

import javax.naming.InitialContext;
import javax.naming.NamingException;

import com.jack.ejb.domain.User;
import com.jack.ejb.inter.UserDAO;

public class UserDAOClient {

 /**
 * @param args
 */
 public static void main(String[] args) {
 Properties env = new Properties();
 env.put("java.naming.factory.initial",
 "org.jnp.interfaces.NamingContextFactory");
 env.put("java.naming.factory.url.pkgs",
 "org.jboss.naming:org.jnp.interfaces");
 env.put("java.naming.provider.url", "localhost");

 InitialContext ctx;
 UserDAO userdao;
 try {
 ctx = new InitialContext(env);
 userdao = (UserDAO) ctx.lookup("UserDAOBean/remote");

 System.out.println(".................................");
 System.out.println("Insert a user....................");
 boolean re = userdao.insert("Hello World", "Male");
 System.out.println("The result of insert a user is "+re);
 re = userdao.insert("EntityBean", "FeMale");
 System.out.println("The result of insert a user is "+re);

 System.out.println(".................................");
 System.out.println("Get a user.......................");

 User user = userdao.get(1);
 System.out.println("ID:1 and Name:"+user.getName()+" Sex:"+user.getSex());

 System.out.println(".................................");
 System.out.println("Update a user ...................");

 User user1 = userdao.get(1);
 user1.setName("UpdateEJB");
 userdao.update(user1);

 System.out.println("ID:"+user1.getId()+" and Name:"+user1.getName()+" Sex:"+user1.getSex());

 System.out.println(".................................");
 System.out.println("Get a user list..................");

 List<User> userlist = userdao.getUserList();
 for(User u:userlist){
 System.out.println("ID:"+u.getId()+" and Name:"+u.getName()+" Sex:"+u.getSex());
 }

 } catch (NamingException e) {
 e.printStackTrace();
 }
 }

}

6.run the java project and will get the result listed below

7. Check the MySQL database, and will have the result listed below

8. Check the admin console of jboss5, we can get more information

URL:http://localhost:8082/jmx-console/

Create EJB Enitiy Bean Example In MyEclipse (1)

Filed under: ejb, java, myeclipse, Technology — Tags: , , — kaisechen @ 1:59 am

EJB3 becomes more continent than EJB2. It saves a lot of time to build a EJB project using MyEclipse.

1. Create a new EJB project in MyEclipse, which name is ‘EntityEJBUserManager

Chose EJB3.0 , tick ‘Add support for Entity beans(add JPA capabilities)’

2.MyEclipse will automatically produce a “persistence.xml” file

2.1 configue jta data source,’java:/DefaultMySQLDS’

2.2 add property

<properties>
 <property name="hibernate.hbm2ddl.auto" value="create"/>
 </properties>

3. import MySQL  driver

4. copy D:\jboss5\docs\examples\jca\mysql-ds.xml and modify it, then copy the file into D:\jboss5\server\default\deploy

<?xml version="1.0" encoding="UTF-8"?>

<!-- $Id: mysql-ds.xml 41017 2006-02-07 14:26:14Z acoliver $ -->
<!--  Datasource config for MySQL using 3.0.9 available from:
http://www.mysql.com/downloads/api-jdbc-stable.html
-->

<datasources>
 <local-tx-datasource>
 <jndi-name>DefaultMySQLDS</jndi-name>
 <connection-url>jdbc:mysql://localhost:3308/ejb</connection-url>
 <driver-class>com.mysql.jdbc.Driver</driver-class>
 <user-name>ejb</user-name>
 <password>ejb</password>
 <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter</exception-sorter-class-name>
 <!-- should only be used on drivers after 3.22.1 with "ping" support
 <valid-connection-checker-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLValidConnectionChecker</valid-connection-checker-class-name>
 -->
 <!-- sql to call when connection is created
 <new-connection-sql>some arbitrary sql</new-connection-sql>
 -->
 <!-- sql to call on an existing pooled connection when it is obtained from pool - MySQLValidConnectionChecker is preferred for newer drivers
 <check-valid-connection-sql>some arbitrary sql</check-valid-connection-sql>
 -->

 <!-- corresponding type-mapping in the standardjbosscmp-jdbc.xml (optional) -->
 <metadata>
 <type-mapping>mySQL</type-mapping>
 </metadata>
 </local-tx-datasource>
</datasources>

Please notice: the name of jndi-name is ‘DefaultMySQLDS’, match the jta-data-source in persistence.xml

5. Create a Entity Bean ‘User’

please notice annotation ‘Entity’ and ‘Table’ above class  and ‘ID’ above id property.

import java.io.Serializable;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name="User")
public class User implements Serializable {
 /**
 *
 */
 private static final long serialVersionUID = 6136720247591443052L;
 private int id;
 private String name;
 private String sex;

 @Id
 @GeneratedValue(strategy=GenerationType.AUTO)
 public int getId() {
 return id;
 }

 public void setId(int id) {
 this.id = id;
 }

 public String getName() {
 return name;
 }

 public void setName(String name) {
 this.name = name;
 }

 public String getSex() {
 return sex;
 }

 public void setSex(String sex) {
 this.sex = sex;
 }

}

6. Create a interface ‘UserDAO’

import java.util.List;

import com.jack.ejb.domain.User;

public interface UserDAO {
 public boolean insert(String name,String sex);
 public User get(int id);
 public List<User> getUserList();
 public boolean update(User user);
}

7. Create a stateless session bean ‘UserDAOBean’ implements UserDAO

please notice it uses ‘Remote’ annotation

import java.util.List;

import javax.ejb.Remote;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import com.jack.ejb.domain.User;
import com.jack.ejb.inter.UserDAO;

@Stateless
@Remote(UserDAO.class)
public class UserDAOBean implements UserDAO {
 @PersistenceContext
 protected EntityManager em; 

 public User get(int id) {
 User user = em.find(User.class, Integer.valueOf(id));
 return user;
 }

 @SuppressWarnings("unchecked")
 public List<User> getUserList() {
 Query query = em.createQuery("from User order by name");
 return (List<User>)query.getResultList();
 }

 public boolean insert(String name, String sex) {
 User user = new User();
 user.setName(name);
 user.setSex(sex);
 em.persist(user);
 return true;
 }

 public boolean update(User user) {
 em.merge(user);
 return true;
 }

}

8. Export ‘User’ class and ‘UserDAO’ interface into ‘EntityEJBUserManager.jar’, so java client project can import it later.

9. run jboss 5 server

10. Deploy the EJB project into Jboss 5 server

July 25, 2010

The methods invoking EJB from Clients (4) — Remote Web Client

Filed under: ejb, java, myeclipse, Technology — Tags: , , — kaisechen @ 4:17 am

The third method invoking EJB from client is ‘Remote Web Client’.

1.Create a Web Project in MyEclipse, which name is SessionEJBUserManagerWebRemoteClient

2. Modify index.jsp

<%@ page language="java" import="javax.naming.*;,com.jack.inter.*;" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
 <head>
 <title>My JSP 'index.jsp' starting page</title>
 <meta http-equiv="pragma" content="no-cache">
 <meta http-equiv="cache-control" content="no-cache">
 <meta http-equiv="expires" content="0">
 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
 <meta http-equiv="description" content="This is my page">
 </head>

 <body>
 <%
 UserManager userMan;

 try {
 Properties env = new Properties();

 env.put("java.naming.factory.initial",
 "org.jnp.interfaces.NamingContextFactory");

 env.put("java.naming.factory.url.pkgs",
 "org.jboss.naming:org.jnp.interfaces");

 env.put("java.naming.provider.url", "localhost");

 InitialContext ctx = new InitialContext(env);

 userMan = (UserManager) ctx.lookup("UserManagerBean/remote");

 User user = userMan.addUser("Hello", "World");
 out.println("User ID:" + user.getId() + " and Username:"
 + user.getUsername() + " and Password:"
 + user.getPassword() + "<br>");

 User user2 = new User();
 User user3 = userMan.updateUser(user2, "Update username",
 "Update password");
 out.println("User ID:" + user3.getId() + " and Username:"
 + user3.getUsername() + " and Password:"
 + user3.getPassword());
 } catch (NamingException e) {
 e.printStackTrace();
 }

 } catch (java.lang.Exception e
 %>
 </body>
</html>

3.Modify EJB UserManagerBean in SessionEJBUserManager Project

Adjust local annotation to remote

import javax.ejb.Remote;
import javax.ejb.Stateless;

import com.jack.inter.User;
import com.jack.inter.UserManager;

@Stateless
@Remote
//@Local
public class UserManagerBean implements UserManager {

 public User addUser(String name, String password) {
 User user = new User();
 user.setUsername(name);
 user.setPassword(password);
 user.setId(100);
 return user;
 }
.
.
.

4.Re-deploy SessionEJBUserManager Project into Jboss5 server

5.In SessionEJBUserManagerWebRemoteClient Project,import SessionEJB.jar

SessionEJB.jar includes the User POJO class and UserManager interface of SessionEJBUserManager Project

6.In SessionEJBUserManagerWebRemoteClient Project,import “jboss5-without-servlet” user library

6.1 Go to Jboss client directory, copy jboss-javaee into jboss-javaee-without-servlet

6.2Open jboss-javaee-without-servlet.jar using winrar, delete servlet directory.

The purpose of removing servlet directory is because tomcat container has own servlet.

6.3. The size of jboss-javaee-without-servlet is smaller than that of jboss-javaee

6.4.In MyEclipse, create a new User Library —“jboss5-without-servlet”, add all jars except jboss-javaee under jboss5 client directory   into it.

6.5. Add jboss5-without-servlet User Library to the remote web client project

6. Deploy SessionEJBUserManagerWebClient project into Tomcat 6 server



7.Run tomcat 6 server


8. Run the remote web client

The methods invoking EJB from Clients (3) — Local Web Client

Filed under: ejb, java, myeclipse, Technology — Tags: , , — kaisechen @ 3:17 am

The second method invoking EJB from client is ‘Local Web Client’.

1.Create a Web Project in MyEclipse,which name is SessionEJBUserManagerWebClient

2. Modify index.jsp

<%@ page language="java" import="javax.naming.*,com.jack.inter.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
 <head>
 <title>My JSP 'index.jsp' starting page</title>
 <meta http-equiv="pragma" content="no-cache">
 <meta http-equiv="cache-control" content="no-cache">
 <meta http-equiv="expires" content="0">
 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
 <meta http-equiv="description" content="This is my page">
 </head>

 <body>
<%
 InitialContext ctx = new InitialContext();
 UserManager userMan;

 try {
 userMan = (UserManager) ctx.lookup("UserManagerBean/local");

 User user = userMan.addUser("Hello", "World");
 out.println("User ID:" + user.getId() + " and Username:"
 + user.getUsername() + " and Password:"
 + user.getPassword()+"<br>");

 User user2 = new User();
 User user3 = userMan.updateUser(user2, "Update username",
 "Update password");
 out.println("User ID:" + user3.getId()
 + " and Username:" + user3.getUsername()
 + " and Password:" + user3.getPassword());
 } catch (NamingException e) {
 e.printStackTrace();
 }
 %>        
 </body>
</html>

3.Modify EJB UserManagerBean in SessionEJBUserManager Project

Adjust remote annotation to local

import javax.ejb.Local;
import javax.ejb.Stateless;

import com.jack.inter.User;
import com.jack.inter.UserManager;

@Stateless
//@Remote
@Local
public class UserManagerBean implements UserManager {

 public User addUser(String name, String password) {
 User user = new User();
 user.setUsername(name);
 user.setPassword(password);
 user.setId(100);
 return user;
 }
.
.
.

4.Re-deploy SessionEJBUserManager Project into Jboss5 server

5.In SessionEJBUserManagerWebClient Project, add SessionEJBUserManager Project as dependency project

6. Deploy SessionEJBUserManagerWebClient project into JBoss 5 server

7.Run the web client


The methods invoking EJB from Clients (2) — Java Application Remote Client

Filed under: ejb, java, myeclipse, Technology — Tags: , , — kaisechen @ 2:40 am

The first method invoking EJB from client is ‘JAVA Application Remote Client’.

1.Create a JAVA Application project as  the remote client to invoke the EJB of SessionEJBUserManager, which name is SessionEJBUserManagerClient

2.Export User POJO class and UserManager interface into a jar in SessionEJBUserManager project

3.import exported SessionEJB.jar into SessionEJBUserManagerClient project

4. Add the JEE library into the Client Project

5.Create SessionUserManagerRemoteClient Class in Client project

import java.util.Properties;

import javax.naming.InitialContext;
import javax.naming.NamingException;

import com.jack.inter.User;
import com.jack.inter.UserManager;

public class SessionUserManagerRemoteClient {

 /**
 * @param args
 */
 public static void main(String[] args) {
 Properties env = new Properties();
 env.put("java.naming.factory.initial",
 "org.jnp.interfaces.NamingContextFactory");
 env.put("java.naming.factory.url.pkgs",
 "org.jboss.naming:org.jnp.interfaces");
 env.put("java.naming.provider.url", "localhost");

 InitialContext ctx;
 UserManager userMan;
 try {
 ctx = new InitialContext(env);
 userMan = (UserManager) ctx.lookup("UserManagerBean/remote");

 User user = userMan.addUser("Hello", "World");
 System.out.println("User ID:" + user.getId() + " and Username:"
 + user.getUsername() + " and Password:"
 + user.getPassword());

 User user2 = new User();
 User user3 = userMan.updateUser(user2, "Update username",
 "Update password");
 System.out.println("User ID:" + user3.getId() + " and Username:"
 + user3.getUsername() + " and Password:"
 + user3.getPassword());
 } catch (NamingException e) {
 e.printStackTrace();
 }

 }

}

6.run client

7. The result

The methods invoking EJB from Clients (1)–Create A EJB Project

Filed under: ejb, java, myeclipse, Technology — Tags: , , — kaisechen @ 1:59 am

There are several methos invoking EJB from clients, including java remote client, web local client etc.

Let us build a session EJB project first.

1. Build a new EJB project in MyEclipse, which name is SessionEJBUserManager

2.create a Serializable POJO class User

import java.io.Serializable;

public class User implements Serializable {
 /**
 *
 */
 private static final long serialVersionUID = -9011491680424647685L;
 private int id;
 private String username;
 private String password;

 public int getId() {
 return id;
 }

 public void setId(int id) {
 this.id = id;
 }

 public String getUsername() {
 return username;
 }

 public void setUsername(String username) {
 this.username = username;
 }

 public String getPassword() {
 return password;
 }

 public void setPassword(String password) {
 this.password = password;
 }

}

3.create UserManager interface

public interface UserManager {
 public User addUser(String name,String password);
 public User updateUser(User user,String name,String password);
}

4.create a Stateless Session Bean implements UserManager

import com.jack.inter.User;
import com.jack.inter.UserManager;

@Stateless
@Remote
//@Local
public class UserManagerBean implements UserManager {

 public User addUser(String name, String password) {
 User user = new User();
 user.setUsername(name);
 user.setPassword(password);
 user.setId(100);
 return user;
 }

 public User updateUser(User user, String name, String password) {
 user.setUsername(name);
 user.setPassword(password);
 user.setId(999);
 return user;
 }
}

5.Deploy the EJB project into JBOSS5 server

6.run Jboss5

Older Posts »

Blog at WordPress.com.