Gente, a ver si alguien me puede ayudar con esto.
Estoy haciendo unas pruebas con EJB (version 2.1) y JMS. Estoy utilizando JBoss 3.2.7.
Tengo un EJB de Sesion Stateless con un metodo llamado:
metodoTransaccion(int id,String mssg).
Dentro de este metodo invoco a otros dos metodos privados en este orden:
insertEnDB(id);
sendMessageEnTopic(mssg);
Estoy haciendo unas pruebas con las transacciones del container de EJB. Pero antes de poder probar nada con las transacciones tengo un problema basico: cuando trato de enviar el mensaje al Topic (dentro del metodo sendMessageEnTopic() tira una excepcion diciendo: NoSuchMethodException...
06:43:32,912 ERROR [LogInterceptor] Unexpected Error in method: public abstract void test.interfaces.Facade.metodoTransaccion(int,java.lang.String) throws java.rmi.RemoteException
java.lang.NoSuchMethodError: javax.jms.TopicPublisher.send(Ljavax/jms/Message;)V at test.ejb.FacadeBean.sendMessageEnTopic(FacadeBean.java:146)
at test.ejb.FacadeBean.metodoTransaccion(FacadeBean.java
:104)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
Es decir: por que no encuentra ese metodo (es el metodo send() de la clase TopicPublisher) ?????
A continuacion les copio el codigo del bean con su documentacion XDoclet. Para simplificar elimine todos los metodos de ciclo de vida (ejbActivated, ejbPassivated, etc).
En el codigo resalte en negrita y en rojo los segmentos de codigo donde ocurre el error...
Hay que aclarar que ese mismo codigo (el del metodo sendMssgEnTopic) si lo corro desde un main() standalone funciona perfectamente. El problema es al llamarlo dentro del SessionBean, dentro del container.
Si alguien leyo hasta esta linea desde ya le estoy agradecido. Y si ademas me puede ayudar a encontrar el problama mucho mas agradecido todavia quedare :O)
Saludos !!!
----[CODIGO DEL EJB]-------
package test.ejb;
import java.rmi.RemoteException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import javax.ejb.EJBException;
import javax.ejb.SessionBean;
import javax.ejb.SessionContext
;
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;
import javax.sql.DataSource;
import javax.transaction.UserTransaction;
/**
* XDoclet-based session bean. The class must be declared public according to
* the EJB specification.
*
* To generate the EJB related files to this EJB: - Add Standard EJB module to
* XDoclet project properties - Customize XDoclet configuration for your
* appserver - Run XDoclet
*
* Below are the xdoclet-related tags needed for this EJB.
*
* @ejb.bean name="Facade"
* display-name="Name for Facade"
* description="Description for Facade"
* jndi-name="ejb/Facade"
* type="Stateless"
* view-type="remote"
*
transaction-type="Container"
*/
public class FacadeBean implements SessionBean
{
/**
* An example business method
*
* @ejb.interface-method view-type = "remote"
*
@ejb.transaction type = "Required" * @throws EJBException
* Thrown if method fails due to system-level error.
*/
public void metodoTransaccion(int id,String mssg) throws EJBException
{
// UserTransaction trx=null;
try
{
// trx=context.getUserTransaction();
// trx.begin();
insertEnDB(id);
sendMessageEnTopic(mssg); // trx.commit();
}
catch(Exception ex)
{
ex.printStackTrace();
throw new EJBException(ex);
}
finally
{
try
{
// trx.rollback();
}
catch(Exception ex)
{
ex.printStackTrace();
throw new EJBException(ex);
}
}
}
private void sendMessageEnTopic(String mssg)
{ Context contextoInicial = null;
TopicSession sesion = null; try
{ contextoInicial = new InitialContext();
TopicConnectionFactory factory = (TopicConnectionFactory) contextoInicial.lookup("java:/XAConnectionFactory"); Topic cola = (Topic)
contextoInicial.lookup("topic/testTopic"); TopicConnection conexion =
factory.createTopicConnection(); sesion = conexion.createTopicSession(true, TopicSession.AUTO_ACKNOWLEDGE);
TopicPublisher enviaACola = sesion.createPublisher(cola);
TextMessage mensaje = sesion.createTextMessage();
mensaje.setText(mssg);
enviaACola.send(mensaje); conexion.close();
} catch (Exception ex)
{ ex.printStackTrace(); throw new EJBException(ex);
} } private void insertEnDB(int id)
{
Connection con = null;
PreparedStatement pstm = null;
try
{
con = getConnection();
String sql = "";
sql += "INSERT INTO dept (deptno,dname,loc) ";
sql += "VALUES (?,'Mi Dept','Mi Loc') ";
pstm = con.prepareStatement(sql);
pstm.setInt(1, id);
if (pstm.executeUpdate() != 1)
{
throw new EJBException("---> Error al insertar !!");
}
}
catch (Exception ex)
{
ex.printStackTrace();
throw new EJBException(ex);
}
finally
{
try
{
if (pstm != null) pstm.close();
if (con != null) con.close();
}
catch (Exception ex)
{
ex.printStackTrace();
throw new EJBException(ex);
}
}
}
private Connection getConnection()
{
try
{
Context ctx = new InitialContext();
DataSource ds = (DataSource) ctx.lookup("java:/OracleDS");
return ds.getConnection();
}
catch (Exception ex)
{
ex.printStackTrace();
throw new EJBException(ex);
}
}
}
--
Ing. Pablo Augusto Sznajdleder_________
(5411) 4637-8879 | 15-4419-JAVA (5282)
email:
pab...@pablosz.com.arskype: pabloszn
http://www.PabloSZ.com.arhttp://www.JavaSOS.com.ar