[
http://jira.jboss.com/jira/browse/JBAS-4945?page=all ]
Adrian Brock updated JBAS-4945:
-------------------------------
Fix Version/s: JBossAS-5.0.0.Beta3
JBossAS-4.2.3.GA
The problem is in JMSDestinationManager::addMessage()
When resending a message that has previously been delivered,
it removes the old JBoss specific property "JMS_JBOSS_REDELIVERY_COUNT"
and sets the redelivered flag to false.
But it does not remove the spec defined JMSXDeliveryCount property.
This causes confusion when the resent message is delivered.
The following patch resolves that problem:
[ejort@warjort server]$ svn diff
Index: JMSDestinationManager.java
===================================================================
--- JMSDestinationManager.java (revision 66725)
+++ JMSDestinationManager.java (working copy)
@@ -432,6 +432,7 @@
// Reset any redelivered information
val.setJMSRedelivered(false);
val.header.jmsProperties.remove(SpyMessage.PROPERTY_REDELIVERY_COUNT);
+ val.header.jmsProperties.remove(SpyMessage.PROPERTY_DELIVERY_COUNT);
//Add the message to the queue
val.setReadOnlyMode();
I need to write a test to confirm this fixes the reported problem.
Messages transfered from DLQ to working queue will never be resent to
DLQ
-------------------------------------------------------------------------
Key: JBAS-4945
URL:
http://jira.jboss.com/jira/browse/JBAS-4945
Project: JBoss Application Server
Issue Type: Bug
Security Level: Public(Everyone can see)
Components: JMS service
Affects Versions: JBossAS-4.0.5.GA
Reporter: Mike Clark
Assigned To: Adrian Brock
Fix For: JBossAS-5.0.0.Beta3, JBossAS-4.2.3.GA
Messages that are retreived from the DLQ have their JMSXDeliveryCount set to 1. Inside
org.jboss.ejb.plugins.jms.DLQHander, this leads to the code that redirects failed messages
to the DLQ. Starting on line 454, the count gets set to 1, then is decremented to zero. On
the next redelivery, the same thing happens again. The JMS_JBOSS_REDELIVERY_COUNT is
incremented on each cylce but never gets checked:
try
{
if (msg.propertyExists(PROPERTY_DELIVERY_COUNT)) // Is 1 for a message
transferred from DLQ <<<<
count = msg.getIntProperty(PROPERTY_DELIVERY_COUNT);
}
catch (JMSException ignored)
{
}
if (count > 0)
{
// The delivery count is one too many
--count; // Becomes zero for message transferred from DLQ <<<
}
else if (msg.propertyExists(JMS_JBOSS_REDELIVERY_COUNT))
count = msg.getIntProperty(JMS_JBOSS_REDELIVERY_COUNT);
else
{
id = msg.getJMSMessageID();
if (id == null)
{
// if we can't get the id we are basically f**ked
log.error("Message id is null, can't handle message");
return false;
}
count = incrementResentCount(id);
fromMessage = false;
}
if (count > max) // Count is always zero for a message that has been transfered
from DLQ <<<<
{
id = msg.getJMSMessageID();
log.warn("Message resent too many times; sending it to DLQ; message
id=" + id);
sendMessage(msg);
deleteFromBuffer(id);
handled = true;
}
Cheers,
Mike C.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://jira.jboss.com/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
http://www.atlassian.com/software/jira