Bugs item #701731, was opened at 2003-03-11 18:44
You can respond by visiting:
https://sourceforge.net/tracker/?func=detail&atid=376685&aid=701731&group_id=22866
Category: JBossMQ
Group: v3.0 Rabbit Hole
Status: Open
Resolution: None
Priority: 5
Submitted By: Eduard Letifov (techtime)
>Assigned to: Adrian Brock (ejort)
Summary: Problem: MDB stops reacting
Initial Comment:
I would like to report a potential bug.
I've made a post in Jboss forums and there was some
responses from other people supposedly experiencing
simular problems.
Below, I repeat the problem description and our current
state of researching the roots of the problem:
=====
Setup:
Our system is centered around Jboss 3.0.4+Jetty
running on AS400. In short, it handles HTTP requests :)
Current (test environment) average load on the system is
somewhere around 30 requests per minute, peak values
so far were around 200. Production systems certainly as
usual has to handle more.
The basic workflow/design of the system can be
described as follows:
- requests are picked up by the servlets
- each type of request is handled by separate servlet
(actually the same class, but different config parameters
through web.xml)
- servlet parses the request, composes an object
message and submits it to the core via request JMS
queue with one of the properties set to specific constant
reflecting the request type
- servlet goes to timed-synchronous waiting cycle on
response queue, if no response arrives from core in 10
sec, a specific (timeout) response is sent to the client
- core "interface" is a set of MDB that call the rest
(Session and Entity beans) or respond back directly
through response queue. Instances of each different
MDB class handle request messages only of a certain
type specified via message selector in descriptor.
Problem:
After a certain time (~couple of days) one (or several, no
system visible) MDBs stop responding to messages. In
the logs it is visible that message was submitted to the
queue, after that nothing happens, clients eventually
receive timeout response. If we restart Jboss or
stop/destroy/create/start the jar with MDB through JMX
console everything starts working again.
===
I've noticed that in our case problems seem to start after
the following message appears in the logs: "WARNING:
NACK issued. The message consumer was not waiting
for a message."
Also we've made some more detailed research of logs
and Jboss source. After we enable tracing here is what
we've got:
2003-03-06 16:34:21,068 TRACE
[1046964853752:TracingInterceptor] CALLED : receive
2003-03-06 16:34:21,082 TRACE
[1046964853752:TracingInterceptor] ARG : -2147473121
2003-03-06 16:34:21,090 TRACE
[1046964853752:TracingInterceptor] ARG : -1
2003-03-06 16:34:21,090 TRACE
[1046964853752:ServerSecurityInterceptor] Checking
receive authorize on
SpyDistributedConnection:ID:78/ca35b8c9ad1c166f2156
0d812148ea9e subId=-2147473121
2003-03-06 16:34:21,092 TRACE
[1046964853752:TracingInterceptor] EXCEPTION :
receive:
javax.jms.JMSException: The provided subscription
does not exist
java/lang/Throwable.<init>(Ljava/lang/String;)V+4
(Throwable.java:90)
javax/jms/JMSException.<init>
(Ljava/lang/String;Ljava/lang/String;)V+0
(JMSException.java:0)
javax/jms/JMSException.<init>(Ljava/lang/String;)V+0
(JMSException.java:0)
org/jboss/mq/server/ClientConsumer.getSubscription(I)
Lorg/jboss/mq/Subscription;+0 (ClientConsumer.java:0)
org/jboss/mq/server/JMSDestinationManager.getSubscri
ption(Lorg/jboss/mq/ConnectionToken;I)
Lorg/jboss/mq/Subscription;+0
(JMSDestinationManager.java:0)
org/jboss/mq/server/JMSServerInterceptorSupport.getSub
scription(Lorg/jboss/mq/ConnectionToken;I)
Lorg/jboss/mq/Subscription;+0
(JMSServerInterceptorSupport.java:0)
org/jboss/mq/security/ServerSecurityInterceptor.receive
(Lorg/jboss/mq/ConnectionToken;IJ)
Lorg/jboss/mq/SpyMessage;+0
(ServerSecurityInterceptor.java:0)
org/jboss/mq/server/TracingInterceptor.receive
(Lorg/jboss/mq/ConnectionToken;IJ)
Lorg/jboss/mq/SpyMessage;+0
(TracingInterceptor.java:0)
org/jboss/mq/server/JMSServerInvoker.receive
(Lorg/jboss/mq/ConnectionToken;IJ)
Lorg/jboss/mq/SpyMessage;+0
(JMSServerInvoker.java:0)
org/jboss/mq/il/jvm/JVMServerIL.receive
(Lorg/jboss/mq/ConnectionToken;IJ)
Lorg/jboss/mq/SpyMessage;+0 (JVMServerIL.java:0)
org/jboss/mq/Connection.receive
(Lorg/jboss/mq/Subscription;J)
Lorg/jboss/mq/SpyMessage;+0 (Connection.java:0)
org/jboss/mq/SpyMessageConsumer.receiveNoWait()
Ljavax/jms/Message;+0 (SpyMessageConsumer.java:0)
com/vocognition/talkface/jms/JMSModel.checkNoWaitFo
rReplyTo
(Lcom/vocognition/talkface/talkman/TalkmanMessage;)
Lcom/vocognition/talkface/talkman/ModelMessage;+0
(JMSModel.java:73)
com/vocognition/talkface/talkman/LUTHandler.service
(Lcom/vocognition/talkface/talkman/TalkmanRequest;Lco
m/vocognition/talkface/talkman/TalkmanResponse;)V+0
(LUTHandler.java:27)
com/vocognition/talkface/protocol/tfshttp/JMSServlet.doG
et
(Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http
/HttpServletResponse;)V+0 (JMSServlet.java:112)
javax/servlet/http/HttpServlet.service
(Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http
/HttpServletResponse;)V+0 (HttpServlet.java:0)
javax/servlet/http/HttpServlet.service
(Ljavax/servlet/ServletRequest;Ljavax/servlet/ServletResp
onse;)V+0 (HttpServlet.java:0)
org/mortbay/jetty/servlet/ServletHolder.handle
(Ljavax/servlet/ServletRequest;Ljavax/servlet/ServletResp
onse;)V+0 (ServletHolder.java:334)
org/mortbay/jetty/servlet/WebApplicationHandler.dispatc
h
(Ljava/lang/String;Ljavax/servlet/http/HttpServletRequest;
Ljavax/servlet/http/HttpServletResponse;Lorg/mortbay/jett
y/servlet/ServletHolder;)V+0
(WebApplicationHandler.java:201)
org/mortbay/jetty/servlet/ServletHandler.handle
(Ljava/lang/String;Ljava/lang/String;Lorg/mortbay/http/Htt
pRequest;Lorg/mortbay/http/HttpResponse;)V+0
(ServletHandler.java:518)
org/mortbay/http/HttpContext.handle
(Ljava/lang/String;Ljava/lang/String;Lorg/mortbay/http/Htt
pRequest;Lorg/mortbay/http/HttpResponse;)Z+0
(HttpContext.java:1665)
org/mortbay/jetty/servlet/WebApplicationContext.handle
(Ljava/lang/String;Ljava/lang/String;Lorg/mortbay/http/Htt
pRequest;Lorg/mortbay/http/HttpResponse;)Z+0
(WebApplicationContext.java:540)
org/mortbay/http/HttpContext.handle
(Lorg/mortbay/http/HttpRequest;Lorg/mortbay/http/HttpR
esponse;)Z+0 (HttpContext.java:1576)
org/mortbay/http/HttpServer.service
(Lorg/mortbay/http/HttpRequest;Lorg/mortbay/http/HttpR
esponse;)Lorg/mortbay/http/HttpContext;+0
(HttpServer.java:840)
org/jboss/jetty/Jetty.service
(Lorg/mortbay/http/HttpRequest;Lorg/mortbay/http/HttpR
esponse;)Lorg/mortbay/http/HttpContext;+0
(Jetty.java:543)
org/mortbay/http/HttpConnection.service
(Lorg/mortbay/http/HttpRequest;Lorg/mortbay/http/HttpR
esponse;)Lorg/mortbay/http/HttpContext;+0
(HttpConnection.java:804)
org/mortbay/http/HttpConnection.handleNext()Z+0
(HttpConnection.java:871)
org/mortbay/http/HttpConnection.handle()V+0
(HttpConnection.java:822)
org/mortbay/http/SocketListener.handleConnection
(Ljava/net/Socket;)V+0 (SocketListener.java:176)
org/mortbay/util/ThreadedServer.handle
(Ljava/lang/Object;)V+0 (ThreadedServer.java:287)
org/mortbay/util/ThreadPool$JobRunner.run()V+0
(ThreadPool.java:658)
java/lang/Thread.run()V+11 (Thread.java:484)
2003-03-06 16:34:21,097 TRACE
[1046964853752:TracingInterceptor] RETURN : receive
We've added some more trace statements. The
subscription was definitely added, but there is no
evidence that it is removed. So it looks like it magically
dissappears :(
I am worried about one thing - in JbossMQ
ClientConsumer source all operations on subsriptions
HashMap are done in blocks synchronized on
subscriptions object itself by making clones, operating
on them and then setting subscriptions reference to the
new object (as in the following code snippets). I am not
sure why is it done like this, and I suspect that it
actually breaks the idea of synchronization because as
it looks right after the reference is changed another
thread may acquire a lock on a new object, while the
first thread is still holding a lock on the old one. Please
take a look:
===
public void addSubscription(Subscription req) throws
JMSException
{
if( log.isTraceEnabled() )
log.trace("Adding subscription for: " + req);
req.connectionToken = connectionToken;
req.clientConsumer = this;
JMSDestination jmsdest = (JMSDestination)
server.getJMSDestination(req.destination);
if (jmsdest == null)
{
throw new JMSException("The destination " +
req.destination + " does not exist !");
}
jmsdest.addSubscriber(req);
synchronized (subscriptions)
{
HashMap subscriptionsClone = (HashMap)
subscriptions.clone();
subscriptionsClone.put(new Integer(req.subscriptionId),
req);
subscriptions = subscriptionsClone;
}
}
===
public void close()
{
boolean trace = log.isTraceEnabled();
if( trace )
log.trace("" + this +"->close()");
synchronized (messages)
{
closed = true;
if (enqueued)
{
if( trace )
log.trace("" + this +"->close(): Cancelling work in
progress.");
threadPool.cancelWork(this);
enqueued = false;
}
}
synchronized (subscriptions)
{
Iterator i = subscriptions.keySet().iterator();
while (i.hasNext())
{
Integer subscriptionId = (Integer) i.next();
try
{
removeSubscription(subscriptionId.intValue());
}
catch(JMSException ignore)
{
}
}
}
// Nack the removed subscriptions, the connection is
gone
HashMap removedSubsClone = (HashMap) ((HashMap)
removedSubscriptions).clone();
Iterator i = removedSubsClone.values().iterator();
while (i.hasNext())
{
Subscription removed = (Subscription) i.next();
JMSDestination queue = (JMSDestination)
server.getJMSDestination(removed.destination);
if (queue == null)
log.warn("The subscription was registered with a
destination that does not exist: " + removed);
try
{
queue.nackMessages(removed);
}
catch (JMSException e)
{
log.warn("Unable to nack removed subscription: " +
removed, e);
}
}
}
----------------------------------------------------------------------
>Comment By: Adrian Brock (ejort)
Date: 2003-03-14 17:55
Message:
Logged In: YES
user_id=9459
I've changed the ClientConsumer to not clone
the subscriptions, except when iterating at close to avoid
concurrent modification exceptions.
The semantics of this synchronization are wrong.
There are two other locations in the code doing a
similar thing. The changes for these are still outstanding
so I haven't closed this bug report yet.
SpySession and consumers
JMSDestinationManager and destinations
Regards,
Adrian
----------------------------------------------------------------------
You can respond by visiting:
https://sourceforge.net/tracker/?func=detail&atid=376685&aid=701731&group_id=22866
-------------------------------------------------------
This SF.net email is sponsored by:Crypto Challenge is now open!
Get cracking and register here for some mind boggling fun and
the chance of winning an Apple iPod:
http://ads.sourceforge.net/cgi-bin/redirect.pl?thaw0031en
_______________________________________________
Jboss-development mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/jboss-development