Про то, как можно использовать компоненты управляемые сообщениями (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
    • my_application-web.war
      • META-INF
        • MANIFEST.MF
      • WEB-INF
        • classes
          • my
            • web
              • ApplicationServlet.class
        • web.xml

Расположение файлов классов и метаинформации зависит от конкретного сервера приложений. В данном случае нам интересно содержание файлов application.xml, ejb-jar.xml, orion-ejb-jar.xml и web.xml.

 

Файлы, используемые в статье.

Страница:

Александр Смелков
Санкт-Петербург Весна 2007