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.