Tuesday 4 May 2010

Componente bazate pe mesaje (Message Driven Beans)

O componentă bazată pe mesaje (message-driven bean, MDB) este o componentă fără stare care consumă mesaje dintr-o coadă JMS (Java Message Service). Standardul JMS este parte integrantă din Java EE şi implementează suportul pentru comunicaţii asincrone pe această platformă. Mai concret, este vorba despre dirijarea mesajelor către destinaţii denumite cozi şi distribuirea acestor mesaje către consumatori.

O componentă MDB defineşte o metodă, onMessage(), care este apelată de către containerul EJB ori de câte ori este primit un mesaj în coada la care este asociată componenta. O componentă de tip MDB nu poate fi apelată direct de către clienţi.

Resursele necesare transmiterii mesajelor folosind JMS sunt:
- un obiect de tip ConnectionFactory, care conţine parametrii pentru configurarea conexiunii. Acest obiect este folosit de clienţi la crearea conexiunilor cu providerul de JMS.
- un obiect de tip Queue, coada propriu-zisă de mesaje.
- o destinaţie fizică.

Cele trei resurse pot fi create folosind consola grafică de administrare a serverului de aplicaţii, ca în imaginile de mai jos.


Ca exerciţiu, am creat fişierul PrimaCBM.java, cu următorul conţinut:

import javax.ejb.MessageDriven;
import javax.jms.MessageListener;
import javax.jms.Message;
import javax.jms.TextMessage;
import java.util.logging.Logger;

@MessageDriven(name="PrimaCBM",mappedName="jms/Queue")
public class PrimaCBM implements MessageListener {
    static final Logger registru = Logger.getLogger("PrimaCBM");
   
    public PrimaCBM(){}

    public void onMessage(Message mesaj) {
        try {         
           String text = mesaj.getStringProperty("text");
           registru.info("CBM a primit mesajul:"+text);
            }
        catch (Exception e) {
            e.printStackTrace();
        }
    }
}

La primirea unui mesaj containerul apelează metoda onMessage(). Vom înregistra primirea mesajului într-unul dintre fişierele de jurnalizare ale serverului de aplicaţii. În acest scop folosim un obiect de tipul Logger, definit în pachetul java.util.logging. Conţinutul fişierului de jurnalizare poate fi vizualizat şi prin intermediul consolei grafice de administrare a serverului.

Compilaţi componenta şi construiţi arhiva CBM.jar, folosind următoarele comenzi:

C:\EJB>javac -classpath .;C:\glassfishv3\glassfish\lib\javaee.jar PrimaCBM.java

C:\EJB>jar cvf CBM.jar PrimaCBM.class

Încărcaţi arhiva CBM.jar pe serverul de aplicaţii, folosind consola grafică de administrare şi specificând tipul arhivei ca fiind EJB Jar.

Pentru a trimite mesaje către componenta definită am creat programul CBMClient.java, a cărui sursă este redată mai jos.

import javax.jms.ConnectionFactory;
import javax.jms.Queue;
import javax.jms.Connection;
import javax.jms.Session;
import javax.jms.MessageProducer;
import javax.jms.TextMessage;
import javax.jms.Message;

import javax.naming.InitialContext;


public class CBMClient {

public static void main(String[] args) {

System.out.println("Hi!");

try {

    InitialContext ctx = new InitialContext();
    System.out.println("S-a creat InitialContext"); 
    ConnectionFactory connectionFactory =
(ConnectionFactory) ctx.lookup("firstJMS_pool");
    System.out.println("S-a creat ConnectionFactory");
    Queue coadaMesaje = (Queue) ctx.lookup("jms/Queue");
    System.out.println("S-a creat Queue"); 

    Connection conexiune = null;
    Session sesiune = null;
    MessageProducer expeditor = null;
    Message mesaj = null;

conexiune = connectionFactory.createConnection();
    System.out.println("S-a creat conexiunea");

sesiune = conexiune.createSession(false, Session.AUTO_ACKNOWLEDGE);
expeditor = sesiune.createProducer(coadaMesaje);
mesaj = sesiune.createMessage();

mesaj.setStringProperty("text","Testez CBM");

    expeditor.send(mesaj);

System.out.println("Am trimis mesajul:"+mesaj.getStringProperty("text"));

    expeditor.close();
    sesiune.close();
    conexiune.close();
}
catch(Exception e){System.out.println("Exceptie: " + e.toString());}
} // main
} // class


Compilaţi şi executaţi programul client folosind următoarele comenzi:

C:\EJB\clienti>javac -classpath .;C:\glassfishv3\glassfish\lib\javaee.jar CBMClient.java

C:\EJB\clienti>java -classpath .;C:\glassfishv3\glassfish\lib\appserv-rt.jar;C:\glassfishv3\glassfish\lib\install\applications\jmsra\imqjmsra.jar;C:\glassfishv3\glassfish\lib\appserv-admin.jar;C:\glassfishv3\glassfish\lib\appserv-ws.jar;C:\glassfishv3\glassfish\lib\javaee.jar CBMClient


Mesajul primit înregistrat în fişierul de jurnalizare poate fi văzut şi prin intermediul consolei grafice de administrare a serverului, aşa cum este ilustrat în imaginile de mai jos.


No comments: