Search in sources :

Example 1 with QueueInfo

use of org.apache.activemq.artemis.core.postoffice.QueueInfo in project activemq-artemis by apache.

the class PostOfficeImpl method sendQueueInfoToQueue.

@Override
public void sendQueueInfoToQueue(final SimpleString queueName, final SimpleString address) throws Exception {
    // We send direct to the queue so we can send it to the same queue that is bound to the notifications address -
    // this is crucial for ensuring
    // that queue infos and notifications are received in a contiguous consistent stream
    Binding binding = addressManager.getBinding(queueName);
    if (binding == null) {
        throw new IllegalStateException("Cannot find queue " + queueName);
    }
    if (logger.isDebugEnabled()) {
        logger.debug("PostOffice.sendQueueInfoToQueue on server=" + this.server + ", queueName=" + queueName + " and address=" + address);
    }
    Queue queue = (Queue) binding.getBindable();
    // Need to lock to make sure all queue info and notifications are in the correct order with no gaps
    synchronized (notificationLock) {
        // First send a reset message
        Message message = new CoreMessage(storageManager.generateID(), 50);
        message.setAddress(queueName);
        message.putBooleanProperty(PostOfficeImpl.HDR_RESET_QUEUE_DATA, true);
        routeQueueInfo(message, queue, false);
        for (QueueInfo info : queueInfos.values()) {
            if (logger.isTraceEnabled()) {
                logger.trace("QueueInfo on sendQueueInfoToQueue = " + info);
            }
            if (info.matchesAddress(address)) {
                message = createQueueInfoMessage(CoreNotificationType.BINDING_ADDED, queueName);
                message.putStringProperty(ManagementHelper.HDR_ADDRESS, info.getAddress());
                message.putStringProperty(ManagementHelper.HDR_CLUSTER_NAME, info.getClusterName());
                message.putStringProperty(ManagementHelper.HDR_ROUTING_NAME, info.getRoutingName());
                message.putLongProperty(ManagementHelper.HDR_BINDING_ID, info.getID());
                message.putStringProperty(ManagementHelper.HDR_FILTERSTRING, info.getFilterString());
                message.putIntProperty(ManagementHelper.HDR_DISTANCE, info.getDistance());
                routeQueueInfo(message, queue, true);
                int consumersWithFilters = info.getFilterStrings() != null ? info.getFilterStrings().size() : 0;
                for (int i = 0; i < info.getNumberOfConsumers() - consumersWithFilters; i++) {
                    message = createQueueInfoMessage(CoreNotificationType.CONSUMER_CREATED, queueName);
                    message.putStringProperty(ManagementHelper.HDR_ADDRESS, info.getAddress());
                    message.putStringProperty(ManagementHelper.HDR_CLUSTER_NAME, info.getClusterName());
                    message.putStringProperty(ManagementHelper.HDR_ROUTING_NAME, info.getRoutingName());
                    message.putIntProperty(ManagementHelper.HDR_DISTANCE, info.getDistance());
                    routeQueueInfo(message, queue, true);
                }
                if (info.getFilterStrings() != null) {
                    for (SimpleString filterString : info.getFilterStrings()) {
                        message = createQueueInfoMessage(CoreNotificationType.CONSUMER_CREATED, queueName);
                        message.putStringProperty(ManagementHelper.HDR_ADDRESS, info.getAddress());
                        message.putStringProperty(ManagementHelper.HDR_CLUSTER_NAME, info.getClusterName());
                        message.putStringProperty(ManagementHelper.HDR_ROUTING_NAME, info.getRoutingName());
                        message.putStringProperty(ManagementHelper.HDR_FILTERSTRING, filterString);
                        message.putIntProperty(ManagementHelper.HDR_DISTANCE, info.getDistance());
                        routeQueueInfo(message, queue, true);
                    }
                }
            }
        }
        Message completeMessage = new CoreMessage(storageManager.generateID(), 50);
        completeMessage.setAddress(queueName);
        completeMessage.putBooleanProperty(PostOfficeImpl.HDR_RESET_QUEUE_DATA_COMPLETE, true);
        routeQueueInfo(completeMessage, queue, false);
    }
}
Also used : Binding(org.apache.activemq.artemis.core.postoffice.Binding) QueueBinding(org.apache.activemq.artemis.core.postoffice.QueueBinding) QueueInfo(org.apache.activemq.artemis.core.postoffice.QueueInfo) LargeServerMessage(org.apache.activemq.artemis.core.server.LargeServerMessage) CoreMessage(org.apache.activemq.artemis.core.message.impl.CoreMessage) Message(org.apache.activemq.artemis.api.core.Message) SimpleString(org.apache.activemq.artemis.api.core.SimpleString) Queue(org.apache.activemq.artemis.core.server.Queue) CoreMessage(org.apache.activemq.artemis.core.message.impl.CoreMessage)

Aggregations

Message (org.apache.activemq.artemis.api.core.Message)1 SimpleString (org.apache.activemq.artemis.api.core.SimpleString)1 CoreMessage (org.apache.activemq.artemis.core.message.impl.CoreMessage)1 Binding (org.apache.activemq.artemis.core.postoffice.Binding)1 QueueBinding (org.apache.activemq.artemis.core.postoffice.QueueBinding)1 QueueInfo (org.apache.activemq.artemis.core.postoffice.QueueInfo)1 LargeServerMessage (org.apache.activemq.artemis.core.server.LargeServerMessage)1 Queue (org.apache.activemq.artemis.core.server.Queue)1