Search in sources :

Example 1 with SessionCreateConsumerMessage

use of org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionCreateConsumerMessage in project activemq-artemis by apache.

the class ServerSessionPacketHandler method slowPacketHandler.

// This is being separated from onMessagePacket as JIT was more efficient with a small method for the
// hot executions.
private void slowPacketHandler(final Packet packet) {
    final byte type = packet.getType();
    storageManager.setContext(session.getSessionContext());
    Packet response = null;
    boolean flush = false;
    boolean closeChannel = false;
    boolean requiresResponse = false;
    try {
        try {
            switch(type) {
                case SESS_SEND_LARGE:
                    {
                        SessionSendLargeMessage message = (SessionSendLargeMessage) packet;
                        sendLarge(message.getLargeMessage());
                        break;
                    }
                case SESS_SEND_CONTINUATION:
                    {
                        SessionSendContinuationMessage message = (SessionSendContinuationMessage) packet;
                        requiresResponse = message.isRequiresResponse();
                        sendContinuations(message.getPacketSize(), message.getMessageBodySize(), message.getBody(), message.isContinues());
                        if (requiresResponse) {
                            response = new NullResponseMessage();
                        }
                        break;
                    }
                case SESS_CREATECONSUMER:
                    {
                        SessionCreateConsumerMessage request = (SessionCreateConsumerMessage) packet;
                        requiresResponse = request.isRequiresResponse();
                        session.createConsumer(request.getID(), request.getQueueName(), request.getFilterString(), request.isBrowseOnly());
                        if (requiresResponse) {
                            // We send back queue information on the queue as a response- this allows the queue to
                            // be automatically recreated on failover
                            QueueQueryResult queueQueryResult = session.executeQueueQuery(request.getQueueName());
                            if (channel.supports(PacketImpl.SESS_QUEUEQUERY_RESP_V3)) {
                                response = new SessionQueueQueryResponseMessage_V3(queueQueryResult);
                            } else if (channel.supports(PacketImpl.SESS_QUEUEQUERY_RESP_V2)) {
                                response = new SessionQueueQueryResponseMessage_V2(queueQueryResult);
                            } else {
                                response = new SessionQueueQueryResponseMessage(queueQueryResult);
                            }
                        }
                        break;
                    }
                case CREATE_ADDRESS:
                    {
                        CreateAddressMessage request = (CreateAddressMessage) packet;
                        requiresResponse = request.isRequiresResponse();
                        session.createAddress(request.getAddress(), request.getRoutingTypes(), request.isAutoCreated());
                        if (requiresResponse) {
                            response = new NullResponseMessage();
                        }
                        break;
                    }
                case CREATE_QUEUE:
                    {
                        CreateQueueMessage request = (CreateQueueMessage) packet;
                        requiresResponse = request.isRequiresResponse();
                        session.createQueue(request.getAddress(), request.getQueueName(), RoutingType.MULTICAST, request.getFilterString(), request.isTemporary(), request.isDurable());
                        if (requiresResponse) {
                            response = new NullResponseMessage();
                        }
                        break;
                    }
                case CREATE_QUEUE_V2:
                    {
                        CreateQueueMessage_V2 request = (CreateQueueMessage_V2) packet;
                        requiresResponse = request.isRequiresResponse();
                        session.createQueue(request.getAddress(), request.getQueueName(), request.getRoutingType(), request.getFilterString(), request.isTemporary(), request.isDurable(), request.getMaxConsumers(), request.isPurgeOnNoConsumers(), request.isExclusive(), request.isLastValue(), request.isAutoCreated());
                        if (requiresResponse) {
                            response = new NullResponseMessage();
                        }
                        break;
                    }
                case CREATE_SHARED_QUEUE:
                    {
                        CreateSharedQueueMessage request = (CreateSharedQueueMessage) packet;
                        requiresResponse = request.isRequiresResponse();
                        session.createSharedQueue(request.getAddress(), request.getQueueName(), request.isDurable(), request.getFilterString());
                        if (requiresResponse) {
                            response = new NullResponseMessage();
                        }
                        break;
                    }
                case CREATE_SHARED_QUEUE_V2:
                    {
                        CreateSharedQueueMessage_V2 request = (CreateSharedQueueMessage_V2) packet;
                        requiresResponse = request.isRequiresResponse();
                        session.createSharedQueue(request.getAddress(), request.getQueueName(), request.getRoutingType(), request.getFilterString(), request.isDurable(), request.getMaxConsumers(), request.isPurgeOnNoConsumers(), request.isExclusive(), request.isLastValue());
                        if (requiresResponse) {
                            response = new NullResponseMessage();
                        }
                        break;
                    }
                case DELETE_QUEUE:
                    {
                        requiresResponse = true;
                        SessionDeleteQueueMessage request = (SessionDeleteQueueMessage) packet;
                        session.deleteQueue(request.getQueueName());
                        response = new NullResponseMessage();
                        break;
                    }
                case SESS_QUEUEQUERY:
                    {
                        requiresResponse = true;
                        SessionQueueQueryMessage request = (SessionQueueQueryMessage) packet;
                        QueueQueryResult result = session.executeQueueQuery(request.getQueueName());
                        if (result.isExists() && remotingConnection.getChannelVersion() < PacketImpl.ADDRESSING_CHANGE_VERSION) {
                            result.setAddress(SessionQueueQueryMessage.getOldPrefixedAddress(result.getAddress(), result.getRoutingType()));
                        }
                        if (channel.supports(PacketImpl.SESS_QUEUEQUERY_RESP_V3)) {
                            response = new SessionQueueQueryResponseMessage_V3(result);
                        } else if (channel.supports(PacketImpl.SESS_QUEUEQUERY_RESP_V2)) {
                            response = new SessionQueueQueryResponseMessage_V2(result);
                        } else {
                            response = new SessionQueueQueryResponseMessage(result);
                        }
                        break;
                    }
                case SESS_BINDINGQUERY:
                    {
                        requiresResponse = true;
                        SessionBindingQueryMessage request = (SessionBindingQueryMessage) packet;
                        final int clientVersion = remotingConnection.getChannelVersion();
                        BindingQueryResult result = session.executeBindingQuery(request.getAddress());
                        /* if the session is JMS and it's from an older client then we need to add the old prefix to the queue
                   * names otherwise the older client won't realize the queue exists and will try to create it and receive
                   * an error
                   */
                        if (result.isExists() && clientVersion < PacketImpl.ADDRESSING_CHANGE_VERSION && session.getMetaData(ClientSession.JMS_SESSION_IDENTIFIER_PROPERTY) != null) {
                            final List<SimpleString> queueNames = result.getQueueNames();
                            if (!queueNames.isEmpty()) {
                                final List<SimpleString> convertedQueueNames = request.convertQueueNames(clientVersion, queueNames);
                                if (convertedQueueNames != queueNames) {
                                    result = new BindingQueryResult(result.isExists(), result.getAddressInfo(), convertedQueueNames, result.isAutoCreateQueues(), result.isAutoCreateAddresses(), result.isDefaultPurgeOnNoConsumers(), result.getDefaultMaxConsumers(), result.isDefaultExclusive(), result.isDefaultLastValue());
                                }
                            }
                        }
                        if (channel.supports(PacketImpl.SESS_BINDINGQUERY_RESP_V4)) {
                            response = new SessionBindingQueryResponseMessage_V4(result.isExists(), result.getQueueNames(), result.isAutoCreateQueues(), result.isAutoCreateAddresses(), result.isDefaultPurgeOnNoConsumers(), result.getDefaultMaxConsumers(), result.isDefaultExclusive(), result.isDefaultLastValue());
                        } else if (channel.supports(PacketImpl.SESS_BINDINGQUERY_RESP_V3)) {
                            response = new SessionBindingQueryResponseMessage_V3(result.isExists(), result.getQueueNames(), result.isAutoCreateQueues(), result.isAutoCreateAddresses());
                        } else if (channel.supports(PacketImpl.SESS_BINDINGQUERY_RESP_V2)) {
                            response = new SessionBindingQueryResponseMessage_V2(result.isExists(), result.getQueueNames(), result.isAutoCreateQueues());
                        } else {
                            response = new SessionBindingQueryResponseMessage(result.isExists(), result.getQueueNames());
                        }
                        break;
                    }
                case SESS_EXPIRED:
                    {
                        SessionExpireMessage message = (SessionExpireMessage) packet;
                        session.expire(message.getConsumerID(), message.getMessageID());
                        break;
                    }
                case SESS_COMMIT:
                    {
                        requiresResponse = true;
                        session.commit();
                        response = new NullResponseMessage();
                        break;
                    }
                case SESS_ROLLBACK:
                    {
                        requiresResponse = true;
                        session.rollback(((RollbackMessage) packet).isConsiderLastMessageAsDelivered());
                        response = new NullResponseMessage();
                        break;
                    }
                case SESS_XA_COMMIT:
                    {
                        requiresResponse = true;
                        SessionXACommitMessage message = (SessionXACommitMessage) packet;
                        session.xaCommit(message.getXid(), message.isOnePhase());
                        response = new SessionXAResponseMessage(false, XAResource.XA_OK, null);
                        break;
                    }
                case SESS_XA_END:
                    {
                        requiresResponse = true;
                        SessionXAEndMessage message = (SessionXAEndMessage) packet;
                        session.xaEnd(message.getXid());
                        response = new SessionXAResponseMessage(false, XAResource.XA_OK, null);
                        break;
                    }
                case SESS_XA_FORGET:
                    {
                        requiresResponse = true;
                        SessionXAForgetMessage message = (SessionXAForgetMessage) packet;
                        session.xaForget(message.getXid());
                        response = new SessionXAResponseMessage(false, XAResource.XA_OK, null);
                        break;
                    }
                case SESS_XA_JOIN:
                    {
                        requiresResponse = true;
                        SessionXAJoinMessage message = (SessionXAJoinMessage) packet;
                        session.xaJoin(message.getXid());
                        response = new SessionXAResponseMessage(false, XAResource.XA_OK, null);
                        break;
                    }
                case SESS_XA_RESUME:
                    {
                        requiresResponse = true;
                        SessionXAResumeMessage message = (SessionXAResumeMessage) packet;
                        session.xaResume(message.getXid());
                        response = new SessionXAResponseMessage(false, XAResource.XA_OK, null);
                        break;
                    }
                case SESS_XA_ROLLBACK:
                    {
                        requiresResponse = true;
                        SessionXARollbackMessage message = (SessionXARollbackMessage) packet;
                        session.xaRollback(message.getXid());
                        response = new SessionXAResponseMessage(false, XAResource.XA_OK, null);
                        break;
                    }
                case SESS_XA_START:
                    {
                        requiresResponse = true;
                        SessionXAStartMessage message = (SessionXAStartMessage) packet;
                        session.xaStart(message.getXid());
                        response = new SessionXAResponseMessage(false, XAResource.XA_OK, null);
                        break;
                    }
                case SESS_XA_FAILED:
                    {
                        requiresResponse = true;
                        SessionXAAfterFailedMessage message = (SessionXAAfterFailedMessage) packet;
                        session.xaFailed(message.getXid());
                        // no response on this case
                        break;
                    }
                case SESS_XA_SUSPEND:
                    {
                        requiresResponse = true;
                        session.xaSuspend();
                        response = new SessionXAResponseMessage(false, XAResource.XA_OK, null);
                        break;
                    }
                case SESS_XA_PREPARE:
                    {
                        requiresResponse = true;
                        SessionXAPrepareMessage message = (SessionXAPrepareMessage) packet;
                        session.xaPrepare(message.getXid());
                        response = new SessionXAResponseMessage(false, XAResource.XA_OK, null);
                        break;
                    }
                case SESS_XA_INDOUBT_XIDS:
                    {
                        requiresResponse = true;
                        List<Xid> xids = session.xaGetInDoubtXids();
                        response = new SessionXAGetInDoubtXidsResponseMessage(xids);
                        break;
                    }
                case SESS_XA_GET_TIMEOUT:
                    {
                        requiresResponse = true;
                        int timeout = session.xaGetTimeout();
                        response = new SessionXAGetTimeoutResponseMessage(timeout);
                        break;
                    }
                case SESS_XA_SET_TIMEOUT:
                    {
                        requiresResponse = true;
                        SessionXASetTimeoutMessage message = (SessionXASetTimeoutMessage) packet;
                        session.xaSetTimeout(message.getTimeoutSeconds());
                        response = new SessionXASetTimeoutResponseMessage(true);
                        break;
                    }
                case SESS_START:
                    {
                        session.start();
                        break;
                    }
                case SESS_STOP:
                    {
                        requiresResponse = true;
                        session.stop();
                        response = new NullResponseMessage();
                        break;
                    }
                case SESS_CLOSE:
                    {
                        requiresResponse = true;
                        session.close(false);
                        // removeConnectionListeners();
                        response = new NullResponseMessage();
                        flush = true;
                        closeChannel = true;
                        break;
                    }
                case SESS_INDIVIDUAL_ACKNOWLEDGE:
                    {
                        SessionIndividualAcknowledgeMessage message = (SessionIndividualAcknowledgeMessage) packet;
                        requiresResponse = message.isRequiresResponse();
                        session.individualAcknowledge(message.getConsumerID(), message.getMessageID());
                        if (requiresResponse) {
                            response = new NullResponseMessage();
                        }
                        break;
                    }
                case SESS_CONSUMER_CLOSE:
                    {
                        requiresResponse = true;
                        SessionConsumerCloseMessage message = (SessionConsumerCloseMessage) packet;
                        session.closeConsumer(message.getConsumerID());
                        response = new NullResponseMessage();
                        break;
                    }
                case SESS_FORCE_CONSUMER_DELIVERY:
                    {
                        SessionForceConsumerDelivery message = (SessionForceConsumerDelivery) packet;
                        session.forceConsumerDelivery(message.getConsumerID(), message.getSequence());
                        break;
                    }
                case PacketImpl.SESS_ADD_METADATA:
                    {
                        response = new NullResponseMessage();
                        SessionAddMetaDataMessage message = (SessionAddMetaDataMessage) packet;
                        session.addMetaData(message.getKey(), message.getData());
                        break;
                    }
                case PacketImpl.SESS_ADD_METADATA2:
                    {
                        requiresResponse = true;
                        SessionAddMetaDataMessageV2 message = (SessionAddMetaDataMessageV2) packet;
                        if (message.isRequiresConfirmations()) {
                            response = new NullResponseMessage();
                        }
                        session.addMetaData(message.getKey(), message.getData());
                        break;
                    }
                case PacketImpl.SESS_UNIQUE_ADD_METADATA:
                    {
                        requiresResponse = true;
                        SessionUniqueAddMetaDataMessage message = (SessionUniqueAddMetaDataMessage) packet;
                        if (session.addUniqueMetaData(message.getKey(), message.getData())) {
                            response = new NullResponseMessage();
                        } else {
                            response = new ActiveMQExceptionMessage(ActiveMQMessageBundle.BUNDLE.duplicateMetadata(message.getKey(), message.getData()));
                        }
                        break;
                    }
            }
        } catch (ActiveMQIOErrorException e) {
            response = onActiveMQIOErrorExceptionWhileHandlePacket(e, requiresResponse, response, this.session);
        } catch (ActiveMQXAException e) {
            response = onActiveMQXAExceptionWhileHandlePacket(e, requiresResponse, response);
        } catch (ActiveMQQueueMaxConsumerLimitReached e) {
            response = onActiveMQQueueMaxConsumerLimitReachedWhileHandlePacket(e, requiresResponse, response);
        } catch (ActiveMQException e) {
            response = onActiveMQExceptionWhileHandlePacket(e, requiresResponse, response);
        } catch (Throwable t) {
            response = onCatchThrowableWhileHandlePacket(t, requiresResponse, response, this.session);
        }
        sendResponse(packet, response, flush, closeChannel);
    } finally {
        storageManager.clearContext();
    }
}
Also used : SessionXAGetInDoubtXidsResponseMessage(org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionXAGetInDoubtXidsResponseMessage) SessionUniqueAddMetaDataMessage(org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionUniqueAddMetaDataMessage) SessionXASetTimeoutResponseMessage(org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionXASetTimeoutResponseMessage) SessionCreateConsumerMessage(org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionCreateConsumerMessage) SessionExpireMessage(org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionExpireMessage) ActiveMQException(org.apache.activemq.artemis.api.core.ActiveMQException) CreateQueueMessage_V2(org.apache.activemq.artemis.core.protocol.core.impl.wireformat.CreateQueueMessage_V2) List(java.util.List) ActiveMQXAException(org.apache.activemq.artemis.core.exception.ActiveMQXAException) RollbackMessage(org.apache.activemq.artemis.core.protocol.core.impl.wireformat.RollbackMessage) SessionXARollbackMessage(org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionXARollbackMessage) SessionXAResponseMessage(org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionXAResponseMessage) CreateAddressMessage(org.apache.activemq.artemis.core.protocol.core.impl.wireformat.CreateAddressMessage) ActiveMQExceptionMessage(org.apache.activemq.artemis.core.protocol.core.impl.wireformat.ActiveMQExceptionMessage) SessionXAResumeMessage(org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionXAResumeMessage) SessionAddMetaDataMessageV2(org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionAddMetaDataMessageV2) SessionXAStartMessage(org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionXAStartMessage) ActiveMQIOErrorException(org.apache.activemq.artemis.api.core.ActiveMQIOErrorException) SessionAddMetaDataMessage(org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionAddMetaDataMessage) SessionConsumerCloseMessage(org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionConsumerCloseMessage) SessionQueueQueryResponseMessage(org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionQueueQueryResponseMessage) SessionXAGetTimeoutResponseMessage(org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionXAGetTimeoutResponseMessage) SessionXACommitMessage(org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionXACommitMessage) BindingQueryResult(org.apache.activemq.artemis.core.server.BindingQueryResult) SessionXASetTimeoutMessage(org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionXASetTimeoutMessage) SessionSendContinuationMessage(org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionSendContinuationMessage) SessionXAAfterFailedMessage(org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionXAAfterFailedMessage) SessionXAJoinMessage(org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionXAJoinMessage) CreateSharedQueueMessage(org.apache.activemq.artemis.core.protocol.core.impl.wireformat.CreateSharedQueueMessage) NullResponseMessage(org.apache.activemq.artemis.core.protocol.core.impl.wireformat.NullResponseMessage) CreateSharedQueueMessage_V2(org.apache.activemq.artemis.core.protocol.core.impl.wireformat.CreateSharedQueueMessage_V2) QueueQueryResult(org.apache.activemq.artemis.core.server.QueueQueryResult) SessionIndividualAcknowledgeMessage(org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionIndividualAcknowledgeMessage) SessionDeleteQueueMessage(org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionDeleteQueueMessage) SessionForceConsumerDelivery(org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionForceConsumerDelivery) SessionBindingQueryResponseMessage(org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionBindingQueryResponseMessage) SessionXARollbackMessage(org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionXARollbackMessage) CreateQueueMessage(org.apache.activemq.artemis.core.protocol.core.impl.wireformat.CreateQueueMessage) SessionBindingQueryMessage(org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionBindingQueryMessage) SessionSendLargeMessage(org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionSendLargeMessage) SessionQueueQueryResponseMessage_V2(org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionQueueQueryResponseMessage_V2) SessionQueueQueryResponseMessage_V3(org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionQueueQueryResponseMessage_V3) SessionBindingQueryResponseMessage_V2(org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionBindingQueryResponseMessage_V2) SessionBindingQueryResponseMessage_V3(org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionBindingQueryResponseMessage_V3) SessionXAEndMessage(org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionXAEndMessage) ActiveMQQueueMaxConsumerLimitReached(org.apache.activemq.artemis.api.core.ActiveMQQueueMaxConsumerLimitReached) SessionQueueQueryMessage(org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionQueueQueryMessage) SessionXAPrepareMessage(org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionXAPrepareMessage) SessionBindingQueryResponseMessage_V4(org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionBindingQueryResponseMessage_V4) SessionXAForgetMessage(org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionXAForgetMessage)

Example 2 with SessionCreateConsumerMessage

use of org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionCreateConsumerMessage in project activemq-artemis by apache.

the class ActiveMQSessionContext method createConsumer.

@Override
public ClientConsumerInternal createConsumer(SimpleString queueName, SimpleString filterString, int windowSize, int maxRate, int ackBatchSize, boolean browseOnly, Executor executor, Executor flowControlExecutor) throws ActiveMQException {
    long consumerID = idGenerator.generateID();
    ActiveMQConsumerContext consumerContext = new ActiveMQConsumerContext(consumerID);
    SessionCreateConsumerMessage request = new SessionCreateConsumerMessage(consumerID, queueName, filterString, browseOnly, true);
    SessionQueueQueryResponseMessage queueInfo;
    if (sessionChannel.getConnection().isVersionBeforeAddressChange()) {
        queueInfo = (SessionQueueQueryResponseMessage) sessionChannel.sendBlocking(request, PacketImpl.SESS_QUEUEQUERY_RESP_V2);
    } else {
        queueInfo = (SessionQueueQueryResponseMessage) sessionChannel.sendBlocking(request, PacketImpl.SESS_QUEUEQUERY_RESP_V3);
    }
    return new ClientConsumerImpl(session, consumerContext, queueName, filterString, browseOnly, calcWindowSize(windowSize), ackBatchSize, maxRate > 0 ? new TokenBucketLimiterImpl(maxRate, false) : null, executor, flowControlExecutor, this, queueInfo.toQueueQuery(), lookupTCCL());
}
Also used : ClientConsumerImpl(org.apache.activemq.artemis.core.client.impl.ClientConsumerImpl) SessionQueueQueryResponseMessage(org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionQueueQueryResponseMessage) TokenBucketLimiterImpl(org.apache.activemq.artemis.utils.TokenBucketLimiterImpl) SessionCreateConsumerMessage(org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionCreateConsumerMessage)

Example 3 with SessionCreateConsumerMessage

use of org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionCreateConsumerMessage in project activemq-artemis by apache.

the class ActiveMQSessionContext method recreateConsumerOnServer.

@Override
public void recreateConsumerOnServer(ClientConsumerInternal consumerInternal, long consumerId, boolean isSessionStarted) throws ActiveMQException {
    ClientSession.QueueQuery queueInfo = consumerInternal.getQueueInfo();
    // This allows e.g. JMS non durable subs and temporary queues to continue to be used after failover
    if (!queueInfo.isDurable()) {
        CreateQueueMessage_V2 createQueueRequest = new CreateQueueMessage_V2(queueInfo.getAddress(), queueInfo.getName(), queueInfo.getRoutingType(), queueInfo.getFilterString(), false, queueInfo.isTemporary(), queueInfo.getMaxConsumers(), queueInfo.isPurgeOnNoConsumers(), queueInfo.isAutoCreated(), false, queueInfo.isExclusive(), queueInfo.isLastValue());
        sendPacketWithoutLock(sessionChannel, createQueueRequest);
    }
    SessionCreateConsumerMessage createConsumerRequest = new SessionCreateConsumerMessage(getConsumerID(consumerInternal), consumerInternal.getQueueName(), consumerInternal.getFilterString(), consumerInternal.isBrowseOnly(), false);
    sendPacketWithoutLock(sessionChannel, createConsumerRequest);
    int clientWindowSize = consumerInternal.getClientWindowSize();
    if (clientWindowSize != 0) {
        SessionConsumerFlowCreditMessage packet = new SessionConsumerFlowCreditMessage(getConsumerID(consumerInternal), clientWindowSize);
        sendPacketWithoutLock(sessionChannel, packet);
    } else {
        // https://jira.jboss.org/browse/HORNETQ-522
        SessionConsumerFlowCreditMessage packet = new SessionConsumerFlowCreditMessage(getConsumerID(consumerInternal), 1);
        sendPacketWithoutLock(sessionChannel, packet);
    }
    // (in which case the consumer will wake up, thus avoid the infinite waiting).
    if (isSessionStarted && consumerInternal.getForceDeliveryCount() > 0) {
        SessionForceConsumerDelivery forceDel = new SessionForceConsumerDelivery(consumerId, consumerInternal.getForceDeliveryCount() - 1);
        sendPacketWithoutLock(sessionChannel, forceDel);
    }
}
Also used : ClientSession(org.apache.activemq.artemis.api.core.client.ClientSession) SessionForceConsumerDelivery(org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionForceConsumerDelivery) CreateQueueMessage_V2(org.apache.activemq.artemis.core.protocol.core.impl.wireformat.CreateQueueMessage_V2) SessionConsumerFlowCreditMessage(org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionConsumerFlowCreditMessage) SessionCreateConsumerMessage(org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionCreateConsumerMessage)

Example 4 with SessionCreateConsumerMessage

use of org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionCreateConsumerMessage in project activemq-artemis by apache.

the class HornetQClientSessionContext method createConsumer.

@Override
public ClientConsumerInternal createConsumer(SimpleString queueName, SimpleString filterString, int windowSize, int maxRate, int ackBatchSize, boolean browseOnly, Executor executor, Executor flowControlExecutor) throws ActiveMQException {
    long consumerID = idGenerator.generateID();
    ActiveMQConsumerContext consumerContext = new ActiveMQConsumerContext(consumerID);
    SessionCreateConsumerMessage request = new SessionCreateConsumerMessage(consumerID, queueName, filterString, browseOnly, true);
    SessionQueueQueryResponseMessage queueInfo = (SessionQueueQueryResponseMessage) getSessionChannel().sendBlocking(request, PacketImpl.SESS_QUEUEQUERY_RESP);
    return new ClientConsumerImpl(session, consumerContext, queueName, filterString, browseOnly, calcWindowSize(windowSize), ackBatchSize, maxRate > 0 ? new TokenBucketLimiterImpl(maxRate, false) : null, executor, flowControlExecutor, this, queueInfo.toQueueQuery(), lookupTCCL());
}
Also used : ClientConsumerImpl(org.apache.activemq.artemis.core.client.impl.ClientConsumerImpl) ActiveMQConsumerContext(org.apache.activemq.artemis.core.protocol.core.impl.ActiveMQConsumerContext) SessionQueueQueryResponseMessage(org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionQueueQueryResponseMessage) TokenBucketLimiterImpl(org.apache.activemq.artemis.utils.TokenBucketLimiterImpl) SessionCreateConsumerMessage(org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionCreateConsumerMessage)

Aggregations

SessionCreateConsumerMessage (org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionCreateConsumerMessage)4 SessionQueueQueryResponseMessage (org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionQueueQueryResponseMessage)3 ClientConsumerImpl (org.apache.activemq.artemis.core.client.impl.ClientConsumerImpl)2 CreateQueueMessage_V2 (org.apache.activemq.artemis.core.protocol.core.impl.wireformat.CreateQueueMessage_V2)2 SessionForceConsumerDelivery (org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionForceConsumerDelivery)2 List (java.util.List)1 ActiveMQException (org.apache.activemq.artemis.api.core.ActiveMQException)1 ActiveMQIOErrorException (org.apache.activemq.artemis.api.core.ActiveMQIOErrorException)1 ActiveMQQueueMaxConsumerLimitReached (org.apache.activemq.artemis.api.core.ActiveMQQueueMaxConsumerLimitReached)1 ClientSession (org.apache.activemq.artemis.api.core.client.ClientSession)1 ActiveMQXAException (org.apache.activemq.artemis.core.exception.ActiveMQXAException)1 ActiveMQConsumerContext (org.apache.activemq.artemis.core.protocol.core.impl.ActiveMQConsumerContext)1 ActiveMQExceptionMessage (org.apache.activemq.artemis.core.protocol.core.impl.wireformat.ActiveMQExceptionMessage)1 CreateAddressMessage (org.apache.activemq.artemis.core.protocol.core.impl.wireformat.CreateAddressMessage)1 CreateQueueMessage (org.apache.activemq.artemis.core.protocol.core.impl.wireformat.CreateQueueMessage)1 CreateSharedQueueMessage (org.apache.activemq.artemis.core.protocol.core.impl.wireformat.CreateSharedQueueMessage)1 CreateSharedQueueMessage_V2 (org.apache.activemq.artemis.core.protocol.core.impl.wireformat.CreateSharedQueueMessage_V2)1 NullResponseMessage (org.apache.activemq.artemis.core.protocol.core.impl.wireformat.NullResponseMessage)1 RollbackMessage (org.apache.activemq.artemis.core.protocol.core.impl.wireformat.RollbackMessage)1 SessionAddMetaDataMessage (org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionAddMetaDataMessage)1