You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@activemq.apache.org by andi welchlin <an...@gmail.com> on 2017/12/07 09:06:43 UTC
Artemis 2.4.0 active/active cluster throws NullPointerException
Hello all,
I built active/active cluster with two brokers for my first tests. I can
see in the log that the two brokers built a cluster. After startup
everything looks fine.
I configured one queue and sent a message using AMQP 1.0 to broker1 and
tried to read it from broker2.
But broker2 throws an exception and the message is not sent to the client:
09:34:53,146 ERROR [org.apache.activemq.artemis.core.server] AMQ224016:
Caught exception: java.lang.NullPointerException
at
org.apache.activemq.artemis.protocol.amqp.broker.AMQPMessage.setAddress(AMQPMessage.java:612)
[artemis-amqp-protocol-2.4.0.jar:]
at
org.apache.activemq.artemis.protocol.amqp.broker.AMQPMessage.setAddress(AMQPMessage.java:63)
[artemis-amqp-protocol-2.4.0.jar:]
at
org.apache.activemq.artemis.core.server.impl.ServerSessionImpl.send(ServerSessionImpl.java:1368)
[artemis-server-2.4.0.jar:2.4.0]
at
org.apache.activemq.artemis.core.server.impl.ServerSessionImpl.send(ServerSessionImpl.java:1311)
[artemis-server-2.4.0.jar:2.4.0]
at
org.apache.activemq.artemis.core.server.impl.ServerSessionImpl.send(ServerSessionImpl.java:1304)
[artemis-server-2.4.0.jar:2.4.0]
at
org.apache.activemq.artemis.core.protocol.core.ServerSessionPacketHandler.onSessionSend(ServerSessionPacketHandler.java:690)
[artemis-server-2.4.0.jar:2.4.0]
at
org.apache.activemq.artemis.core.protocol.core.ServerSessionPacketHandler.onMessagePacket(ServerSessionPacketHandler.java:290)
[artemis-server-2.4.0.jar:2.4.0]
at
org.apache.activemq.artemis.utils.actors.Actor.doTask(Actor.java:33)
[artemis-commons-2.4.0.jar:2.4.0]
at
org.apache.activemq.artemis.utils.actors.ProcessorBase$ExecutorTask.run(ProcessorBase.java:53)
[artemis-commons-2.4.0.jar:2.4.0]
at
org.apache.activemq.artemis.utils.actors.OrderedExecutor.doTask(OrderedExecutor.java:42)
[artemis-commons-2.4.0.jar:2.4.0]
at
org.apache.activemq.artemis.utils.actors.OrderedExecutor.doTask(OrderedExecutor.java:31)
[artemis-commons-2.4.0.jar:2.4.0]
at
org.apache.activemq.artemis.utils.actors.ProcessorBase$ExecutorTask.run(ProcessorBase.java:53)
[artemis-commons-2.4.0.jar:2.4.0]
at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
[rt.jar:1.8.0_151]
at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
[rt.jar:1.8.0_151]
at java.lang.Thread.run(Thread.java:748) [rt.jar:1.8.0_151]
The queue is not created on the fly but configured in the brokers, both
brokers have this config:
<queues>
<queue name="awe.test.queue">
<address>awe.test.queue</address>
<durable>true</durable>
</queue>
</queues>
The cluster configuration is pretty much copied from the examples:
<!-- Clustering configuration -->
<broadcast-groups>
<broadcast-group name="my-broadcast-group">
<group-address>${udp-address:231.7.7.7}</group-address>
<group-port>9876</group-port>
<broadcast-period>100</broadcast-period>
<connector-ref>netty-connector</connector-ref>
</broadcast-group>
</broadcast-groups>
<discovery-groups>
<discovery-group name="my-discovery-group">
<group-address>${udp-address:231.7.7.7}</group-address>
<group-port>9876</group-port>
<refresh-timeout>10000</refresh-timeout>
</discovery-group>
</discovery-groups>
<cluster-connections>
<cluster-connection name="my-cluster">
<connector-ref>netty-connector</connector-ref>
<retry-interval>500</retry-interval>
<use-duplicate-detection>true</use-duplicate-detection>
<message-load-balancing>STRICT</message-load-balancing>
<max-hops>1</max-hops>
<discovery-group-ref discovery-group-name="my-discovery-group"/>
</cluster-connection>
</cluster-connections>
<!-- a colocated server that will allow shared store full backups to
be requested-->
<ha-policy>
<shared-store>
<colocated>
<backup-port-offset>100</backup-port-offset>
<backup-request-retries>-1</backup-request-retries>
<backup-request-retry-interval>2000</backup-request-retry-interval>
<max-backups>1</max-backups>
<request-backup>true</request-backup>
<master>
<failover-on-shutdown>true</failover-on-shutdown>
</master>
<slave>
<failover-on-shutdown>true</failover-on-shutdown>
</slave>
</colocated>
</shared-store>
</ha-policy>
I am using qpid-send and qpid-receive as test clients. So when the client
sends it is done like:
qpid-send -b localhost:9800 -a awe.test.queue
'--connection-option={protocol:amqp1.0}' --content-string 'test message Do
7. Dez 09:31:51 CET 2017' --durable=yes
And there is a client which reads using:
qpid-receive -b localhost:9802 -a awe.test.queue
'--connection-option={protocol:amqp1.0}' -t --timeout 500
I think I misconfigured something but I can not imagine what it could be.
Btw. what protocol is used between the two brokers?
I activated only the protocols AMQP and CORE.
Any ideas?
Kind Regards,
Andreas
Re: Artemis 2.4.0 active/active cluster throws NullPointerException
Posted by toddbaert <to...@gmail.com>.
I believe this issue was fixed on Dec 11:
JIRA here:
https://issues.apache.org/jira/browse/ARTEMIS-1542
PRs here:
https://github.com/apache/activemq-artemis/pull/1701
https://github.com/apache/activemq-artemis/pull/1702
--
Sent from: http://activemq.2283324.n4.nabble.com/ActiveMQ-User-f2341805.html
Re: Artemis 2.4.0 active/active cluster throws NullPointerException
Posted by Clebert Suconic <cl...@gmail.com>.
Can you try a snapshot in master.. it sounds something I recently fixed.
On Thu, Dec 7, 2017 at 7:45 AM, andi welchlin <an...@gmail.com> wrote:
> Thank you, Howard.
>
> Created jiira: https://issues.apache.org/jira/browse/ARTEMIS-1542
>
> On Thu, Dec 7, 2017 at 1:05 PM, Howard Gao <ho...@gmail.com> wrote:
>
>> I think you can do a jira for this. It surely sounds like a bug to me.
>>
>> On Thu, Dec 7, 2017 at 5:41 PM, andi welchlin <an...@gmail.com>
>> wrote:
>>
>> > Hello,
>> >
>> > Looking into the code I think this could be a bug:
>> >
>> >
>> > I can see, that AMQPMessage.getAddress() can return null:
>> >
>> >
>> > @Override
>> > public String getAddress() {
>> > if (address == null) {
>> > Properties properties = getProtonMessage().getProperties();
>> > if (properties != null) {
>> > return properties.getTo();
>> > } else {
>> > * return null;*
>> > }
>> > } else {
>> > return address;
>> > }
>> > }
>> >
>> >
>> > But ServerSessionImpl.send() does not check for null, but it should. This
>> > is because SimpleString.toSimpleString() can return null if the input is
>> > null:
>> >
>> >
>> > * SimpleString address = message.getAddressSimpleString();*
>> >
>> > if (defaultAddress == null && address != null) {
>> > defaultAddress = address;
>> > }
>> >
>> >
>> >
>> >
>> > * if (address == null) { // We don't want to force a re-encode
>> > when the message gets sent to the consumer
>> > message.setAddress(defaultAddress); }*
>> >
>> >
>> >
>> > SimpleString:
>> >
>> > public static SimpleString toSimpleString(final String string) {
>> >
>> >
>> > * if (string == null) { return null; }*
>> > return new SimpleString(string);
>> > }
>> >
>> >
>> > What do you think?
>> >
>> > Kind Regards,
>> > Andreas
>> >
>> > On Thu, Dec 7, 2017 at 10:06 AM, andi welchlin <an...@gmail.com>
>> > wrote:
>> >
>> > > Hello all,
>> > >
>> > > I built active/active cluster with two brokers for my first tests. I
>> can
>> > > see in the log that the two brokers built a cluster. After startup
>> > > everything looks fine.
>> > >
>> > > I configured one queue and sent a message using AMQP 1.0 to broker1 and
>> > > tried to read it from broker2.
>> > >
>> > > But broker2 throws an exception and the message is not sent to the
>> > client:
>> > >
>> > > 09:34:53,146 ERROR [org.apache.activemq.artemis.core.server]
>> AMQ224016:
>> > > Caught exception: java.lang.NullPointerException
>> > > at org.apache.activemq.artemis.protocol.amqp.broker.
>> > > AMQPMessage.setAddress(AMQPMessage.java:612)
>> > [artemis-amqp-protocol-2.4.0.
>> > > jar:]
>> > > at org.apache.activemq.artemis.protocol.amqp.broker.
>> > > AMQPMessage.setAddress(AMQPMessage.java:63)
>> > [artemis-amqp-protocol-2.4.0.
>> > > jar:]
>> > > at org.apache.activemq.artemis.core.server.impl.
>> > > ServerSessionImpl.send(ServerSessionImpl.java:1368)
>> > > [artemis-server-2.4.0.jar:2.4.0]
>> > > at org.apache.activemq.artemis.core.server.impl.
>> > > ServerSessionImpl.send(ServerSessionImpl.java:1311)
>> > > [artemis-server-2.4.0.jar:2.4.0]
>> > > at org.apache.activemq.artemis.core.server.impl.
>> > > ServerSessionImpl.send(ServerSessionImpl.java:1304)
>> > > [artemis-server-2.4.0.jar:2.4.0]
>> > > at org.apache.activemq.artemis.core.protocol.core.
>> > > ServerSessionPacketHandler.onSessionSend(ServerSessionPacketHandler.
>> > java:690)
>> > > [artemis-server-2.4.0.jar:2.4.0]
>> > > at org.apache.activemq.artemis.core.protocol.core.
>> > > ServerSessionPacketHandler.onMessagePacket(ServerSessionPacketHandler.
>> > java:290)
>> > > [artemis-server-2.4.0.jar:2.4.0]
>> > > at org.apache.activemq.artemis.utils.actors.Actor.doTask(
>> > Actor.java:33)
>> > > [artemis-commons-2.4.0.jar:2.4.0]
>> > > at org.apache.activemq.artemis.utils.actors.ProcessorBase$
>> > > ExecutorTask.run(ProcessorBase.java:53) [artemis-commons-2.4.0.jar:2.
>> > 4.0]
>> > > at org.apache.activemq.artemis.utils.actors.OrderedExecutor.
>> > > doTask(OrderedExecutor.java:42) [artemis-commons-2.4.0.jar:2.4.0]
>> > > at org.apache.activemq.artemis.utils.actors.OrderedExecutor.
>> > > doTask(OrderedExecutor.java:31) [artemis-commons-2.4.0.jar:2.4.0]
>> > > at org.apache.activemq.artemis.utils.actors.ProcessorBase$
>> > > ExecutorTask.run(ProcessorBase.java:53) [artemis-commons-2.4.0.jar:2.
>> > 4.0]
>> > > at java.util.concurrent.ThreadPoolExecutor.runWorker(
>> > ThreadPoolExecutor.java:1149)
>> > > [rt.jar:1.8.0_151]
>> > > at java.util.concurrent.ThreadPoolExecutor$Worker.run(
>> > ThreadPoolExecutor.java:624)
>> > > [rt.jar:1.8.0_151]
>> > > at java.lang.Thread.run(Thread.java:748) [rt.jar:1.8.0_151]
>> > >
>> > >
>> > > The queue is not created on the fly but configured in the brokers, both
>> > > brokers have this config:
>> > >
>> > > <queues>
>> > > <queue name="awe.test.queue">
>> > > <address>awe.test.queue</address>
>> > > <durable>true</durable>
>> > > </queue>
>> > > </queues>
>> > >
>> > >
>> > > The cluster configuration is pretty much copied from the examples:
>> > >
>> > > <!-- Clustering configuration -->
>> > > <broadcast-groups>
>> > > <broadcast-group name="my-broadcast-group">
>> > > <group-address>${udp-address:231.7.7.7}</group-address>
>> > > <group-port>9876</group-port>
>> > > <broadcast-period>100</broadcast-period>
>> > > <connector-ref>netty-connector</connector-ref>
>> > > </broadcast-group>
>> > > </broadcast-groups>
>> > >
>> > > <discovery-groups>
>> > > <discovery-group name="my-discovery-group">
>> > > <group-address>${udp-address:231.7.7.7}</group-address>
>> > > <group-port>9876</group-port>
>> > > <refresh-timeout>10000</refresh-timeout>
>> > > </discovery-group>
>> > > </discovery-groups>
>> > >
>> > > <cluster-connections>
>> > > <cluster-connection name="my-cluster">
>> > > <connector-ref>netty-connector</connector-ref>
>> > > <retry-interval>500</retry-interval>
>> > > <use-duplicate-detection>true</use-duplicate-detection>
>> > > <message-load-balancing>STRICT</message-load-balancing>
>> > > <max-hops>1</max-hops>
>> > > <discovery-group-ref discovery-group-name="my-
>> > > discovery-group"/>
>> > > </cluster-connection>
>> > > </cluster-connections>
>> > >
>> > > <!-- a colocated server that will allow shared store full backups
>> > to
>> > > be requested-->
>> > > <ha-policy>
>> > > <shared-store>
>> > > <colocated>
>> > > <backup-port-offset>100</backup-port-offset>
>> > > <backup-request-retries>-1</backup-request-retries>
>> > > <backup-request-retry-interval>2000</backup-request-
>> > > retry-interval>
>> > > <max-backups>1</max-backups>
>> > > <request-backup>true</request-backup>
>> > > <master>
>> > > <failover-on-shutdown>true</failover-on-shutdown>
>> > > </master>
>> > > <slave>
>> > > <failover-on-shutdown>true</failover-on-shutdown>
>> > > </slave>
>> > > </colocated>
>> > > </shared-store>
>> > > </ha-policy>
>> > >
>> > >
>> > > I am using qpid-send and qpid-receive as test clients. So when the
>> client
>> > > sends it is done like:
>> > >
>> > > qpid-send -b localhost:9800 -a awe.test.queue '--connection-option={
>> > protocol:amqp1.0}'
>> > > --content-string 'test message Do 7. Dez 09:31:51 CET 2017'
>> --durable=yes
>> > >
>> > >
>> > > And there is a client which reads using:
>> > >
>> > > qpid-receive -b localhost:9802 -a awe.test.queue '--connection-option={
>> > protocol:amqp1.0}'
>> > > -t --timeout 500
>> > >
>> > >
>> > > I think I misconfigured something but I can not imagine what it could
>> be.
>> > >
>> > > Btw. what protocol is used between the two brokers?
>> > >
>> > > I activated only the protocols AMQP and CORE.
>> > >
>> > > Any ideas?
>> > >
>> > > Kind Regards,
>> > > Andreas
>> > >
>> > >
>> >
>>
--
Clebert Suconic
Re: Artemis 2.4.0 active/active cluster throws NullPointerException
Posted by andi welchlin <an...@gmail.com>.
Thank you, Howard.
Created jiira: https://issues.apache.org/jira/browse/ARTEMIS-1542
On Thu, Dec 7, 2017 at 1:05 PM, Howard Gao <ho...@gmail.com> wrote:
> I think you can do a jira for this. It surely sounds like a bug to me.
>
> On Thu, Dec 7, 2017 at 5:41 PM, andi welchlin <an...@gmail.com>
> wrote:
>
> > Hello,
> >
> > Looking into the code I think this could be a bug:
> >
> >
> > I can see, that AMQPMessage.getAddress() can return null:
> >
> >
> > @Override
> > public String getAddress() {
> > if (address == null) {
> > Properties properties = getProtonMessage().getProperties();
> > if (properties != null) {
> > return properties.getTo();
> > } else {
> > * return null;*
> > }
> > } else {
> > return address;
> > }
> > }
> >
> >
> > But ServerSessionImpl.send() does not check for null, but it should. This
> > is because SimpleString.toSimpleString() can return null if the input is
> > null:
> >
> >
> > * SimpleString address = message.getAddressSimpleString();*
> >
> > if (defaultAddress == null && address != null) {
> > defaultAddress = address;
> > }
> >
> >
> >
> >
> > * if (address == null) { // We don't want to force a re-encode
> > when the message gets sent to the consumer
> > message.setAddress(defaultAddress); }*
> >
> >
> >
> > SimpleString:
> >
> > public static SimpleString toSimpleString(final String string) {
> >
> >
> > * if (string == null) { return null; }*
> > return new SimpleString(string);
> > }
> >
> >
> > What do you think?
> >
> > Kind Regards,
> > Andreas
> >
> > On Thu, Dec 7, 2017 at 10:06 AM, andi welchlin <an...@gmail.com>
> > wrote:
> >
> > > Hello all,
> > >
> > > I built active/active cluster with two brokers for my first tests. I
> can
> > > see in the log that the two brokers built a cluster. After startup
> > > everything looks fine.
> > >
> > > I configured one queue and sent a message using AMQP 1.0 to broker1 and
> > > tried to read it from broker2.
> > >
> > > But broker2 throws an exception and the message is not sent to the
> > client:
> > >
> > > 09:34:53,146 ERROR [org.apache.activemq.artemis.core.server]
> AMQ224016:
> > > Caught exception: java.lang.NullPointerException
> > > at org.apache.activemq.artemis.protocol.amqp.broker.
> > > AMQPMessage.setAddress(AMQPMessage.java:612)
> > [artemis-amqp-protocol-2.4.0.
> > > jar:]
> > > at org.apache.activemq.artemis.protocol.amqp.broker.
> > > AMQPMessage.setAddress(AMQPMessage.java:63)
> > [artemis-amqp-protocol-2.4.0.
> > > jar:]
> > > at org.apache.activemq.artemis.core.server.impl.
> > > ServerSessionImpl.send(ServerSessionImpl.java:1368)
> > > [artemis-server-2.4.0.jar:2.4.0]
> > > at org.apache.activemq.artemis.core.server.impl.
> > > ServerSessionImpl.send(ServerSessionImpl.java:1311)
> > > [artemis-server-2.4.0.jar:2.4.0]
> > > at org.apache.activemq.artemis.core.server.impl.
> > > ServerSessionImpl.send(ServerSessionImpl.java:1304)
> > > [artemis-server-2.4.0.jar:2.4.0]
> > > at org.apache.activemq.artemis.core.protocol.core.
> > > ServerSessionPacketHandler.onSessionSend(ServerSessionPacketHandler.
> > java:690)
> > > [artemis-server-2.4.0.jar:2.4.0]
> > > at org.apache.activemq.artemis.core.protocol.core.
> > > ServerSessionPacketHandler.onMessagePacket(ServerSessionPacketHandler.
> > java:290)
> > > [artemis-server-2.4.0.jar:2.4.0]
> > > at org.apache.activemq.artemis.utils.actors.Actor.doTask(
> > Actor.java:33)
> > > [artemis-commons-2.4.0.jar:2.4.0]
> > > at org.apache.activemq.artemis.utils.actors.ProcessorBase$
> > > ExecutorTask.run(ProcessorBase.java:53) [artemis-commons-2.4.0.jar:2.
> > 4.0]
> > > at org.apache.activemq.artemis.utils.actors.OrderedExecutor.
> > > doTask(OrderedExecutor.java:42) [artemis-commons-2.4.0.jar:2.4.0]
> > > at org.apache.activemq.artemis.utils.actors.OrderedExecutor.
> > > doTask(OrderedExecutor.java:31) [artemis-commons-2.4.0.jar:2.4.0]
> > > at org.apache.activemq.artemis.utils.actors.ProcessorBase$
> > > ExecutorTask.run(ProcessorBase.java:53) [artemis-commons-2.4.0.jar:2.
> > 4.0]
> > > at java.util.concurrent.ThreadPoolExecutor.runWorker(
> > ThreadPoolExecutor.java:1149)
> > > [rt.jar:1.8.0_151]
> > > at java.util.concurrent.ThreadPoolExecutor$Worker.run(
> > ThreadPoolExecutor.java:624)
> > > [rt.jar:1.8.0_151]
> > > at java.lang.Thread.run(Thread.java:748) [rt.jar:1.8.0_151]
> > >
> > >
> > > The queue is not created on the fly but configured in the brokers, both
> > > brokers have this config:
> > >
> > > <queues>
> > > <queue name="awe.test.queue">
> > > <address>awe.test.queue</address>
> > > <durable>true</durable>
> > > </queue>
> > > </queues>
> > >
> > >
> > > The cluster configuration is pretty much copied from the examples:
> > >
> > > <!-- Clustering configuration -->
> > > <broadcast-groups>
> > > <broadcast-group name="my-broadcast-group">
> > > <group-address>${udp-address:231.7.7.7}</group-address>
> > > <group-port>9876</group-port>
> > > <broadcast-period>100</broadcast-period>
> > > <connector-ref>netty-connector</connector-ref>
> > > </broadcast-group>
> > > </broadcast-groups>
> > >
> > > <discovery-groups>
> > > <discovery-group name="my-discovery-group">
> > > <group-address>${udp-address:231.7.7.7}</group-address>
> > > <group-port>9876</group-port>
> > > <refresh-timeout>10000</refresh-timeout>
> > > </discovery-group>
> > > </discovery-groups>
> > >
> > > <cluster-connections>
> > > <cluster-connection name="my-cluster">
> > > <connector-ref>netty-connector</connector-ref>
> > > <retry-interval>500</retry-interval>
> > > <use-duplicate-detection>true</use-duplicate-detection>
> > > <message-load-balancing>STRICT</message-load-balancing>
> > > <max-hops>1</max-hops>
> > > <discovery-group-ref discovery-group-name="my-
> > > discovery-group"/>
> > > </cluster-connection>
> > > </cluster-connections>
> > >
> > > <!-- a colocated server that will allow shared store full backups
> > to
> > > be requested-->
> > > <ha-policy>
> > > <shared-store>
> > > <colocated>
> > > <backup-port-offset>100</backup-port-offset>
> > > <backup-request-retries>-1</backup-request-retries>
> > > <backup-request-retry-interval>2000</backup-request-
> > > retry-interval>
> > > <max-backups>1</max-backups>
> > > <request-backup>true</request-backup>
> > > <master>
> > > <failover-on-shutdown>true</failover-on-shutdown>
> > > </master>
> > > <slave>
> > > <failover-on-shutdown>true</failover-on-shutdown>
> > > </slave>
> > > </colocated>
> > > </shared-store>
> > > </ha-policy>
> > >
> > >
> > > I am using qpid-send and qpid-receive as test clients. So when the
> client
> > > sends it is done like:
> > >
> > > qpid-send -b localhost:9800 -a awe.test.queue '--connection-option={
> > protocol:amqp1.0}'
> > > --content-string 'test message Do 7. Dez 09:31:51 CET 2017'
> --durable=yes
> > >
> > >
> > > And there is a client which reads using:
> > >
> > > qpid-receive -b localhost:9802 -a awe.test.queue '--connection-option={
> > protocol:amqp1.0}'
> > > -t --timeout 500
> > >
> > >
> > > I think I misconfigured something but I can not imagine what it could
> be.
> > >
> > > Btw. what protocol is used between the two brokers?
> > >
> > > I activated only the protocols AMQP and CORE.
> > >
> > > Any ideas?
> > >
> > > Kind Regards,
> > > Andreas
> > >
> > >
> >
>
Re: Artemis 2.4.0 active/active cluster throws NullPointerException
Posted by Howard Gao <ho...@gmail.com>.
I think you can do a jira for this. It surely sounds like a bug to me.
On Thu, Dec 7, 2017 at 5:41 PM, andi welchlin <an...@gmail.com>
wrote:
> Hello,
>
> Looking into the code I think this could be a bug:
>
>
> I can see, that AMQPMessage.getAddress() can return null:
>
>
> @Override
> public String getAddress() {
> if (address == null) {
> Properties properties = getProtonMessage().getProperties();
> if (properties != null) {
> return properties.getTo();
> } else {
> * return null;*
> }
> } else {
> return address;
> }
> }
>
>
> But ServerSessionImpl.send() does not check for null, but it should. This
> is because SimpleString.toSimpleString() can return null if the input is
> null:
>
>
> * SimpleString address = message.getAddressSimpleString();*
>
> if (defaultAddress == null && address != null) {
> defaultAddress = address;
> }
>
>
>
>
> * if (address == null) { // We don't want to force a re-encode
> when the message gets sent to the consumer
> message.setAddress(defaultAddress); }*
>
>
>
> SimpleString:
>
> public static SimpleString toSimpleString(final String string) {
>
>
> * if (string == null) { return null; }*
> return new SimpleString(string);
> }
>
>
> What do you think?
>
> Kind Regards,
> Andreas
>
> On Thu, Dec 7, 2017 at 10:06 AM, andi welchlin <an...@gmail.com>
> wrote:
>
> > Hello all,
> >
> > I built active/active cluster with two brokers for my first tests. I can
> > see in the log that the two brokers built a cluster. After startup
> > everything looks fine.
> >
> > I configured one queue and sent a message using AMQP 1.0 to broker1 and
> > tried to read it from broker2.
> >
> > But broker2 throws an exception and the message is not sent to the
> client:
> >
> > 09:34:53,146 ERROR [org.apache.activemq.artemis.core.server] AMQ224016:
> > Caught exception: java.lang.NullPointerException
> > at org.apache.activemq.artemis.protocol.amqp.broker.
> > AMQPMessage.setAddress(AMQPMessage.java:612)
> [artemis-amqp-protocol-2.4.0.
> > jar:]
> > at org.apache.activemq.artemis.protocol.amqp.broker.
> > AMQPMessage.setAddress(AMQPMessage.java:63)
> [artemis-amqp-protocol-2.4.0.
> > jar:]
> > at org.apache.activemq.artemis.core.server.impl.
> > ServerSessionImpl.send(ServerSessionImpl.java:1368)
> > [artemis-server-2.4.0.jar:2.4.0]
> > at org.apache.activemq.artemis.core.server.impl.
> > ServerSessionImpl.send(ServerSessionImpl.java:1311)
> > [artemis-server-2.4.0.jar:2.4.0]
> > at org.apache.activemq.artemis.core.server.impl.
> > ServerSessionImpl.send(ServerSessionImpl.java:1304)
> > [artemis-server-2.4.0.jar:2.4.0]
> > at org.apache.activemq.artemis.core.protocol.core.
> > ServerSessionPacketHandler.onSessionSend(ServerSessionPacketHandler.
> java:690)
> > [artemis-server-2.4.0.jar:2.4.0]
> > at org.apache.activemq.artemis.core.protocol.core.
> > ServerSessionPacketHandler.onMessagePacket(ServerSessionPacketHandler.
> java:290)
> > [artemis-server-2.4.0.jar:2.4.0]
> > at org.apache.activemq.artemis.utils.actors.Actor.doTask(
> Actor.java:33)
> > [artemis-commons-2.4.0.jar:2.4.0]
> > at org.apache.activemq.artemis.utils.actors.ProcessorBase$
> > ExecutorTask.run(ProcessorBase.java:53) [artemis-commons-2.4.0.jar:2.
> 4.0]
> > at org.apache.activemq.artemis.utils.actors.OrderedExecutor.
> > doTask(OrderedExecutor.java:42) [artemis-commons-2.4.0.jar:2.4.0]
> > at org.apache.activemq.artemis.utils.actors.OrderedExecutor.
> > doTask(OrderedExecutor.java:31) [artemis-commons-2.4.0.jar:2.4.0]
> > at org.apache.activemq.artemis.utils.actors.ProcessorBase$
> > ExecutorTask.run(ProcessorBase.java:53) [artemis-commons-2.4.0.jar:2.
> 4.0]
> > at java.util.concurrent.ThreadPoolExecutor.runWorker(
> ThreadPoolExecutor.java:1149)
> > [rt.jar:1.8.0_151]
> > at java.util.concurrent.ThreadPoolExecutor$Worker.run(
> ThreadPoolExecutor.java:624)
> > [rt.jar:1.8.0_151]
> > at java.lang.Thread.run(Thread.java:748) [rt.jar:1.8.0_151]
> >
> >
> > The queue is not created on the fly but configured in the brokers, both
> > brokers have this config:
> >
> > <queues>
> > <queue name="awe.test.queue">
> > <address>awe.test.queue</address>
> > <durable>true</durable>
> > </queue>
> > </queues>
> >
> >
> > The cluster configuration is pretty much copied from the examples:
> >
> > <!-- Clustering configuration -->
> > <broadcast-groups>
> > <broadcast-group name="my-broadcast-group">
> > <group-address>${udp-address:231.7.7.7}</group-address>
> > <group-port>9876</group-port>
> > <broadcast-period>100</broadcast-period>
> > <connector-ref>netty-connector</connector-ref>
> > </broadcast-group>
> > </broadcast-groups>
> >
> > <discovery-groups>
> > <discovery-group name="my-discovery-group">
> > <group-address>${udp-address:231.7.7.7}</group-address>
> > <group-port>9876</group-port>
> > <refresh-timeout>10000</refresh-timeout>
> > </discovery-group>
> > </discovery-groups>
> >
> > <cluster-connections>
> > <cluster-connection name="my-cluster">
> > <connector-ref>netty-connector</connector-ref>
> > <retry-interval>500</retry-interval>
> > <use-duplicate-detection>true</use-duplicate-detection>
> > <message-load-balancing>STRICT</message-load-balancing>
> > <max-hops>1</max-hops>
> > <discovery-group-ref discovery-group-name="my-
> > discovery-group"/>
> > </cluster-connection>
> > </cluster-connections>
> >
> > <!-- a colocated server that will allow shared store full backups
> to
> > be requested-->
> > <ha-policy>
> > <shared-store>
> > <colocated>
> > <backup-port-offset>100</backup-port-offset>
> > <backup-request-retries>-1</backup-request-retries>
> > <backup-request-retry-interval>2000</backup-request-
> > retry-interval>
> > <max-backups>1</max-backups>
> > <request-backup>true</request-backup>
> > <master>
> > <failover-on-shutdown>true</failover-on-shutdown>
> > </master>
> > <slave>
> > <failover-on-shutdown>true</failover-on-shutdown>
> > </slave>
> > </colocated>
> > </shared-store>
> > </ha-policy>
> >
> >
> > I am using qpid-send and qpid-receive as test clients. So when the client
> > sends it is done like:
> >
> > qpid-send -b localhost:9800 -a awe.test.queue '--connection-option={
> protocol:amqp1.0}'
> > --content-string 'test message Do 7. Dez 09:31:51 CET 2017' --durable=yes
> >
> >
> > And there is a client which reads using:
> >
> > qpid-receive -b localhost:9802 -a awe.test.queue '--connection-option={
> protocol:amqp1.0}'
> > -t --timeout 500
> >
> >
> > I think I misconfigured something but I can not imagine what it could be.
> >
> > Btw. what protocol is used between the two brokers?
> >
> > I activated only the protocols AMQP and CORE.
> >
> > Any ideas?
> >
> > Kind Regards,
> > Andreas
> >
> >
>
Re: Artemis 2.4.0 active/active cluster throws NullPointerException
Posted by andi welchlin <an...@gmail.com>.
Hello,
Looking into the code I think this could be a bug:
I can see, that AMQPMessage.getAddress() can return null:
@Override
public String getAddress() {
if (address == null) {
Properties properties = getProtonMessage().getProperties();
if (properties != null) {
return properties.getTo();
} else {
* return null;*
}
} else {
return address;
}
}
But ServerSessionImpl.send() does not check for null, but it should. This
is because SimpleString.toSimpleString() can return null if the input is
null:
* SimpleString address = message.getAddressSimpleString();*
if (defaultAddress == null && address != null) {
defaultAddress = address;
}
* if (address == null) { // We don't want to force a re-encode
when the message gets sent to the consumer
message.setAddress(defaultAddress); }*
SimpleString:
public static SimpleString toSimpleString(final String string) {
* if (string == null) { return null; }*
return new SimpleString(string);
}
What do you think?
Kind Regards,
Andreas
On Thu, Dec 7, 2017 at 10:06 AM, andi welchlin <an...@gmail.com>
wrote:
> Hello all,
>
> I built active/active cluster with two brokers for my first tests. I can
> see in the log that the two brokers built a cluster. After startup
> everything looks fine.
>
> I configured one queue and sent a message using AMQP 1.0 to broker1 and
> tried to read it from broker2.
>
> But broker2 throws an exception and the message is not sent to the client:
>
> 09:34:53,146 ERROR [org.apache.activemq.artemis.core.server] AMQ224016:
> Caught exception: java.lang.NullPointerException
> at org.apache.activemq.artemis.protocol.amqp.broker.
> AMQPMessage.setAddress(AMQPMessage.java:612) [artemis-amqp-protocol-2.4.0.
> jar:]
> at org.apache.activemq.artemis.protocol.amqp.broker.
> AMQPMessage.setAddress(AMQPMessage.java:63) [artemis-amqp-protocol-2.4.0.
> jar:]
> at org.apache.activemq.artemis.core.server.impl.
> ServerSessionImpl.send(ServerSessionImpl.java:1368)
> [artemis-server-2.4.0.jar:2.4.0]
> at org.apache.activemq.artemis.core.server.impl.
> ServerSessionImpl.send(ServerSessionImpl.java:1311)
> [artemis-server-2.4.0.jar:2.4.0]
> at org.apache.activemq.artemis.core.server.impl.
> ServerSessionImpl.send(ServerSessionImpl.java:1304)
> [artemis-server-2.4.0.jar:2.4.0]
> at org.apache.activemq.artemis.core.protocol.core.
> ServerSessionPacketHandler.onSessionSend(ServerSessionPacketHandler.java:690)
> [artemis-server-2.4.0.jar:2.4.0]
> at org.apache.activemq.artemis.core.protocol.core.
> ServerSessionPacketHandler.onMessagePacket(ServerSessionPacketHandler.java:290)
> [artemis-server-2.4.0.jar:2.4.0]
> at org.apache.activemq.artemis.utils.actors.Actor.doTask(Actor.java:33)
> [artemis-commons-2.4.0.jar:2.4.0]
> at org.apache.activemq.artemis.utils.actors.ProcessorBase$
> ExecutorTask.run(ProcessorBase.java:53) [artemis-commons-2.4.0.jar:2.4.0]
> at org.apache.activemq.artemis.utils.actors.OrderedExecutor.
> doTask(OrderedExecutor.java:42) [artemis-commons-2.4.0.jar:2.4.0]
> at org.apache.activemq.artemis.utils.actors.OrderedExecutor.
> doTask(OrderedExecutor.java:31) [artemis-commons-2.4.0.jar:2.4.0]
> at org.apache.activemq.artemis.utils.actors.ProcessorBase$
> ExecutorTask.run(ProcessorBase.java:53) [artemis-commons-2.4.0.jar:2.4.0]
> at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
> [rt.jar:1.8.0_151]
> at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
> [rt.jar:1.8.0_151]
> at java.lang.Thread.run(Thread.java:748) [rt.jar:1.8.0_151]
>
>
> The queue is not created on the fly but configured in the brokers, both
> brokers have this config:
>
> <queues>
> <queue name="awe.test.queue">
> <address>awe.test.queue</address>
> <durable>true</durable>
> </queue>
> </queues>
>
>
> The cluster configuration is pretty much copied from the examples:
>
> <!-- Clustering configuration -->
> <broadcast-groups>
> <broadcast-group name="my-broadcast-group">
> <group-address>${udp-address:231.7.7.7}</group-address>
> <group-port>9876</group-port>
> <broadcast-period>100</broadcast-period>
> <connector-ref>netty-connector</connector-ref>
> </broadcast-group>
> </broadcast-groups>
>
> <discovery-groups>
> <discovery-group name="my-discovery-group">
> <group-address>${udp-address:231.7.7.7}</group-address>
> <group-port>9876</group-port>
> <refresh-timeout>10000</refresh-timeout>
> </discovery-group>
> </discovery-groups>
>
> <cluster-connections>
> <cluster-connection name="my-cluster">
> <connector-ref>netty-connector</connector-ref>
> <retry-interval>500</retry-interval>
> <use-duplicate-detection>true</use-duplicate-detection>
> <message-load-balancing>STRICT</message-load-balancing>
> <max-hops>1</max-hops>
> <discovery-group-ref discovery-group-name="my-
> discovery-group"/>
> </cluster-connection>
> </cluster-connections>
>
> <!-- a colocated server that will allow shared store full backups to
> be requested-->
> <ha-policy>
> <shared-store>
> <colocated>
> <backup-port-offset>100</backup-port-offset>
> <backup-request-retries>-1</backup-request-retries>
> <backup-request-retry-interval>2000</backup-request-
> retry-interval>
> <max-backups>1</max-backups>
> <request-backup>true</request-backup>
> <master>
> <failover-on-shutdown>true</failover-on-shutdown>
> </master>
> <slave>
> <failover-on-shutdown>true</failover-on-shutdown>
> </slave>
> </colocated>
> </shared-store>
> </ha-policy>
>
>
> I am using qpid-send and qpid-receive as test clients. So when the client
> sends it is done like:
>
> qpid-send -b localhost:9800 -a awe.test.queue '--connection-option={protocol:amqp1.0}'
> --content-string 'test message Do 7. Dez 09:31:51 CET 2017' --durable=yes
>
>
> And there is a client which reads using:
>
> qpid-receive -b localhost:9802 -a awe.test.queue '--connection-option={protocol:amqp1.0}'
> -t --timeout 500
>
>
> I think I misconfigured something but I can not imagine what it could be.
>
> Btw. what protocol is used between the two brokers?
>
> I activated only the protocols AMQP and CORE.
>
> Any ideas?
>
> Kind Regards,
> Andreas
>
>