venerdì 7 settembre 2012

Configurare il RAR di ActiveMQ 5.5.1 con JBoss 7.1.1

In questo articolo vedremo come configurare ActiveMQ 5.5.1 con il resource adapter all’interno di JBoss 7.1.1.
Questa operazioni apparentemente semplice e standard è risultata complicata a causa di alcuni bug documentati. Nel caso specifico, tutto sembrava funzionare normalmente tranne per il fatto che non era possibile recuperare la Connection Factory via JNDI.

Vediamo quindi la procedura corretta per le due versioni software in oggetto (si perchè sembra che usando la snapshoot 5.6 di AMQ forse il problema sia risolto ma magari ne troveremo altri quattro o cinque di natura differente, no comment, in questi casi ODIO l’informatica).

Andiamo con ordine, la procedura standard sarebbe la seguente:

  1. Il Resource Adapter va scompattato all’interno della cartella “standalone/deployments” e rinominato in maniera generica “activemq-ra.rar”.
  2. Modificate il file “META-INF/ra.xml” ed eventualmente “broker-config.xml” per configurare il broker a seconda delle caratteristiche con cui lo volete far partire. Potete fare riferimento a questo link https://community.jboss.org/wiki/IntegratingActiveMQWithJBoss per i dettagli su come configurare i file di ActiveMQ.
  3. Normalmente dovremmo definire il resource adapter all’interno del file “standalone.xml” del nostro JBoss (nell’ipotesi di lanciare JBoss in versione standalone magari attraverso Eclipse che penso sia il caso più comune). Questo è ben documentato sul sito di JBoss: https://docs.jboss.org/author/display/AS71/Resource+adapters

Questa modalità di configurazione non funziona dato che, come anticipato, avrete prima problemi con il JNDI e dopo, se sbloccate un pò la cosa, avrete errori perchè il RAR viene "deployato" 2 volte mandando in rollback l’intera procedura.

Occorre quindi procedere in questo modo:

  1. Seguite i precedenti punti 1 e 2.
  2. All’interno del file “META-INF/ra.xml” lasciate solo la prima definizione di ConnectionFactory, quella generica non specifica per Queue o Topic. Le altre eliminatele. Qui trovate il sorgente di esempio: https://community.jboss.org/servlet/JiveServlet/download/723928-53361/ra.xml
  3. Create il file “META-INF/ironjacamar.xml” scaricando questo sorgente: https://community.jboss.org/servlet/JiveServlet/download/723928-53362/ironjacamar.xml.
  4. Iron Jacamar è il framework di riferimento JBoss per la gestione dei connettori JCA.
  5. Non è necessaria alcuna modifica al file di configurazione “standalone.xml”
  6. Avviate JBoss.


    A questo punto riuscirete ad accodare i messaggi nella coda ma a causa di qualche altro problemino, ben documentato, non riuscirete ad agganciare un MDB per leggerli. 

    Ho rinunciato a risolvere questo ulteriore problema sulla versione 5.5.1 ed ho risolto, senza troppe complicazioni, scaricando il RAR di ActiveMQ versione 5.6 e configurandolo esattamente come descritto.

    Ecco il codice fondamentale per una servlet di accodamento e un MDB per leggere i messaggi:


    /*
    * Servlet
    */
    package it.lcianci.test.changez.servlet;

    import java.io.IOException;
    import java.io.PrintWriter;
    import javax.jms.Connection;
    import javax.jms.ConnectionFactory;
    import javax.jms.MessageProducer;
    import javax.jms.Session;
    import javax.jms.TextMessage;
    import javax.naming.InitialContext;
    import javax.naming.NamingException;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;

    @WebServlet({ "/TestServlet", "/test" })
    public class TestServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
           
        public TestServlet() {
            super();        
        }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    PrintWriter out = response.getWriter();
    try {
    InitialContext ic = new InitialContext();
    ConnectionFactory cf = (ConnectionFactory) ic.lookup("java:jboss/jms/amqCF");

    Connection c = cf.createConnection();
                Session session = c.createSession(false,Session.AUTO_ACKNOWLEDGE);

                MessageProducer messageProducer = session.createProducer(session.createQueue("testQueue"));
                TextMessage message = session.createTextMessage();
                
                for (int i = 1; i <= 10; i++) {
                  message.setText("Messaggio "+i);
                  messageProducer.send(message); 
                  
                  out.println("Scritto messaggio "+i);
                }


    catch (NamingException e) {
    out.println("Errore naming");
    e.printStackTrace();

    catch (Exception e) {
    out.println("Errore generale");
    e.printStackTrace();
    }
    finally {
    out.close();
    }
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }
    }


      /*
      * MDB
      */

      package it.lcianci.test.changez.mdb;

      import javax.ejb.ActivationConfigProperty;
      import javax.ejb.MessageDriven;
      import javax.jms.JMSException;
      import javax.jms.Message;
      import javax.jms.MessageListener;
      import javax.jms.TextMessage;

      import org.jboss.ejb3.annotation.ResourceAdapter;

      @MessageDriven(
      activationConfig = { 
      @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
      @ActivationConfigProperty(propertyName="destination", propertyValue="testQueue")
      }, 
      name = "testMDB")
      @ResourceAdapter(value="activemq-ra.rar")
      public class TestMDB implements MessageListener {

          public TestMDB() {}

          @Override
          public void onMessage(Message message) {
          try {    
          if(message instanceof TextMessage) {
          System.out.println("Letto "+((TextMessage)message).getText());
      }
              }
              catch (JMSException e) {
              e.printStackTrace();
              }
          }
      }




      Riferimenti problema RAR:



      Riferimenti problema MDB:

      Nessun commento:

      Posta un commento