Hey folks,
i really hope someone can help me out, since i am running out of
ideas....
My problem seems quite simple:
-> I have a self-written message producer using AMQ-libraries
-> I have a self-written message consumer using AMQ-libraries
-> And a (single) AMQ-Broker in the middle
-> All used AMQ-libraries have the some version (version 5,
downloaded one
week ago)
-> consumer and producer use "real" tcp-connections, _not_
"in-jvm"-connections, even when they are running on the same machine
Now, if all of the three components (producer + broker + consumer)
run on
the same host, everything works _fine_....
The problem:
If all 3 components run on different hosts, nothing happens, meaning:
-> My producer "hangs":
INFO (SendSyncCmd.send) 2008-04-08 11:18:11,085
Sending message.....
INFO (SendSyncCmd.send) 2008-04-08 11:18:11,090
Waiting for reponse message...
My producer sends to the queue:
Publishing a Message with size 255 to queue: CMD.ESF-PROTO-2
-> My consumer prints nothing out, i.e. receives nothing.
But he listens on right queue: CMD.ESF-PROTO-2
-> Now to the interesting part: The broker.
If i take a look at the web-interface i see something like:
Name Number Of Pending Messages Number Of Consumers
CMD.ESF-PROTO-2 -1 1
Number Of Pending Messages = -1? What is this supposed to mean?
If i look at the command-line output of the broker i see:
WARN RegionBroker - Failed to send
ActiveMQBytesMessage
{commandId = 7, responseRequired = false, messageId =
ID:sdoesmon.wincor-nixdorf.com-41873-1207822630035-0:0:1:1:1,
originalDestination = null, originalTransactionId = null,
producerId =
ID:sdoesmon.wincor-nixdorf.com-41873-1207822630035-0:0:1:1,
destination =
queue://CMD.ESF-PROTO-2, transactionId = null, expiration =
1207822630933,
timestamp = 1207822630678, arrival = 0, brokerInTime = 1209266957622,
brokerOutTime = 0, correlationId = null, replyTo =
temp-queue://ID:sdoesmon.wincor-
nixdorf.com-41873-1207822630035-0:0:1,
persistent = false, type = null, priority = 4, groupID = null,
groupSequence = 0, targetConsumerId = null, compressed = false,
userID =
null, content = [EMAIL PROTECTED],
marshalledProperties = null, dataStructure = null,
redeliveryCounter = 0,
size = 0, properties = null, readOnlyProperties = false,
readOnlyBody =
false, droppable = false} ActiveMQBytesMessage{ bytesOut = null,
dataOut =
null, dataIn = null } to dead letter queue
So, in a nutshell, the broker tells me:
Failed to send ActiveMQBytesMessage ......to dead letter queue
But tells in the same output:
destination = queue://CMD.ESF-PROTO-2
which is correct! This queue exists and i got a consumer listening!
Now, if i look in the source-code of activemq, there is only one
location
where this message is generated:
-> package org.apache.activemq.broker.region;
-> Class RegionBroker
-> Method sendToDeadLetterQueue()
public void sendToDeadLetterQueue(ConnectionContext context,
MessageReference node){
try{
boolean sent=false;
if(node!=null){
Message message=node.getMessage();
if(message!=null&&node.getRegionDestination()!=null){
DeadLetterStrategy
deadLetterStrategy=node
.getRegionDestination().getDeadLetterStrategy();
if(deadLetterStrategy!=null){
if(deadLetterStrategy.isSendToDeadLetterQueue(message)){
long
expiration=message.getExpiration();
message.setExpiration(0);
message.setProperty("originalExpiration",new Long(
expiration));
if(!message.isPersistent()){
message.setPersistent(true);
message.setProperty("originalDeliveryMode",
"NON_PERSISTENT");
}
// The original
destination and transaction id do
// not get filled when
the message is first
// sent,
// it is only populated
if the message is routed to
// another destination
like the DLQ
ActiveMQDestination
deadLetterDestination=deadLetterStrategy
.getDeadLetterQueueFor(message
.getDestination());
if
(context.getBroker()==null) {
context.setBroker(getRoot());
}
BrokerSupport.resend(context,message,
deadLetterDestination);
sent=true;
}
}
}
}
if(sent==false){
LOG.warn("Failed to send "+node+" to dead letter
queue");
}
}catch(Exception e){
LOG.warn("Failed to pass expired message to dead letter
queue",e);
}
}
To be more specific, the last "if":
if(sent==false){
LOG.warn("Failed to send "+node+" to dead letter
queue");
}
Unfortunately, there is neither a java-doc nor a possibility to
increase
the logging-output, so i am clueless why "sent=false" is true.
If you look at the source-code above, there are four possibilites:
node=null || message=null || node.getRegionDestination()=null ||
deadLetterStrategy=null
And that's where i am stuck....
I would really appreciate it, if some of you guys could help me
out......