message Driven bean problem
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
-----------------------
any idea guys???