- Статьи и примеры
- | Использование mdb
- | Про то как создать и развернуть на сервере приложений jboss простой message driven bean используя аннотации спецификации ejb3.
- | Про то как создать и развернуть на сервере приложений jboss простой message driven bean используя аннотации спецификации ejb3. страница 3
Про то как создать и развернуть на сервере приложений 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 бины и сообщения сохраняются в базе.
