Про то как создать и развернуть на сервере приложений JBoss простой message driven bean используя аннотации спецификации EJB3. Страница 3

Пару слов о жизненном цикле бинов

Слегка расширим пример. Заменим строку 26 в SimpleMessageBean на следующую:

System.out.println("MESSAGE BEAN["+this.toString()+"]: Message received: "  + msg.getText());

Заново развертываем MDB и запускаем клиента. Что мы видим.

15:36:08,546 INFO  [STDOUT] MESSAGE BEAN[mdbtest.SimpleMessageBean@127a1d8]:Message received: This is 7 message to SimpleMessageBean
15:36:08,546 INFO  [STDOUT] MESSAGE BEAN[mdbtest.SimpleMessageBean@1cbf6bb]:Message received: This is 10 message to SimpleMessageBean
15:36:08,546 INFO  [STDOUT] MESSAGE BEAN[mdbtest.SimpleMessageBean@1b3a74d]:Message received: This is 12 message to SimpleMessageBean
15:36:08,546 INFO  [STDOUT] MESSAGE BEAN[mdbtest.SimpleMessageBean@1ace672]:Message received: This is 2 message to SimpleMessageBean
15:36:08,546 INFO  [STDOUT] MESSAGE BEAN[mdbtest.SimpleMessageBean@4d4f6e]:Message received: This is 11 message to SimpleMessageBean
15:36:08,546 INFO  [STDOUT] MESSAGE BEAN[mdbtest.SimpleMessageBean@199f755]:Message received: This is 6 message to SimpleMessageBean
15:36:08,546 INFO  [STDOUT] MESSAGE BEAN[mdbtest.SimpleMessageBean@13cf887]:Message received: This is 8 message to SimpleMessageBean
15:36:08,546 INFO  [STDOUT] MESSAGE BEAN[mdbtest.SimpleMessageBean@1e07f4b]:Message received: This is 5 message to SimpleMessageBean
15:36:08,546 INFO  [STDOUT] MESSAGE BEAN[mdbtest.SimpleMessageBean@1c53bd7]:Message received: This is 3 message to SimpleMessageBean
15:36:08,546 INFO  [STDOUT] MESSAGE BEAN[mdbtest.SimpleMessageBean@1dbe1c9]:Message received: This is 9 message to SimpleMessageBean
15:36:08,546 INFO  [STDOUT] MESSAGE BEAN[mdbtest.SimpleMessageBean@c48b77]:Message received: This is 1 message to SimpleMessageBean
15:36:08,546 INFO  [STDOUT] MESSAGE BEAN[mdbtest.SimpleMessageBean@1a072a6]:Message received: This is 4 message to SimpleMessageBean

Из этого можно сделать выводы о том, что для каждого сообщения контейнер создал свой экземпляр нашего MDB. Ну и еще раз убедились в асинхронности сообщений.

Еще раз запустим клиента, без перезапуска сервера и увидим следующий результат:

15:43:24,781 INFO  [STDOUT] MESSAGE BEAN[mdbtest.SimpleMessageBean@1dbe1c9]:Message received: This is 1 message to SimpleMessageBean
15:43:24,781 INFO  [STDOUT] MESSAGE BEAN[mdbtest.SimpleMessageBean@1dbe1c9]:Message received: This is 2 message to SimpleMessageBean
15:43:24,843 INFO  [STDOUT] MESSAGE BEAN[mdbtest.SimpleMessageBean@1dbe1c9]:Message received: This is 3 message to SimpleMessageBean
15:43:24,859 INFO  [STDOUT] MESSAGE BEAN[mdbtest.SimpleMessageBean@1dbe1c9]:Message received: This is 5 message to SimpleMessageBean
15:43:24,875 INFO  [STDOUT] MESSAGE BEAN[mdbtest.SimpleMessageBean@1a072a6]:Message received: This is 6 message to SimpleMessageBean
15:43:24,890 INFO  [STDOUT] MESSAGE BEAN[mdbtest.SimpleMessageBean@13cf887]:Message received: This is 4 message to SimpleMessageBean
15:43:24,906 INFO  [STDOUT] MESSAGE BEAN[mdbtest.SimpleMessageBean@c48b77]:Message received: This is 7 message to SimpleMessageBean
15:43:24,906 INFO  [STDOUT] MESSAGE BEAN[mdbtest.SimpleMessageBean@1c53bd7]:Message received: This is 8 message to SimpleMessageBean
15:43:24,906 INFO  [STDOUT] MESSAGE BEAN[mdbtest.SimpleMessageBean@1e07f4b]:Message received: This is 9 message to SimpleMessageBean
15:43:24,906 INFO  [STDOUT] MESSAGE BEAN[mdbtest.SimpleMessageBean@1dbe1c9]:Message received: This is 10 message to SimpleMessageBean
15:43:24,968 INFO  [STDOUT] MESSAGE BEAN[mdbtest.SimpleMessageBean@1a072a6]:Message received: This is 11 message to SimpleMessageBean
15:43:24,968 INFO  [STDOUT] MESSAGE BEAN[mdbtest.SimpleMessageBean@1a072a6]:Message received: This is 12 message to SimpleMessageBean

Контейнер использует уже созданные экземпляры MDB и не создает новые. И не надо пытаться управлять жизненным циклом бинов. Контейнер сделает это за Вас и сделает неплохо.

Различные параметры JMS можно найти и изменить в настроечных XML файлах C:\jboss\server\default\deploy\jms.

Пример второй. J2EE application

Настало время усложнить задачу. Создадим простой сервлет, один entity bean, соединим все вместе и посмотрим как это будет работать. Сервлет пошлет десяток сообщений нашему MDB. MDB должен принять сообщения а entity bean записать в таблицу. Далее тот же сервлет их просто прочитает. Уточню сразу - в задачу не входит дожидаться в сервлете того момента когда все сообщения будут обработаны.

Делать все будем по взрослому - создадим EAR файл, в котором как и полагается будет WAR и JAR. Все элементарно просто.
Итак...

Добавим еще несколько библиотек в проектную папку /libs/ Это будут ejb3-persistence.jar, jboss-annotations-ejb3.jar, jboss-ejb3-client.jar и servlet-api.jar. Эти библиотеки надо взять из сервера приложений JBoss. Как я уже говорил они будут необходимы для сборки прокта антом. Не забудем подключить их к проекту.

Entity bean

Создадим простой entity bean. Он действительно очень простой. Вот такой:

 package mdbtest.entity;

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

 @Entity
 @Table(name="MESSAGE_TABLE")
 @SequenceGenerator(name = "MESSAGE_TABLE_SEQUENCE", sequenceName = "MESSAGE_TABLE_ID_SEQ")
 public class SimpleEntity implements java.io.Serializable {
  
  private static final long serialVersionUID = 1L;
  
  @Id
  @GeneratedValue(strategy = GenerationType.AUTO, generator = "MESSAGE_TABLE_SEQUENCE")
  @Column(name="USER_ID", nullable=false, columnDefinition="integer")
  private long _id;

  @Column(name="MESSAGE", nullable=false, columnDefinition="varchar(255)")
  private String _message;

  public SimpleEntity(){}  
  
  public long get_id() {
   return _id;
  }
  public void set_id(long _id) {
   this._id = _id;
  }
  public String get_message() {
   return _message;
  }
  public void set_message(String msg) {
   _message = msg;
  }  
 }

Подключение datasource к проекту

Подключим datasource к проекту. Для этого создадим в корне проекта папку META-INF и в ней один XML файл - persistemce.xml Запишем в него описание datasource.

 <persistence>
 <persistence-unit name="MDBTest">
 <jta-data-source>java:/MySqlDS</jta-data-source>
 <properties>
 <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
 </properties>
 </persistence-unit>
 </persistence>

Application.xml и web.xml

Создадим в корне проекта папку META-INF с файлом application.xml. Запишем в него следующее:

 <?xml version="1.0" encoding="UTF-8"?>
 <application id="Application_ID" version="1.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/application_1_4.xsd">
 <display-name>MDBTest</display-name>
 
  <module>
   <ejb>MDBTest.jar</ejb>
  </module>  
  
  <module id="MDBTest">
   <web>
    <web-uri>mdbtestweb.war</web-uri>
    <context-root>mdbtestweb</context-root>
   </web>
  </module>
  
 </application>

Взглянув на текст application.xml сразу становиться понятно как все будет назваться.

Далее создадим папку WEB-INF и файл web.xml Вот он:

 <?xml version="1.0" encoding="UTF-8"?>
 <web-app id="web-app_1" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4">
  <display-name>mdbTestServlet</display-name>
  
  <servlet>
   <description>
   </description>
   <display-name>SimpleServlet</display-name>
   <servlet-name>SimpleServlet</servlet-name>
   <servlet-class>mdbtest.web.SimpleServlet</servlet-class>
  </servlet>
  
  <servlet-mapping>
   <servlet-name>SimpleServlet</servlet-name>
   <url-pattern>/SimpleServlet</url-pattern>
  </servlet-mapping>
  
 </web-app>

Подключение EntityManager

Теперь изменим наш MDB так чтобы он мог записывать сообщения в базу. Это совсем просто. Вот так:

Аннотацией подключим EntityManager

@PersistenceContext
EntityManager em;

В методе onMessage добавим такие строчки:

 SimpleEntity messageStore = new SimpleEntity();
 TextMessage msg = null;
 try {
  msg = (TextMessage) inMessage;
  System.out.println("MESSAGE BEAN["+this.toString()+"]: Message received: " + msg.getText());
  messageStore.set_message(msg.getText());
  em.persist(messageStore);

Этим кодом создаются entity бины и сообщения сохраняются в базе.

Страница: