jueves, 18 de marzo de 2010

Ejemplo Message Drive Bean con Jboss 4.3

Vamos a realizar un pequeño ejemplo de Message Drive Bean en jboss este ejemplo aparece en el libro de Mastering Enterprise Java Beans 3.0 cuarta edición de Rima Patel Sriganesh, Geral Brose y Mica Silverman, y el tema se encuentra en el capitulo 7 el cual es una introducción a Message Drive Bean, el código del libro se realizo con glassfish como servidor de aplicaciones, he usado el mismo código adaptando solo algunas partes de acuerdo a la implementacion de jboss.

El código  de nuestro Message Bean es el siguiente:

package examples.messaging;

import javax.annotation.PreDestroy;
import javax.jms.*;
import javax.ejb.*;

@MessageDriven (
  activationConfig={
  @ActivationConfigProperty(propertyName="destination",
  propertyValue="topic/testTopic"),
  @ActivationConfigProperty(propertyName="destinationType",
  propertyValue="javax.jms.Topic")
  }
  )
public class LogBean implements MessageListener {

  public LogBean() {
  System.out.println("Log Bean Created");
  }

  public void onMessage(Message message) {
  if (message instanceof TextMessage) {
  try {
  TextMessage txtMessage = (TextMessage) message;
  String text = txtMessage.getText();
  System.out.println("Recived new message : " + text);
  } catch (JMSException ex) {
  ex.printStackTrace();
  }
  }
  }

  @PreDestroy
  public void remove(){
  System.out.println("Log Bean Destroyed");
  }
}

Estamos utilizando anotaciones para realizar la configuración de nuestro message bean, si no queremos usar estas anotaciones podemos usar el descriptor de despliegue (ejb-jar.xml) .

La primera anotación  declara la configuración necesaria, primero el destino de nuestros mensajes y después el tipo. En el código utiliza la configuración de jms que jboss tiene por defecto, podemos crear las nuestras y cambiarlas.

Esta clase tenemos que compilarla y empaquetarla en un jar, las dependencias se encuentran en las lib de jboss, colocamos el jar en nuestra carpeta deploy de nuestra configuración.

El código del cliente es el siguiente, es un cliente standalone :

package org.nl.examples.client;

import java.util.Properties;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.Topic;
import javax.jms.TopicConnection;
import javax.jms.TopicConnectionFactory;
import javax.jms.TopicPublisher;
import javax.jms.TopicSession;
import javax.naming.Context;
import javax.naming.InitialContext;

/**
 *
 * @author usuario
 * This class is a simple client for a stateful session bean
 * To ilustrate how passivation works, configure your EJB server
 * to allow only two stateful session beans in memory (Consult your
 * vendor documentation for details on how to do this). We create
 * 3 beans in this example to see how and when beans are passivated.
 */
public class LogClient {
 
  public static final int noOfClients = 10;

  public static void main(String args[]) {
  try{

  /*Estas propiedades nos sirven para conectarnos a jboss desde nuestro cliente standalone,
si el cliente corre dentro de jboss esto no seria necesario*/
  Properties properties = new Properties();
  properties.put("java.naming.factory.initial","org.jnp.interfaces.NamingContextFactory");
  properties.put("java.naming.factory.url.pkgs","=org.jboss.naming:org.jnp.interfaces");
  properties.put("java.naming.provider.url","localhost:1099");

  Context ctx = new InitialContext(properties);
  //ctx.lookup(CountBean.class.getSimpleName()+"/remote");
  // 1: Lookup the connection factory
  TopicConnectionFactory factory = (TopicConnectionFactory) ctx.lookup("ConnectionFactory");
  // 2: Use connection factory to create a JMS connection
  TopicConnection connection = factory.createTopicConnection();
  // 3: Use connection to create a session
  TopicSession session = connection.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);
  // 4: Lookup destination
  Topic topic = (Topic) ctx.lookup("topic/testTopic");
  // 5: Create a message publisher
  TopicPublisher publisher = session.createPublisher(topic);
  // 6: create and publish a message
  TextMessage msg = session.createTextMessage();
  msg.setText("This is a test message.");
  publisher.send(msg);
  // finish
  publisher.close();

  System.out.println("Message published. Please check aplication server's console to see the response from MDB");

  } catch(Exception e){
  e.printStackTrace();
  }
  }

}

 Para compilarlo y ejecutarlo se necesitan las bibliotecas:
-jboss-aop.jar
-jbossall-client.jar
-javassist.jar
-trove.jar
-log4j.jar

 El libro que les mencione antes pueden descargarlo de masteringEJB3,

Problemas con charset en Spring MVC

El problema que tenia es que mi forma de spring mvc no me estaba aceptando caracteres como la ñ los acentos, y algunos otros, cuando hacia el submit de mi forma al llegar al controller los datos no llegaban correctamente. A pesar de que mi jsp tenia correctamente el charset los caracteres eran sustituidos para solucionar el problema unicamente tenemos que agregar un filtro de spring mvc, este filtro es CharacterEncodingFilter el cual se encargara de verificar que todo valla bien, la forma de acerlo es como sigue:

<filter>
  <filter-name>charsetFilter</filter-name>
  <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  <init-param>
  <param-name>encoding</param-name>
  <param-value>UTF-8</param-value>
  </init-param>
 </filter>
 <filter-mapping>
  <filter-name>charsetFilter</filter-name>
  <url-pattern>/*</url-pattern>
 </filter-mapping>

Y eso es todo con este filtro podemos reciber correctamente los caracteres de nuestra forma.