message Driven bean problem

  • Thread starter George N. Morcos
  • Start date
G

George N. Morcos

hi,

i am trying to design an EJB application using session , entity and
message beans

it's a messaging board , a user can add a message , reply to a
message , and delete the message

when glasfish is running more than one application,

the board client side keeps calling the wrong jms\

// the addTopic class
package web;

import ejb.Topic;
import java.io.*;

import java.util.Date;
import javax.annotation.Resource;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.ObjectMessage;
import javax.jms.Queue;
import javax.jms.Session;
import javax.servlet.*;
import javax.servlet.http.*;

public class AddTopic extends HttpServlet {

@Resource(mappedName = "jms/BoardTopicFactory")
private ConnectionFactory connectionFactorys = null;
@Resource(mappedName = "jms/BoardTopic")
private Queue queue = null;
private Connection connection = null;
private Session session = null;

@Override
protected void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {

try {
try {
// creating a connection
connection = connectionFactorys.createConnection();
session = connection.createSession(false,
Session.AUTO_ACKNOWLEDGE);
MessageProducer messageProducer =
session.createProducer(queue);

ObjectMessage message = session.createObjectMessage();

Topic topic = new Topic();
// getting and setting all attributes required for the
topic
topic.setTopicDate(new Date());
// topic name validation , if empty , do not add it to
the database
if (request.getParameter("topicName").equals("")) {
} else {

topic.setTopicName(request.getParameter("topicName"));

message.setObject(topic);
messageProducer.send(message);

messageProducer.close();
// connection.close();
}
} finally {
if (session != null) {
session.close();
}
if (connection != null) {
connection.close();
}
}
} catch (JMSException ex) {
ex.printStackTrace();
}

getServletConfig().getServletContext().getRequestDispatcher("/
index.jsp").forward(request, response);
}

@Override
protected void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}

/**
* Returns a short description of the servlet.
*/
@Override
public String getServletInfo() {
return "Short description";
}
// </editor-fold>
}


----------------------------------------------------------------------------------------------------
///the jms class

package ejb;

import javax.annotation.Resource;
import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;
import javax.ejb.MessageDrivenContext;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.ObjectMessage;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

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

@PersistenceContext
private EntityManager em;
@Resource
MessageDrivenContext mdc;

public BoardTopicBean() {
}

public void onMessage(Message message) {
ObjectMessage msg = null;
try {
msg = (ObjectMessage) message;

persist(msg.getObject());

} catch (JMSException e) {
e.printStackTrace();
mdc.setRollbackOnly();
} catch (Throwable te) {
te.printStackTrace();
}
}

public void persist(Object object) {

// save the object (MessageTable or Topic)
em.persist(object);

// if the object is a MessageTable then add this newly created/
persisted object to the list of messages in the topic
if (object instanceof MessageTable) {
MessageTable msg = (MessageTable) object;
Topic topic = msg.getTopic();

if (topic == null) {
em.remove(msg);
} else {
topic = em.find(Topic.class, topic.getId());
topic.getMessages().add(msg);
em.merge(topic);
}
} else {
System.out.println("Wrong type in
merge..................");
}
}
}
----------------------------------------------------------------------------------------------------------------------
some of the exceptions thrown to the console

DirectConsumer:Caught Exception delivering
messagecom.sun.messaging.jmq.io.Packet cannot be cast to
com.sun.messaging.jms.ra.DirectPacket
MQJMSRA_DM4001: :Exception:ObjectMessage.getObject()DeSerializing
object::message=ejb.Topic
javax.jms.MessageFormatException:
MQJMSRA_DM4001: :Exception:ObjectMessage.getObject()DeSerializing
object::message=ejb.Topic
at
com.sun.messaging.jms.ra.DirectObjectPacket.getObject(DirectObjectPacket.java:
169)
at ejb.HockeyMessagesBean.onMessage(HockeyMessagesBean.java:
34)
at sun.reflect.GeneratedMethodAccessor140.invoke(Unknown
Source)
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 $Proxy52.onMessage(Unknown Source)
at
com.sun.messaging.jms.ra.OnMessageRunner.run(OnMessageRunner.java:258)
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.ClassNotFoundException: ejb.Topic
at
com.sun.enterprise.loader.EJBClassLoader.findClassData(EJBClassLoader.java:
718)
at
com.sun.enterprise.loader.EJBClassLoader.findClass(EJBClassLoader.java:
631)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:
319)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:247)
at com.sun.messaging.jms.ra.DirectObjectPacket
$ObjectInputStreamWithContextLoader.resolveClass(DirectObjectPacket.java:
301)
at
java.io_ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:
1575)
at
java.io_ObjectInputStream.readClassDesc(ObjectInputStream.java:1496)
at
java.io_ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:
1732)
at
java.io_ObjectInputStream.readObject0(ObjectInputStream.java:1329)
at java.io_ObjectInputStream.readObject(ObjectInputStream.java:
351)
at
com.sun.messaging.jms.ra.DirectObjectPacket.getObject(DirectObjectPacket.java:
155)
... 15 more
DirectConsumer:Caught Exception delivering
messagecom.sun.messaging.jmq.io.Packet cannot be cast to
com.sun.messaging.jms.ra.DirectPacket
MQJMSRA_DM4001: :Exception:ObjectMessage.getObject()DeSerializing
object::message=ejb.HockeyEntity
javax.jms.MessageFormatException:
MQJMSRA_DM4001: :Exception:ObjectMessage.getObject()DeSerializing
object::message=ejb.HockeyEntity
at
com.sun.messaging.jms.ra.DirectObjectPacket.getObject(DirectObjectPacket.java:
169)
at ejb.BoardTopicBean.onMessage(BoardTopicBean.java:33)
at sun.reflect.GeneratedMethodAccessor146.invoke(Unknown
Source)
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 $Proxy56.onMessage(Unknown Source)
at
com.sun.messaging.jms.ra.OnMessageRunner.run(OnMessageRunner.java:258)
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.ClassNotFoundException: ejb.HockeyEntity
at
com.sun.enterprise.loader.EJBClassLoader.findClassData(EJBClassLoader.java:
718)
at
com.sun.enterprise.loader.EJBClassLoader.findClass(EJBClassLoader.java:
631)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:
319)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:247)
at com.sun.messaging.jms.ra.DirectObjectPacket
$ObjectInputStreamWithContextLoader.resolveClass(DirectObjectPacket.java:
301)
at
java.io_ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:
1575)
at
java.io_ObjectInputStream.readClassDesc(ObjectInputStream.java:1496)
at
java.io_ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:
1732)
at
java.io_ObjectInputStream.readObject0(ObjectInputStream.java:1329)
at java.io_ObjectInputStream.readObject(ObjectInputStream.java:
351)
at
com.sun.messaging.jms.ra.DirectObjectPacket.getObject(DirectObjectPacket.java:
155)
... 15 more
DirectConsumer:Caught Exception delivering
messagecom.sun.messaging.jmq.io.Packet cannot be cast to
com.sun.messaging.jms.ra.DirectPacket
MQJMSRA_DM4001: :Exception:ObjectMessage.getObject()DeSerializing
object::message=ejb.HockeyEntity
 
O

Owen Jacobson

Caused by: java.lang.ClassNotFoundException: ejb.HockeyEntity

This seems fairly clear to me. In the context where an ObjectMessage
carrying data for an ejb.HockeyEntity object is being deserialized
(which has nothing to do with the code you posted, incidentally), no
definition for ejb.HockeyEntity is visible.

The solution is dependent on how you package your app. If both the
EJB JAR containing the message listener and the WAR containing the
sender are inside an EAR, one solution would be to move the JAR
containing that class from inside the WAR to the EAR (and modifying
the WAR's Class-Path entry to refer to it) so that both the webapp and
the EJBs can load classes from it.

-o
 
G

George N. Morcos

i checked my ear file , it contains both the jar and the war. how to
do the separation process and which paths to modify,

i am using netbeans 6.1 , glassfish v2,
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,764
Messages
2,569,566
Members
45,041
Latest member
RomeoFarnh

Latest Threads

Top