You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@activemq.apache.org by Manuel Teira <mt...@tid.es> on 2006/09/15 13:30:44 UTC
About JIRA issue AMQ-895
Hello.
I've being checking the SVN repository twice a week, checking if this
issue got corrected, without success.
Any new about it? Is there any further tests I could make to help
identifying the problem?
Regards.
Re: About JIRA issue AMQ-895
Posted by James Strachan <ja...@gmail.com>.
Yeah I think this code could be tidied up a little bit as its a bit
clumsy when it comes to things like the producer / consumer.
FWIW the restartProducer() method should be recreating the producer
when the bridge is restarted?
I've just patched the code so that the producer/consumer are properly
lazily created and you should not get the NullPointerException any
more
On 9/26/06, Manuel Teira <mt...@tid.es> wrote:
> Today, I've setup some debug code in a fresh SVN head revision, trying
> to know why the messages are not being delivered to a bridged broker
> when it's restarted. I think that the problem is that the consumer used
> in org.apache.activemq.network.jms.QueueBridge is no longer valid after
> restarting the remote broker. When I shutdown the remote broker and
> start it again, I'm getting this exception for every message I send:
>
>
> [ERROR][2006/09/26.17:25:46.689][ActiveMQ Session Task]failed to forward
> message on attempt: 1 reason: javax.jms.IllegalStateException: [C4064]:
> Cannot perform operation, producer is closed. message:
> ActiveMQBytesMessage {commandId = 5, responseRequired = true, messageId
> = ID:trabucco-32843-1159284345021-1:0:1:1:1, originalDestination = null,
> originalTransactionId = null, producerId =
> ID:trabucco-32843-1159284345021-1:0:1:1, destination = queue://SUNRECV,
> transactionId = null, expiration = 0, timestamp = 1159284346661, arrival
> = 0, correlationId = null, replyTo = null, persistent = true, type =
> null, priority = 4, groupID = null, groupSequence = 0, targetConsumerId
> = null, compressed = false, userID = null, content =
> org.apache.activemq.util.ByteSequence@511e0a, marshalledProperties =
> null, dataStructure = null, redeliveryCounter = 0, size = 523,
> properties = null, readOnlyProperties = true, readOnlyBody = true}
> ActiveMQBytesMessage{ bytesOut = null, dataOut = null, dataIn = null
> }([C4064]: Cannot perform operation, producer is closed.)
> [ERROR][2006/09/26.17:25:46.690][ActiveMQ Session Task]Stack:
> javax.jms.IllegalStateException: [C4064]: Cannot perform operation,
> producer is closed.
> at
> com.sun.messaging.jmq.jmsclient.MessageProducerImpl.checkState(MessageProducerImpl.java:131)
> at
> com.sun.messaging.jmq.jmsclient.MessageProducerImpl.send(MessageProducerImpl.java:594)
> at
> com.sun.messaging.jmq.jmsclient.QueueSenderImpl.send(QueueSenderImpl.java:120)
> at
> org.apache.activemq.network.jms.QueueBridge.sendMessage(QueueBridge.java:87)
> at
> org.apache.activemq.network.jms.DestinationBridge.onMessage(DestinationBridge.java:138)
> at
> org.apache.activemq.ActiveMQMessageConsumer.dispatch(ActiveMQMessageConsumer.java:830)
> at
> org.apache.activemq.ActiveMQSessionExecutor.dispatch(ActiveMQSessionExecutor.java:96)
> at
> org.apache.activemq.ActiveMQSessionExecutor.iterate(ActiveMQSessionExecutor.java:155)
> at
> org.apache.activemq.thread.PooledTaskRunner.runTask(PooledTaskRunner.java:111)
> at
> org.apache.activemq.thread.PooledTaskRunner.access$100(PooledTaskRunner.java:26)
> at
> org.apache.activemq.thread.PooledTaskRunner$1.run(PooledTaskRunner.java:44)
> at
> edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:650)
> at
> edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:675)
> at java.lang.Thread.run(Thread.java:595)
>
> So, I think that the problem is that the producer is not valid anymore,
> and a posible solution could be try to send the message and, on error,
> recreate the producer in org.apache.activemq.network.jms.QueueBridge.
>
> But I'm suspecting that perhaps that producer is not completely opaque,
> because the method:
>
> protected MessageProducer createProducer()
>
> is returning the created MessageProducer. But I don't know where is it used.
>
> So, could I replace the QueueBridge producer field without fear, or
> should this be made in another way?
>
> Also, I've found that sometimes, when some message is persisted in the
> bridged Queue, and I restart ActiveMQ broker (with the remote broker up)
> messages are not delivered to the remote broker, showing this exception:
>
> [ERROR][2006/09/26.16:59:25.095][ActiveMQ Session Task]failed to forward
> message
> on attempt: 1 reason: java.lang.NullPointerException message:
> ActiveMQBytesMess
> age {commandId = 5, responseRequired = true, messageId =
> ID:trabucco-65508-11592
> 81837792-1:0:1:1:1, originalDestination = null, originalTransactionId =
> null, pr
> oducerId = ID:trabucco-65508-1159281837792-1:0:1:1, destination =
> queue://SUNREC
> V, transactionId = null, expiration = 0, timestamp = 1159281839360,
> arrival = 0,
> correlationId = null, replyTo = null, persistent = true, type = null,
> priority
> = 4, groupID = null, groupSequence = 0, targetConsumerId = null,
> compressed = fa
> lse, userID = null, content =
> org.apache.activemq.util.ByteSequence@107108e, mar
> shalledProperties = null, dataStructure = null, redeliveryCounter = 0,
> size = 52
> 3, properties = null, readOnlyProperties = true, readOnlyBody = true}
> ActiveMQBy
> tesMessage{ bytesOut = null, dataOut = null, dataIn = null }(null)
>
> [ERROR][2006/09/26.16:59:25.096][ActiveMQ Session Task]Stack:
> java.lang.NullPointerException
> at
> org.apache.activemq.network.jms.QueueBridge.sendMessage(QueueBridge.j
> ava:87)
> at
> org.apache.activemq.network.jms.DestinationBridge.onMessage(Destinati
> onBridge.java:138)
> at
> org.apache.activemq.ActiveMQMessageConsumer.dispatch(ActiveMQMessageC
> onsumer.java:830)
> at
> org.apache.activemq.ActiveMQSessionExecutor.dispatch(ActiveMQSessionE
> xecutor.java:96)
> at
> org.apache.activemq.ActiveMQSessionExecutor.iterate(ActiveMQSessionEx
> ecutor.java:155)
> at
> org.apache.activemq.thread.PooledTaskRunner.runTask(PooledTaskRunner.
> java:111)
> at
> org.apache.activemq.thread.PooledTaskRunner.access$100(PooledTaskRunn
> er.java:26)
> at
> org.apache.activemq.thread.PooledTaskRunner$1.run(PooledTaskRunner.ja
> va:44)
> at
> edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor$Wor
> ker.runTask(ThreadPoolExecutor.java:650)
> at
> edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor$Wor
> ker.run(ThreadPoolExecutor.java:675)
> at java.lang.Thread.run(Thread.java:595)
>
> I've put a new log in QueueBridge.sendMessage and found that, sometimes,
> the producer is null:
>
> [INFO][2006/09/26.16:59:25.091][ActiveMQ Session
> Task]QueueBridge.sendMessage, u
> sing producer {null}, producerQueue {Sun Java System MQ Destination
> getName(): SUNRECV
> Class: com.sun.messaging.BasicQueue
> getVERSION(): 3.0
> isReadonly(): false
> getProperties(): {imqDestinationName=SUNRECV,
> imqDestinationDescription=A
> Description for the Destination Object}}
>
>
> I've also thought that a fast fix could be to check if the producer is
> null before trying to send, but I have again the same doubt, is this
> MessageProducer being registered somewere out of this code?
>
> And anyway, I'm not sure that just dropping the MessageProducer and
> recreating it should be enought for the underlying sunmq code to
> reconnect. I suspect that perhaps the producerConnection needs to be
> recreated. Does it sound reasonable?
>
>
> Regards.
>
>
--
James
-------
http://radio.weblogs.com/0112098/
Re: About JIRA issue AMQ-895
Posted by Manuel Teira <mt...@tid.es>.
Today, I've setup some debug code in a fresh SVN head revision, trying
to know why the messages are not being delivered to a bridged broker
when it's restarted. I think that the problem is that the consumer used
in org.apache.activemq.network.jms.QueueBridge is no longer valid after
restarting the remote broker. When I shutdown the remote broker and
start it again, I'm getting this exception for every message I send:
[ERROR][2006/09/26.17:25:46.689][ActiveMQ Session Task]failed to forward
message on attempt: 1 reason: javax.jms.IllegalStateException: [C4064]:
Cannot perform operation, producer is closed. message:
ActiveMQBytesMessage {commandId = 5, responseRequired = true, messageId
= ID:trabucco-32843-1159284345021-1:0:1:1:1, originalDestination = null,
originalTransactionId = null, producerId =
ID:trabucco-32843-1159284345021-1:0:1:1, destination = queue://SUNRECV,
transactionId = null, expiration = 0, timestamp = 1159284346661, arrival
= 0, correlationId = null, replyTo = null, persistent = true, type =
null, priority = 4, groupID = null, groupSequence = 0, targetConsumerId
= null, compressed = false, userID = null, content =
org.apache.activemq.util.ByteSequence@511e0a, marshalledProperties =
null, dataStructure = null, redeliveryCounter = 0, size = 523,
properties = null, readOnlyProperties = true, readOnlyBody = true}
ActiveMQBytesMessage{ bytesOut = null, dataOut = null, dataIn = null
}([C4064]: Cannot perform operation, producer is closed.)
[ERROR][2006/09/26.17:25:46.690][ActiveMQ Session Task]Stack:
javax.jms.IllegalStateException: [C4064]: Cannot perform operation,
producer is closed.
at
com.sun.messaging.jmq.jmsclient.MessageProducerImpl.checkState(MessageProducerImpl.java:131)
at
com.sun.messaging.jmq.jmsclient.MessageProducerImpl.send(MessageProducerImpl.java:594)
at
com.sun.messaging.jmq.jmsclient.QueueSenderImpl.send(QueueSenderImpl.java:120)
at
org.apache.activemq.network.jms.QueueBridge.sendMessage(QueueBridge.java:87)
at
org.apache.activemq.network.jms.DestinationBridge.onMessage(DestinationBridge.java:138)
at
org.apache.activemq.ActiveMQMessageConsumer.dispatch(ActiveMQMessageConsumer.java:830)
at
org.apache.activemq.ActiveMQSessionExecutor.dispatch(ActiveMQSessionExecutor.java:96)
at
org.apache.activemq.ActiveMQSessionExecutor.iterate(ActiveMQSessionExecutor.java:155)
at
org.apache.activemq.thread.PooledTaskRunner.runTask(PooledTaskRunner.java:111)
at
org.apache.activemq.thread.PooledTaskRunner.access$100(PooledTaskRunner.java:26)
at
org.apache.activemq.thread.PooledTaskRunner$1.run(PooledTaskRunner.java:44)
at
edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:650)
at
edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:675)
at java.lang.Thread.run(Thread.java:595)
So, I think that the problem is that the producer is not valid anymore,
and a posible solution could be try to send the message and, on error,
recreate the producer in org.apache.activemq.network.jms.QueueBridge.
But I'm suspecting that perhaps that producer is not completely opaque,
because the method:
protected MessageProducer createProducer()
is returning the created MessageProducer. But I don't know where is it used.
So, could I replace the QueueBridge producer field without fear, or
should this be made in another way?
Also, I've found that sometimes, when some message is persisted in the
bridged Queue, and I restart ActiveMQ broker (with the remote broker up)
messages are not delivered to the remote broker, showing this exception:
[ERROR][2006/09/26.16:59:25.095][ActiveMQ Session Task]failed to forward
message
on attempt: 1 reason: java.lang.NullPointerException message:
ActiveMQBytesMess
age {commandId = 5, responseRequired = true, messageId =
ID:trabucco-65508-11592
81837792-1:0:1:1:1, originalDestination = null, originalTransactionId =
null, pr
oducerId = ID:trabucco-65508-1159281837792-1:0:1:1, destination =
queue://SUNREC
V, transactionId = null, expiration = 0, timestamp = 1159281839360,
arrival = 0,
correlationId = null, replyTo = null, persistent = true, type = null,
priority
= 4, groupID = null, groupSequence = 0, targetConsumerId = null,
compressed = fa
lse, userID = null, content =
org.apache.activemq.util.ByteSequence@107108e, mar
shalledProperties = null, dataStructure = null, redeliveryCounter = 0,
size = 52
3, properties = null, readOnlyProperties = true, readOnlyBody = true}
ActiveMQBy
tesMessage{ bytesOut = null, dataOut = null, dataIn = null }(null)
[ERROR][2006/09/26.16:59:25.096][ActiveMQ Session Task]Stack:
java.lang.NullPointerException
at
org.apache.activemq.network.jms.QueueBridge.sendMessage(QueueBridge.j
ava:87)
at
org.apache.activemq.network.jms.DestinationBridge.onMessage(Destinati
onBridge.java:138)
at
org.apache.activemq.ActiveMQMessageConsumer.dispatch(ActiveMQMessageC
onsumer.java:830)
at
org.apache.activemq.ActiveMQSessionExecutor.dispatch(ActiveMQSessionE
xecutor.java:96)
at
org.apache.activemq.ActiveMQSessionExecutor.iterate(ActiveMQSessionEx
ecutor.java:155)
at
org.apache.activemq.thread.PooledTaskRunner.runTask(PooledTaskRunner.
java:111)
at
org.apache.activemq.thread.PooledTaskRunner.access$100(PooledTaskRunn
er.java:26)
at
org.apache.activemq.thread.PooledTaskRunner$1.run(PooledTaskRunner.ja
va:44)
at
edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor$Wor
ker.runTask(ThreadPoolExecutor.java:650)
at
edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor$Wor
ker.run(ThreadPoolExecutor.java:675)
at java.lang.Thread.run(Thread.java:595)
I've put a new log in QueueBridge.sendMessage and found that, sometimes,
the producer is null:
[INFO][2006/09/26.16:59:25.091][ActiveMQ Session
Task]QueueBridge.sendMessage, u
sing producer {null}, producerQueue {Sun Java System MQ Destination
getName(): SUNRECV
Class: com.sun.messaging.BasicQueue
getVERSION(): 3.0
isReadonly(): false
getProperties(): {imqDestinationName=SUNRECV,
imqDestinationDescription=A
Description for the Destination Object}}
I've also thought that a fast fix could be to check if the producer is
null before trying to send, but I have again the same doubt, is this
MessageProducer being registered somewere out of this code?
And anyway, I'm not sure that just dropping the MessageProducer and
recreating it should be enought for the underlying sunmq code to
reconnect. I suspect that perhaps the producerConnection needs to be
recreated. Does it sound reasonable?
Regards.