- Статьи и примеры
- | Использование mdb
- | Про то, как можно использовать компоненты управляемые сообщениями (message driven beans) на практике.
- | Про то, как можно использовать компоненты управляемые сообщениями (message driven beans) на практике страница 3
Про то, как можно использовать компоненты управляемые сообщениями (Message Driven Beans) на практике Страница 3
8. Класс сервлета. Метод doPost. Описание основного цикла.
// false - need prepare new message and send it, true - wait boolean isCycleWaiting= false; // total messages int totalMessages = 10000; // total started messages int startedMessages= 0; // started messages. less or equal 50! int runningMessages= 0; // total messages int maxWorkingMessages = Integer.parseInt(System.getProperty("max_workers")); // prepare test messages list List> messageList = new ArrayList>(); for (int i = 0; i < 20000; i++) { HashMap in = new HashMap(); in.put("code", "code-" + i); in.put("id", "id-" + i); messageList.add(in); } try { while (startedMessages < totalMessages) { // Whether it is a messging or waiting cycle? if (!isCycleWaiting) { // Messaging cycle: //get next message data HashMap selected = messageList.get(0); messageList.remove(0); // Prepare message parameters Map messageParams = new Hashtable(); messageParams.put("code", selected.get("code")); messageParams.put("id", selected.get("id")); // Send message: Message message = jmsWorkerSession.createMessage(); for (String key : messageParams.keySet()) message.setStringProperty(key, messageParams.get(key)); message.setJMSExpiration(15 * 1000); jmsWorkerSession.createSender(jmsWorkerQueue).send(message); startedMessages++; runningMessages++; if (runningMessages >= maxWorkingMessages) { // we runs enough messages. // let's wait. isCycleWaiting = true; } Thread.yield(); continue; } // Waiting cycle: // Get difference of total and finished messages. int workedMessages = Math.abs(startedMessages - Integer.parseInt(System.getProperty("workers_counter"))); if (workedMessages < maxWorkingMessages) { // Waiting cycle finished: isCycleWaiting = false; // Continue with messaging, but yield some time to CPU: Thread.yield(); continue; } // Wait for workers: Thread.sleep(500); }
9. Здесь кусочек кода Работника. Как видим, он принимает параметры и посылает запрос(тут не имплементировано). После этого изменяет переменную, тем самым информируя сервлет об освободивщейся вакансии.
public void onMessage(Message message) { // TODO Auto-generated method stub String id = null; String code = null; try { id = message.getStringProperty("id"); code = message.getStringProperty("code"); } catch (JMSException e) { e.printStackTrace(); } logger.debug("onMessage started with id: " + id + " Code: "+code); int workers_counter = Integer.parseInt(System.getProperty("workers_counter")); workers_counter++; System.setProperty("workers_counter",String.valueOf(workers_counter)); }
10. Посмотрим на содержание архива с нашим приложеним.
- my_application.ear
- META-INF
- application.xml
- MANIFEST.MF
- my_application-ejb.jar
- META-INF
- MANIFEST.MF
- ejb-jar.xml
- orion-ejb-jar.xml
- my
- ejb
- bean
- ApplicationWorker.class
- bean
- ejb
- META-INF
- my_application-web.war
- META-INF
- MANIFEST.MF
- WEB-INF
- classes
- my
- web
- ApplicationServlet.class
- web
- my
- web.xml
- classes
- META-INF
- META-INF
Расположение файлов классов и метаинформации зависит от конкретного сервера приложений. В данном случае нам интересно содержание файлов application.xml, ejb-jar.xml, orion-ejb-jar.xml и web.xml.
Файлы, используемые в статье.
- Сервер приложений Orion можно получить на сайте создателя.
- Версия 2.0.7 Просто распакуйте его на диск. Желательно чтобы в названиях папок не было пробелов. У нас негативных прецедентов не было.
- Скопируйте в корень Tools.jar из JDK. Архив с измененными файлами настройки Orion. .zip Упакованное тестовое приложение. .ear
- Мы разрабатываем в системе Windows. Так получилось. Это тестовое приложение располагалось в c:/orion/applications.
- Если Вам необходимо запустить его в Linux/Unix - поменяйте пути. It works. Метафайлы посмотреть. application.xml, ejb-jar.xml, orion-ejb-jar.xml и web.xml
Санкт-Петербург Весна 2007