- Статьи и примеры
- | Использование 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 бины и сообщения сохраняются в базе.