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