Problemas com JMS e JPA

1 resposta
T

observe as classes:

package entity;

import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.Table;


@Entity
@Table(name = "TBLCLIENTE")
@NamedQueries({})
public class TblCliente implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @Column(name = "CODIGO", nullable = false)
    private Integer codigo;
    @Column(name = "NOME")
    private String nome;
    @Column(name = "EMAIL")
    private String email;

    public TblCliente() {
    }

    public TblCliente(Integer codigo) {
        this.codigo = codigo;
    }

    public Integer getCodigo() {
        return codigo;
    }

    public void setCodigo(Integer codigo) {
        this.codigo = codigo;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (codigo != null ? codigo.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof TblCliente)) {
            return false;
        }
        TblCliente other = (TblCliente) object;
        if ((this.codigo == null && other.codigo != null) || (this.codigo != null && !this.codigo.equals(other.codigo))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "entity.TblCliente[codigo=" + codigo + "]";
    }

}

package session;

import entity.TblCliente;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;


@Stateless
public class TblClienteFacade implements TblClienteFacadeLocal, TblClienteFacadeRemote {
    @PersistenceContext
    private EntityManager em;

    public void create(TblCliente tblCliente) {
        em.persist(tblCliente);
    }

    public void edit(TblCliente tblCliente) {
        em.merge(tblCliente);
    }

    public void remove(TblCliente tblCliente) {
        em.remove(em.merge(tblCliente));
    }

    public TblCliente find(Object id) {
        return em.find(entity.TblCliente.class, id);
    }

    public List<TblCliente> findAll() {
        return em.createQuery("select object(o) from TblCliente as o").getResultList();
    }
    public List<TblCliente> findNome(String nome) {
        return em.createQuery("select object(c) from TblCliente as c where+" +
        " c.nome like :nomecli").setParameter("nomecli", "%"+nome+"%")
                .setMaxResults(1000).getResultList(); 
                
    }
}

package session;

import entity.TblCliente;
import java.util.List;
import javax.ejb.Local;


@Local
public interface TblClienteFacadeLocal {

    void create(TblCliente tblCliente);

    void edit(TblCliente tblCliente);

    void remove(TblCliente tblCliente);

    TblCliente find(Object id);

    List<TblCliente> findAll();

    public java.util.List<entity.TblCliente> findNome(java.lang.String nome);

}

O JMS

package jms;

import dao.Bussines;
import entity.TblCliente;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.ObjectMessage;


@MessageDriven(mappedName = "jms/ConnOracle", activationConfig =  {
        @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"),
        @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue")
    })
public class JMSPopularOracleBean implements MessageListener {
    
    public JMSPopularOracleBean() {
    }

    public void onMessage(Message message) {
        try {


            ObjectMessage objectMessage = (ObjectMessage) message;
            List listPopula = new ArrayList();
            listPopula = (List) objectMessage.getObject();
            Integer inicio = (Integer) listPopula.get(0);
            Integer fim = (Integer) listPopula.get(1);
            TblCliente tblCliente = (TblCliente) listPopula.get(2);



            new Bussines().popularClienteOracle(inicio, fim, tblCliente);
            
            System.out.println(inicio.toString() + " - " + fim.toString() + " - " + tblCliente.getNome() + "-" + tblCliente.getEmail());
        } catch (JMSException ex) {
            Logger.getLogger(JMSPopularOracleBean.class.getName()).log(Level.SEVERE, null, ex);
        }
            
                  
    }
    
}

O SessionBean que chama/envia a mensagem para o JMS

package session;

import java.io.Serializable;
import javax.annotation.Resource;
import javax.ejb.Stateless;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.Session;


@Stateless
public class SessionJMSOracleBean implements SessionJMSOracleRemote {
    @Resource(name = "jms/ConnOracle")
    private Queue connOracle;
    @Resource(name = "jms/ConnOracleFactory")
    private ConnectionFactory connOracleFactory;

    public void enviarMensagem(Object messageData) {
        try {
            sendJMSMessageToConnOracle(messageData);
        } catch (JMSException ex) {
            System.out.println("Erro enviarMensagem: "+ex);
        }
        
    }

    private Message createJMSMessageForjmsConnOracle(Session session, Object messageData) throws JMSException {
        return session.createObjectMessage((Serializable) messageData);
    }

    private void sendJMSMessageToConnOracle(Object messageData) throws JMSException {
        Connection connection = null;
        Session session = null;
        try {
            connection = connOracleFactory.createConnection();
            session = connection.createSession(false, javax.jms.Session.AUTO_ACKNOWLEDGE);
            MessageProducer messageProducer = session.createProducer(connOracle);
            messageProducer.send(createJMSMessageForjmsConnOracle(session, messageData));
        } finally {
            if (session != null) {
                session.close();
            }
            if (connection != null) {
                connection.close();
            }
        }
    }
    

 
}

Agora vem o meu Client(desktop fora do EJB)

package clientejboraclexe;

import entity.TblCliente;
import entity.TblClienteBean;
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.rmi.PortableRemoteObject;

import session.SessionJMSOracleRemote;
import session.TblClienteFacadeRemote;
import session.TblClienteFirebirdRemote;


public class Main {

    
    public static void main(String[] args)throws Exception {

    }


    
    public void jmsPopularOracle(Integer incio, Integer fim, TblCliente tblCliente)throws Exception{
        Properties props = new Properties();
        props.load(new FileInputStream("jndi.properties"));
        Context jndiContext = new InitialContext(props);  
        Object ref = jndiContext.lookup("session.SessionJMSOracleRemote");        
        SessionJMSOracleRemote jms = (SessionJMSOracleRemote) 
                PortableRemoteObject.narrow(ref, SessionJMSOracleRemote.class);        
        
        List listPopula = new ArrayList();
        listPopula.add(incio);
        listPopula.add(fim);
        listPopula.add(tblCliente);
        jms.enviarMensagem(listPopula);
    }
    
}

Aqui é só um metodo q preenche o bean:

private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    try {
        

            TblCliente tblCliente = new TblCliente();
            tblCliente.setCodigo(Integer.parseInt(jtfCodigo.getText()));
            tblCliente.setNome(jtfNome.getText());
            tblCliente.setEmail(jtfEmail.getText());       
            new Main().jmsPopularOracle(Integer.parseInt(jtfCodigo.getText()), 50011, tblCliente);        
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, "Erro ao gravar: "+ex);
        }
    
    
    
    }

o q estou tentando fazer é enviar esse bean atraves de uma mensagem e la no container ele processar uma insercao e esta acontecendo o seguinte erro:

[b]

DirectConsumer:Caught Exception delivering messagecom.sun.messaging.jmq.io.Packet cannot be cast to com.sun.messaging.jms.ra.DirectPacket

50003-Teste-Teste

MQRA:OMR:run:Caught Exception from onMessage():Redelivering:message-driven bean method public abstract void javax.jms.MessageListener.onMessage(javax.jms.Message) system exception

MDB00037: [EATesteOracle:JMSPopularOracleBean]: Message-driven bean invocation exception: [javax.ejb.EJBException]

javax.ejb.EJBException

javax.ejb.EJBException

at com.sun.ejb.containers.BaseContainer.processSystemException(BaseContainer.java:3869)

at com.sun.ejb.containers.BaseContainer.completeNewTx(BaseContainer.java:3769)

at com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:3571)

at com.sun.ejb.containers.MessageBeanContainer.afterMessageDeliveryInternal(MessageBeanContainer.java:1226)

at com.sun.ejb.containers.MessageBeanContainer.afterMessageDelivery(MessageBeanContainer.java:1197)

at com.sun.ejb.containers.MessageBeanListenerImpl.afterMessageDelivery(MessageBeanListenerImpl.java:79)

at com.sun.enterprise.connectors.inflow.MessageEndpointInvocationHandler.invoke(MessageEndpointInvocationHandler.java:139)

at $Proxy106.afterDelivery(Unknown Source)

at com.sun.messaging.jms.ra.OnMessageRunner.run(OnMessageRunner.java:324)

at com.sun.enterprise.connectors.work.OneWork.doWork(OneWork.java:76)

at com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.run(ThreadPoolImpl.java:555)

Caused by: java.lang.NullPointerException

at dao.Bussines.popularClienteOracle(Bussines.java:25)

at jms.JMSPopularOracleBean.onMessage(JMSPopularOracleBean.java:47)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

at java.lang.reflect.Method.invoke(Method.java:597)

at com.sun.enterprise.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1067)

at com.sun.enterprise.security.SecurityUtil.invoke(SecurityUtil.java:176)

at com.sun.ejb.containers.BaseContainer.invokeTargetBeanMethod(BaseContainer.java:2895)

at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:3986)

at com.sun.ejb.containers.MessageBeanContainer.deliverMessage(MessageBeanContainer.java:1111)

at com.sun.ejb.containers.MessageBeanListenerImpl.deliverMessage(MessageBeanListenerImpl.java:74)

at com.sun.enterprise.connectors.inflow.MessageEndpointInvocationHandler.invoke(MessageEndpointInvocationHandler.java:179)

at $Proxy106.onMessage(Unknown Source)

at com.sun.messaging.jms.ra.OnMessageRunner.run(OnMessageRunner.java:258)

… 2 more

50003-Teste-Teste

MQRA:OMR:run:Caught Exception from onMessage():Redelivering:message-driven bean method public abstract void javax.jms.MessageListener.onMessage(javax.jms.Message) system exception

MQRA:OMR:run:Exhausted redeliveryAttempts-msg=com.sun.messaging.jms.ra.DirectObjectPacket@1b8b15f

MQRA:OMR:run:Exhausted redeliveryAttempts-spec=ActvationSpec configuration=

DestinationType                     =javax.jms.Queue

Destination                         =PhysicalQueue

MessageSelector                     =null

AcknowledgeMode                     =Auto-acknowledge

SubscriptionDurability              =NonDurable

ClientId                            =null

SubscriptionName                    =null

EndpointPoolMaxSize                 =32

EndpointPoolSteadySize              =0

EndpointPoolResizeCount             =8

EndpointPoolResizeTimeout           =600

EndpointExceptionRedeliveryAttempts =1

EndpointExceptionRedeliveryInterval =500

SendUndeliverableMsgsToDMQ          =true

GroupName                           =null

RAUID                               =null

InClusteredContainer                =false

MdbName                             =null

UserName                            =null

EnableDirect                        =true

AddressList (in effect)             =localhost:7676

MQRA:OMR:run:Message returned & marked for routing to the DMQ

MQRA:OMR:run:omrId=0:Acked Undeliverable-Msg=com.sun.messaging.jms.ra.DirectObjectPacket@1b8b15f

MDB00037: [EATesteOracle:JMSPopularOracleBean]: Message-driven bean invocation exception: [javax.ejb.EJBException]

javax.ejb.EJBException

javax.ejb.EJBException

at com.sun.ejb.containers.BaseContainer.processSystemException(BaseContainer.java:3869)

at com.sun.ejb.containers.BaseContainer.completeNewTx(BaseContainer.java:3769)

at com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:3571)

at com.sun.ejb.containers.MessageBeanContainer.afterMessageDeliveryInternal(MessageBeanContainer.java:1226)

at com.sun.ejb.containers.MessageBeanContainer.afterMessageDelivery(MessageBeanContainer.java:1197)

at com.sun.ejb.containers.MessageBeanListenerImpl.afterMessageDelivery(MessageBeanListenerImpl.java:79)

at com.sun.enterprise.connectors.inflow.MessageEndpointInvocationHandler.invoke(MessageEndpointInvocationHandler.java:139)

at $Proxy106.afterDelivery(Unknown Source)

at com.sun.messaging.jms.ra.OnMessageRunner.run(OnMessageRunner.java:324)

at com.sun.enterprise.connectors.work.OneWork.doWork(OneWork.java:76)

at com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.run(ThreadPoolImpl.java:555)

Caused by: java.lang.NullPointerException

at dao.Bussines.popularClienteOracle(Bussines.java:25)

at jms.JMSPopularOracleBean.onMessage(JMSPopularOracleBean.java:47)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

at java.lang.reflect.Method.invoke(Method.java:597)

at com.sun.enterprise.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1067)

at com.sun.enterprise.security.SecurityUtil.invoke(SecurityUtil.java:176)

at com.sun.ejb.containers.BaseContainer.invokeTargetBeanMethod(BaseContainer.java:2895)

at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:3986)

at com.sun.ejb.containers.MessageBeanContainer.deliverMessage(MessageBeanContainer.java:1111)

at com.sun.ejb.containers.MessageBeanListenerImpl.deliverMessage(MessageBeanListenerImpl.java:74)

at com.sun.enterprise.connectors.inflow.MessageEndpointInvocationHandler.invoke(MessageEndpointInvocationHandler.java:179)

at $Proxy106.onMessage(Unknown Source)

at com.sun.messaging.jms.ra.OnMessageRunner.run(OnMessageRunner.java:258)

… 2 more

[/b]

no meio do erro existe um java.lang.NullPointerException…esse erro acontece quando é executado o em.persist…mas o estranho é q o bean está preenchido, tanto é q dou um system.ou.println antes pra confirmar aqui pra mim…e o mais estranho ainda é q se eu tentar inserir direto do meu client sem enviar atraves de mensagem utilizando o mesmo entityBean dá td certo…o q esta aocntecendo?

abracos.

1 Resposta

T

percebi q se eu colocar um sessionbean que acessa um entitybean o erro java.lang.NullPointerException
acontece mas se meu sessionbean for o entitybean funciona…pq isso?

olhem o q fiz:

package dao;

import entity.TblCliente;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

public class FacadeCliente {

@PersistenceContext
private EntityManager em;

    
    public void create(TblCliente tblCliente) {
        em.persist(tblCliente);
    }

    public void edit(TblCliente tblCliente) {
        em.merge(tblCliente);
    }

    public void remove(TblCliente tblCliente) {
        em.remove(em.merge(tblCliente));
    }

    public TblCliente find(Object id) {
        return em.find(entity.TblCliente.class, id);
    }

    public List<TblCliente> findAll() {
        return em.createQuery("select object(o) from TblCliente as o").getResultList();
    }
    public List<TblCliente> findNome(String nome) {
        return em.createQuery("select object(c) from TblCliente as c where+" +
        " c.nome like :nomecli").setParameter("nomecli", "%"+nome+"%")
                .setMaxResults(1000).getResultList(); 
                
    }

}
package session;

import dao.FacadeCliente;
import entity.TblCliente;
import java.util.List;
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.ejb.TransactionManagement;
import javax.ejb.TransactionManagementType;

@Stateless
@TransactionManagement(TransactionManagementType.CONTAINER)
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class SessionFacadeClienteBean implements SessionFacadeClienteRemote {


    
    public void incluirCliente(TblCliente tblCliente) {
        new FacadeCliente().create(tblCliente);
    }

    public List<entity.TblCliente> findAll() {
        return new FacadeCliente().findAll();
    }

    public List<entity.TblCliente> findByNome(String nome) {
        return new FacadeCliente().findNome(nome);
    }
    
    
 
}
Criado 1 de outubro de 2008
Ultima resposta 1 de out. de 2008
Respostas 1
Participantes 1