Messaging e Filas

O que é um Message-Driven Bean (MDB)?

Point-to-point messaging

jms-pointToPoint.gif (10475 bytes)

Publish-subscribe messaging

jms-publishSubscribe.gif (17768 bytes)

Consumo de mensagens

Como MDBs são diferentes de Entity beans ou Session beans?

Quando usar MDBs

Um Exemplo

O problema

A necessidade de processamento concorrente

EJB e o processamento concorrente

jw-0718-mdb1.gif (15590 bytes)

Concorrência num ambiente EJB usando MDBs

jw-0718-mdb2.gif (21384 bytes)

Considerações de design

Código para o componente de pesquisa

/* Step 1: Create a unique key, use some class, say
   UniqueKeyCreater. **/

String uniqueKey = UniqueKeyCreater.getKey();
String retailers [] = new String []{"A", "B", "C"};

/* Step 2: Put three messages in the REQUESTQ, one for each retailer.
   Define a header called "KEY" and set its value to uniqueKey            
   Note: The retailer MDBs also have to set the same header/value
   in the response messages. **/

QueueSender queueSender = queueSession.createSender(requestQueue);
Message message = queueSession.createTextMessage();
message.setStringProperty("KEY",uniqueKey);

for(int i = 0; i < retailers.length; i++) {
     message.setText("Retailer:" + retailers[i] + ",Item:" + itemName);
     queueSender.send(message);
}

/* Step 3: Now wait for messages in the response queue. Get only those
   messages that have the header KEY with value set to uniqueKey.
   Use a JMS selector for this purpose. The while loop will break if
all
   three responses arrive in RESPONSEQ or 30 seconds are over. Even if
   all three response messages do not arrive in 30 seconds, the code
   will be out of while loop, ensuring a guaranteed response time of 30
   seconds. **/

String selector = "KEY = '" + uniqueKey + "'";

QueueReceiver queueReceiver =
queueSession.createReceiver(responseQueue, selector);

long startTime = System.currentTimeMillis();
int messagesExpected = retailers.length;
long waitTime = 30000; // 30 seconds
Vector responses = new Vector(retailers.length);

while(messagesExpected > 0 && waitTime > 0 ) {

    Message rcvdMsg = queueReceiver.receive(waitTime);

     //Check if we got a msg, if not then break.
      if (rcvdMsg == null){
        //Wait time expired.
         break;
      }
      responses.add(rcvdMsg);

      messagesExpected--;

      waitTime = 30000 - (System.currentTimeMillis() - startTime);
}

Tempo de resposta garantido

Bibliografia