Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

using message driven beans to invoke methods on stateful beans

4 views
Skip to first unread message

Timo Hoepfner

unread,
Sep 26, 2000, 3:00:00 AM9/26/00
to
Hello!

We are trying to use Message Driven Beans to asynchronously call
methods on a Stateful Session Bean. Therefore we have to pass a
reference from the Object which created the instance of the session
bean via JMS to the message driven bean.

Now we're having two problems:

1. We want to use a wrapper class to send the reference together with
parameters as an ObjectMessage. We can send the ObjectMessage fine
but always get a deserialization error after recieving the message
and trying to get the original Object with getObject.

MDB> Received new Object
MDB> ObjectMessage
javax.jms.JMSException: Error deserializing object
at weblogic.jms.common.JMSUtilities.jmsException
(JMSUtilities.java:18)
at weblogic.jms.common.ObjectMessageImpl.getObject
(ObjectMessageImpl.java:55)
at de.dts.workflow.jms.message.MessageWorkflowBean.onMessage
(MessageWorkflowBean.java:105)
at weblogic.ejb20.internal.MDListener.onMessage
(MDListener.java:43)
at weblogic.jms.client.JMSMessageConsumer.readQueue
(JMSMessageConsumer.java, Compiled Code)
at weblogic.jms.common.MessageQueue.execute
(MessageQueue.java:687)
at weblogic.kernel.ExecuteThread.run(ExecuteThread.java,
Compiled Code)

2. If we directly send the reference to the session bean via JMS,
deserialization works, but we get the following exception:

MDB> Received new Object
MDB> ObjectMessage
java.rmi.ConnectException: Weblogic RemoteException
(weblogic.rmi.ConnectException) remapped
from:weblogic.rmi.ConnectException: Failed to create socket to: -
3054947444858285486C172.31.2.139 using protocol t3; nested exception is:
weblogic.rmi.ConnectException: Failed to create socket to: -
3054947444858285486C172.31.2.139 using protocol t3
weblogic.rmi.ConnectException: Failed to create socket to: -
3054947444858285486C172.31.2.139 using protocol t3
at weblogic.rjvm.ConnectionManager.getOutputStream
(ConnectionManager.java:1039)
at weblogic.rjvm.RJVMImpl.getOutputStream(RJVMImpl.java:379)
at weblogic.rjvm.RJVMImpl.getRequestStream(RJVMImpl.java:329)
at
weblogic.rmi.extensions.AbstractRemoteObjectReference.getRequest
(AbstractRemoteObjectReference.java:71)
at
de.dts.workflow.jms.statefulSession.WorkflowBeanEOImpl_WLStub.setState
(WorkflowBeanEOImpl_WLStub.java:419)
at de.dts.workflow.jms.message.MessageWorkflowBean.onMessage
(MessageWorkflowBean.java:113)
at weblogic.ejb20.internal.MDListener.onMessage
(MDListener.java:43)
at weblogic.jms.client.JMSMessageConsumer.readQueue
(JMSMessageConsumer.java, Compiled Code)
at weblogic.jms.common.MessageQueue.execute
(MessageQueue.java:687)
at weblogic.kernel.ExecuteThread.run(ExecuteThread.java,
Compiled Code)

What are we doing wrong?

Timo

Here's some of our code:

-----
public class MessageObject implements Serializable {
private Serializable bean;
private String state;

public MessageObject(Serializable bean, String state) {
this.state = state;
this.bean = bean;

public Serializable getBean() {
return this.bean;
}
public String getState() {
return this.state;
}}
-----

We are sending an ObjectMessage from a client to the queue:

-----
public void sendJMS(Workflow bean)
throws RemoteException, JMSException, NamingException {

Queue queue = null;
QueueSession session = null;

try {
session = queueConnection.createQueueSession
(false,Session.AUTO_ACKNOWLEDGE);
queue = (Queue) ctx.lookup(QUEUE_NAME);
} catch (NamingException ex) {
queue = session.createQueue(QUEUE_NAME);
ctx.bind(QUEUE_NAME, queue);
}

QueueSender sender = session.createSender(queue);

//using wrapper
MessageObject mo = new MessageObject((Serializable)
bean, "test_state");
ObjectMessage omsg = session.createObjectMessage();
omsg.setObject(mo);

//directly send reference
//ObjectMessage omsg = session.createObjectMessage(bean);
//sender.send(omsg);

sender.send(omsg);
}}
-----

Workflow is the remote interface of a stateless session bean:

-----
public interface Workflow extends EJBObject,java.io.Serializable

public class WorkflowBean implements SessionBean,Serializable
-----

When we try to recieve this ObjectMessage with the following code:

-----

public class MessageWorkflowBean implements MessageDrivenBean {

...

public void onMessage(Message msg) {
log("Received new Object");
try {
if (msg instanceof ObjectMessage) {
log("ObjectMessage");
ObjectMessage om = (ObjectMessage) msg;

Object obj = om.getObject(); // Here we get
the deserialization error

//wrapper
MessageObject mo = (MessageObject) obj;
log("Recieved state: "+mo.getState());
Workflow wf = (Workflow) mo.getBean();
wf.setState(mo.getState());

//no wrapper
//Workflow wf = (Workflow) obj;
//wf.setState("test");

} catch (Exception ex) {
ex.printStackTrace();
}
}

Sent via Deja.com http://www.deja.com/
Before you buy.

Timo Hoepfner

unread,
Sep 27, 2000, 3:00:00 AM9/27/00
to
Hi!

Sorry for replying to my own post. In the meantime I found out, that I
have to use a Handle to pass the reference to an EJB, nevertheless I
still have the deserialization problem:

Subscriber> Received new Object
Subscriber> ObjectMessage
javax.jms.JMSException: Error deserializing object
java.lang.Throwable(java.lang.String)
java.lang.Exception(java.lang.String)
javax.jms.JMSException(java.lang.String)
javax.jms.JMSException
weblogic.jms.common.JMSUtilities.jmsException(java.lang.String,
java.lang.Exception)
java.io.Serializable
weblogic.jms.common.ObjectMessageImpl.getObject()
void de.dts.workflow.jms.subscriber.Subscriber.onMessage
(javax.jms.Message)
boolean weblogic.jms.client.JMSMessageConsumer.deliver
(weblogic.jms.common.MessageImpl)
boolean weblogic.jms.client.JMSSession.deliver
(weblogic.jms.common.MessageImpl, int, boolean)
weblogic.rmi.extensions.OutgoingResponse
weblogic.jms.common.SessionCallback_WLSkel.invoke
(weblogic.rmi.extensions.ServerObjectReference, int,
weblogic.rmi.extensions.IncomingRequest,
weblogic.rmi.extensions.OutgoingResponse)
java.lang.Throwable
weblogic.rmi.extensions.BasicServerObjectAdapter.invoke(int,
weblogic.rmi.extensions.IncomingRequest)
void weblogic.rmi.extensions.BasicRequestHandler.handleRequest
(weblogic.rmi.extensions.IncomingRequest)
void weblogic.rmi.internal.BasicExecuteRequest.execute
(weblogic.kernel.ExecuteThread)
void weblogic.kernel.ExecuteThread.run()

Here's the code of the object I pass (as an ObjectMessage, the
Exception is thrown when getObject() is called, see earlier post).:

public class MessageObject implements Serializable {

Handle bean;
String state;

public MessageObject(Handle bean, String state) {


this.state = state;
this.bean = bean;
}

public Handle getBean() {return this.bean;}

public String getState() {return this.state;}
}


Handle and String are both Serializable. Passing the Handle directly
as an ObjectMessage works flawlessly, and passing an Object with two
String fields also works fine...

I've now spent days to figure out what's going wrong...

Please reply if you know how to fix this problem.

Thank you,

Timo

0 new messages