ARTEMIS-805 old JMS clients failing on new broker Old JMS clients are getting a CCE related to SessionBindingQueryResponseMessage
Project: http://git-wip-us.apache.org/repos/asf/activemq-artemis/repo Commit: http://git-wip-us.apache.org/repos/asf/activemq-artemis/commit/b2b6743b Tree: http://git-wip-us.apache.org/repos/asf/activemq-artemis/tree/b2b6743b Diff: http://git-wip-us.apache.org/repos/asf/activemq-artemis/diff/b2b6743b Branch: refs/heads/ARTEMIS-780 Commit: b2b6743b5846fd6dfc7cb97021e70dacd0082e0f Parents: b7d79f3 Author: Tomas Hofman <[email protected]> Authored: Mon Oct 17 16:31:27 2016 +0200 Committer: Clebert Suconic <[email protected]> Committed: Wed Oct 19 13:22:56 2016 -0400 ---------------------------------------------------------------------- .../artemis/core/protocol/core/Channel.java | 5 +++++ .../core/impl/ActiveMQSessionContext.java | 18 +++++++++++++++--- .../core/protocol/core/impl/ChannelImpl.java | 5 ++++- .../integration/cluster/util/BackupSyncDelay.java | 5 +++++ 4 files changed, 29 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/b2b6743b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/Channel.java ---------------------------------------------------------------------- diff --git a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/Channel.java b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/Channel.java index bb7b381..9771795 100644 --- a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/Channel.java +++ b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/Channel.java @@ -53,6 +53,11 @@ public interface Channel { boolean supports(byte packetID); /** + * For protocol check + */ + boolean supports(byte packetID, int version); + + /** * Sends a packet on this channel. * * @param packet the packet to send http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/b2b6743b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/ActiveMQSessionContext.java ---------------------------------------------------------------------- diff --git a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/ActiveMQSessionContext.java b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/ActiveMQSessionContext.java index c03f76c..c72e19b 100644 --- a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/ActiveMQSessionContext.java +++ b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/ActiveMQSessionContext.java @@ -61,6 +61,8 @@ import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.RollbackMe import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionAcknowledgeMessage; import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionAddMetaDataMessageV2; import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionBindingQueryMessage; +import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionBindingQueryResponseMessage; +import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionBindingQueryResponseMessage_V2; import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionBindingQueryResponseMessage_V3; import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionCloseMessage; import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionConsumerCloseMessage; @@ -290,9 +292,19 @@ public class ActiveMQSessionContext extends SessionContext { @Override public ClientSession.AddressQuery addressQuery(final SimpleString address) throws ActiveMQException { - SessionBindingQueryResponseMessage_V3 response = (SessionBindingQueryResponseMessage_V3) sessionChannel.sendBlocking(new SessionBindingQueryMessage(address), PacketImpl.SESS_BINDINGQUERY_RESP_V3); - - return new AddressQueryImpl(response.isExists(), response.getQueueNames(), response.isAutoCreateJmsQueues(), response.isAutoCreateJmsTopics()); + if (sessionChannel.supports(PacketImpl.SESS_BINDINGQUERY_RESP_V3, getServerVersion())) { + Packet packet = sessionChannel.sendBlocking(new SessionBindingQueryMessage(address), PacketImpl.SESS_BINDINGQUERY_RESP_V3); + SessionBindingQueryResponseMessage_V3 response = (SessionBindingQueryResponseMessage_V3) packet; + return new AddressQueryImpl(response.isExists(), response.getQueueNames(), response.isAutoCreateJmsQueues(), response.isAutoCreateJmsTopics()); + } else if (sessionChannel.supports(PacketImpl.SESS_BINDINGQUERY_RESP_V2, getServerVersion())) { + Packet packet = sessionChannel.sendBlocking(new SessionBindingQueryMessage(address), PacketImpl.SESS_BINDINGQUERY_RESP_V2); + SessionBindingQueryResponseMessage_V2 response = (SessionBindingQueryResponseMessage_V2) packet; + return new AddressQueryImpl(response.isExists(), response.getQueueNames(), response.isAutoCreateJmsQueues(), false); + } else { + Packet packet = sessionChannel.sendBlocking(new SessionBindingQueryMessage(address), PacketImpl.SESS_BINDINGQUERY_RESP); + SessionBindingQueryResponseMessage response = (SessionBindingQueryResponseMessage) packet; + return new AddressQueryImpl(response.isExists(), response.getQueueNames(), false, false); + } } @Override http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/b2b6743b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/ChannelImpl.java ---------------------------------------------------------------------- diff --git a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/ChannelImpl.java b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/ChannelImpl.java index a51b7b9..41be080 100644 --- a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/ChannelImpl.java +++ b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/ChannelImpl.java @@ -152,8 +152,11 @@ public final class ChannelImpl implements Channel { @Override public boolean supports(final byte packetType) { - int version = connection.getClientVersion(); + return supports(packetType, connection.getClientVersion()); + } + @Override + public boolean supports(final byte packetType, int version) { switch (packetType) { case PacketImpl.CLUSTER_TOPOLOGY_V2: return version >= 122; http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/b2b6743b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/cluster/util/BackupSyncDelay.java ---------------------------------------------------------------------- diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/cluster/util/BackupSyncDelay.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/cluster/util/BackupSyncDelay.java index 7247ede..e4afb5b 100644 --- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/cluster/util/BackupSyncDelay.java +++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/cluster/util/BackupSyncDelay.java @@ -345,5 +345,10 @@ public class BackupSyncDelay implements Interceptor { return true; } + @Override + public boolean supports(byte packetID, int version) { + return true; + } + } }
