/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.activemq.artemis.api.core.management; import javax.management.MBeanOperationInfo; import javax.management.openmbean.CompositeData; import java.util.Map; /** * A QueueControl is used to manage a queue. */ public interface QueueControl { // Attributes ---------------------------------------------------- /** * Returns the name of this queue. */ @Attribute(desc = "name of this queue") String getName(); /** * Returns the address this queue is bound to. */ @Attribute(desc = "address this queue is bound to") String getAddress(); /** * Returns this queue ID. */ @Attribute(desc = "ID of this queue") long getID(); /** * Returns whether this queue is temporary. */ @Attribute(desc = "whether this queue is temporary") boolean isTemporary(); /** * Returns whether this queue is durable. */ @Attribute(desc = "whether this queue is durable") boolean isDurable(); /** * The routing type of this queue. */ @Attribute(desc = "routing type of this queue") String getRoutingType(); /** * Returns the filter associated with this queue. */ @Attribute(desc = "filter associated with this queue") String getFilter(); /** * Returns the number of messages currently in this queue. */ @Attribute(desc = "number of messages currently in this queue (includes scheduled, paged, and in-delivery messages)") long getMessageCount(); /** * Returns the number of scheduled messages in this queue. */ @Attribute(desc = "number of scheduled messages in this queue") long getScheduledCount(); /** * Returns the number of consumers consuming messages from this queue. */ @Attribute(desc = "number of consumers consuming messages from this queue") int getConsumerCount(); /** * Returns the number of messages that this queue is currently delivering to its consumers. */ @Attribute(desc = "number of messages that this queue is currently delivering to its consumers") int getDeliveringCount(); /** * Returns the number of messages added to this queue since it was created. */ @Attribute(desc = "number of messages added to this queue since it was created") long getMessagesAdded(); /** * Returns the number of messages added to this queue since it was created. */ @Attribute(desc = "number of messages acknowledged from this queue since it was created") long getMessagesAcknowledged(); /** * Returns the number of messages expired from this queue since it was created. */ @Attribute(desc = "number of messages expired from this queue since it was created") long getMessagesExpired(); /** * Returns the number of messages removed from this queue since it was created due to exceeding the max delivery attempts. */ @Attribute(desc = "number of messages removed from this queue since it was created due to exceeding the max delivery attempts") long getMessagesKilled(); /** * Returns the first message on the queue as JSON */ @Attribute(desc = "first message on the queue as JSON") String getFirstMessageAsJSON() throws Exception; /** * Returns the timestamp of the first message in milliseconds. */ @Attribute(desc = "timestamp of the first message in milliseconds") Long getFirstMessageTimestamp() throws Exception; /** * Returns the age of the first message in milliseconds. */ @Attribute(desc = "age of the first message in milliseconds") Long getFirstMessageAge() throws Exception; /** * Returns the expiry address associated with this queue. */ @Attribute(desc = "expiry address associated with this queue") String getExpiryAddress(); /** * Returns the dead-letter address associated with this queue. */ @Attribute(desc = "dead-letter address associated with this queue") String getDeadLetterAddress(); /** * */ @Attribute(desc = "maximum number of consumers allowed on this queue at any one time") int getMaxConsumers(); /** * */ @Attribute(desc = "delete this queue when the last consumer disconnects") boolean isPurgeOnNoConsumers(); // Operations ---------------------------------------------------- /** * Lists all the messages scheduled for delivery for this queue. * <br> * 1 Map represents 1 message, keys are the message's properties and headers, values are the corresponding values. */ @Operation(desc = "List the messages scheduled for delivery", impact = MBeanOperationInfo.INFO) Map<String, Object>[] listScheduledMessages() throws Exception; /** * Lists all the messages scheduled for delivery for this queue using JSON serialization. */ @Operation(desc = "List the messages scheduled for delivery and returns them using JSON", impact = MBeanOperationInfo.INFO) String listScheduledMessagesAsJSON() throws Exception; /** * Lists all the messages being deliver per consumer. * <br> * The Map's key is a toString representation for the consumer. Each consumer will then return a {@code Map<String,Object>[]} same way is returned by {@link #listScheduledMessages()} */ @Operation(desc = "List all messages being delivered per consumer") Map<String, Map<String, Object>[]> listDeliveringMessages() throws Exception; /** * Executes a conversion of {@link #listDeliveringMessages()} to JSON * * @return * @throws Exception */ @Operation(desc = "list all messages being delivered per consumer using JSON form") String listDeliveringMessagesAsJSON() throws Exception; /** * Lists all the messages in this queue matching the specified filter. * <br> * 1 Map represents 1 message, keys are the message's properties and headers, values are the corresponding values. * <br> * Using {@code null} or an empty filter will list <em>all</em> messages from this queue. */ @Operation(desc = "List all the messages in the queue matching the given filter", impact = MBeanOperationInfo.INFO) Map<String, Object>[] listMessages(@Parameter(name = "filter", desc = "A message filter (can be empty)") String filter) throws Exception; /** * Lists all the messages in this queue matching the specified filter using JSON serialization. * <br> * Using {@code null} or an empty filter will list <em>all</em> messages from this queue. */ @Operation(desc = "List all the messages in the queue matching the given filter and returns them using JSON", impact = MBeanOperationInfo.INFO) String listMessagesAsJSON(@Parameter(name = "filter", desc = "A message filter (can be empty)") String filter) throws Exception; /** * Counts the number of messages in this queue matching the specified filter. * <br> * Using {@code null} or an empty filter will count <em>all</em> messages from this queue. */ @Operation(desc = "Returns the number of the messages in the queue matching the given filter", impact = MBeanOperationInfo.INFO) long countMessages(@Parameter(name = "filter", desc = "A message filter (can be empty)") String filter) throws Exception; /** * Removes the message corresponding to the specified message ID. * * @return {@code true} if the message was removed, {@code false} else */ @Operation(desc = "Remove the message corresponding to the given messageID", impact = MBeanOperationInfo.ACTION) boolean removeMessage(@Parameter(name = "messageID", desc = "A message ID") long messageID) throws Exception; /** * Removes all the message corresponding to the specified filter. * <br> * Using {@code null} or an empty filter will remove <em>all</em> messages from this queue. * * @return the number of removed messages */ @Operation(desc = "Remove the messages corresponding to the given filter (and returns the number of removed messages)", impact = MBeanOperationInfo.ACTION) int removeMessages(@Parameter(name = "filter", desc = "A message filter (can be empty)") String filter) throws Exception; /** * Removes all the message corresponding to the specified filter. * <br> * Using {@code null} or an empty filter will remove <em>all</em> messages from this queue. * * @return the number of removed messages */ @Operation(desc = "Remove the messages corresponding to the given filter (and returns the number of removed messages)", impact = MBeanOperationInfo.ACTION) int removeMessages(@Parameter(name = "flushLimit", desc = "Limit to flush transactions during the operation to avoid OutOfMemory") int flushLimit, @Parameter(name = "filter", desc = "A message filter (can be empty)") String filter) throws Exception; /** * Expires all the message corresponding to the specified filter. * <br> * Using {@code null} or an empty filter will expire <em>all</em> messages from this queue. * * @return the number of expired messages */ @Operation(desc = "Expire the messages corresponding to the given filter (and returns the number of expired messages)", impact = MBeanOperationInfo.ACTION) int expireMessages(@Parameter(name = "filter", desc = "A message filter") String filter) throws Exception; /** * Expires the message corresponding to the specified message ID. * * @return {@code true} if the message was expired, {@code false} else */ @Operation(desc = "Remove the message corresponding to the given messageID", impact = MBeanOperationInfo.ACTION) boolean expireMessage(@Parameter(name = "messageID", desc = "A message ID") long messageID) throws Exception; /** * Retries the message corresponding to the given messageID to the original queue. * This is appropriate on dead messages on Dead letter queues only. * * @param messageID * @return {@code true} if the message was retried, {@code false} else * @throws Exception */ @Operation(desc = "Retry the message corresponding to the given messageID to the original queue", impact = MBeanOperationInfo.ACTION) boolean retryMessage(@Parameter(name = "messageID", desc = "A message ID") long messageID) throws Exception; /** * Retries all messages on a DLQ to their respective original queues. * This is appropriate on dead messages on Dead letter queues only. * * @return the number of retried messages. * @throws Exception */ @Operation(desc = "Retry all messages on a DLQ to their respective original queues", impact = MBeanOperationInfo.ACTION) int retryMessages() throws Exception; /** * Moves the message corresponding to the specified message ID to the specified other queue. * * @return {@code true} if the message was moved, {@code false} else */ @Operation(desc = "Move the message corresponding to the given messageID to another queue. rejectDuplicate=false on this case", impact = MBeanOperationInfo.ACTION) boolean moveMessage(@Parameter(name = "messageID", desc = "A message ID") long messageID, @Parameter(name = "otherQueueName", desc = "The name of the queue to move the message to") String otherQueueName) throws Exception; /** * Moves the message corresponding to the specified message ID to the specified other queue. * * @return {@code true} if the message was moved, {@code false} else */ @Operation(desc = "Move the message corresponding to the given messageID to another queue", impact = MBeanOperationInfo.ACTION) boolean moveMessage(@Parameter(name = "messageID", desc = "A message ID") long messageID, @Parameter(name = "otherQueueName", desc = "The name of the queue to move the message to") String otherQueueName, @Parameter(name = "rejectDuplicates", desc = "Reject messages identified as duplicate by the duplicate message") boolean rejectDuplicates) throws Exception; /** * Moves all the message corresponding to the specified filter to the specified other queue. * RejectDuplicates = false on this case * <br> * Using {@code null} or an empty filter will move <em>all</em> messages from this queue. * * @return the number of moved messages */ @Operation(desc = "Move the messages corresponding to the given filter (and returns the number of moved messages). RejectDuplicates=false on this case.", impact = MBeanOperationInfo.ACTION) int moveMessages(@Parameter(name = "filter", desc = "A message filter (can be empty)") String filter, @Parameter(name = "otherQueueName", desc = "The name of the queue to move the messages to") String otherQueueName) throws Exception; /** * Moves all the message corresponding to the specified filter to the specified other queue. * <br> * Using {@code null} or an empty filter will move <em>all</em> messages from this queue. * * @return the number of moved messages */ @Operation(desc = "Move the messages corresponding to the given filter (and returns the number of moved messages)", impact = MBeanOperationInfo.ACTION) int moveMessages(@Parameter(name = "filter", desc = "A message filter (can be empty)") String filter, @Parameter(name = "otherQueueName", desc = "The name of the queue to move the messages to") String otherQueueName, @Parameter(name = "rejectDuplicates", desc = "Reject messages identified as duplicate by the duplicate message") boolean rejectDuplicates) throws Exception; @Operation(desc = "Move the messages corresponding to the given filter (and returns the number of moved messages)", impact = MBeanOperationInfo.ACTION) int moveMessages(@Parameter(name = "flushLimit", desc = "Limit to flush transactions during the operation to avoid OutOfMemory") int flushLimit, @Parameter(name = "filter", desc = "A message filter (can be empty)") String filter, @Parameter(name = "otherQueueName", desc = "The name of the queue to move the messages to") String otherQueueName, @Parameter(name = "rejectDuplicates", desc = "Reject messages identified as duplicate by the duplicate message") boolean rejectDuplicates) throws Exception; /** * Sends the message corresponding to the specified message ID to this queue's dead letter address. * * @return {@code true} if the message was sent to the dead letter address, {@code false} else */ @Operation(desc = "Send the message corresponding to the given messageID to this queue's Dead Letter Address", impact = MBeanOperationInfo.ACTION) boolean sendMessageToDeadLetterAddress(@Parameter(name = "messageID", desc = "A message ID") long messageID) throws Exception; /** * Sends all the message corresponding to the specified filter to this queue's dead letter address. * <br> * Using {@code null} or an empty filter will send <em>all</em> messages from this queue. * * @return the number of sent messages */ @Operation(desc = "Send the messages corresponding to the given filter to this queue's Dead Letter Address", impact = MBeanOperationInfo.ACTION) int sendMessagesToDeadLetterAddress(@Parameter(name = "filter", desc = "A message filter (can be empty)") String filterStr) throws Exception; /** * @param headers the message headers and properties to set. Can only * container Strings maped to primitive types. * @param body the text to send * @param durable * @param user * @param password @return * @throws Exception */ @Operation(desc = "Sends a TextMessage to a password-protected destination.", impact = MBeanOperationInfo.ACTION) String sendMessage(@Parameter(name = "headers", desc = "The headers to add to the message") Map<String, String> headers, @Parameter(name = "type", desc = "A type for the message") final int type, @Parameter(name = "body", desc = "The body (byte[]) of the message encoded as a string using Base64") String body, @Parameter(name = "durable", desc = "Whether the message is durable") boolean durable, @Parameter(name = "user", desc = "The user to authenticate with") String user, @Parameter(name = "password", desc = "The users password to authenticate with") String password) throws Exception; /** * Changes the message's priority corresponding to the specified message ID to the specified priority. * * @param newPriority between 0 and 9 inclusive. * @return {@code true} if the message priority was changed */ @Operation(desc = "Change the priority of the message corresponding to the given messageID", impact = MBeanOperationInfo.ACTION) boolean changeMessagePriority(@Parameter(name = "messageID", desc = "A message ID") long messageID, @Parameter(name = "newPriority", desc = "the new priority (between 0 and 9)") int newPriority) throws Exception; /** * Changes the priority for all the message corresponding to the specified filter to the specified priority. * <br> * Using {@code null} or an empty filter will change <em>all</em> messages from this queue. * * @return the number of changed messages */ @Operation(desc = "Change the priority of the messages corresponding to the given filter", impact = MBeanOperationInfo.ACTION) int changeMessagesPriority(@Parameter(name = "filter", desc = "A message filter (can be empty)") String filter, @Parameter(name = "newPriority", desc = "the new priority (between 0 and 9)") int newPriority) throws Exception; /** * Lists the message counter for this queue. */ @Operation(desc = "List the message counters", impact = MBeanOperationInfo.INFO) String listMessageCounter() throws Exception; /** * Resets the message counter for this queue. */ @Operation(desc = "Reset the message counters", impact = MBeanOperationInfo.INFO) void resetMessageCounter() throws Exception; /** * Lists the message counter for this queue as a HTML table. */ @Operation(desc = "List the message counters as HTML", impact = MBeanOperationInfo.INFO) String listMessageCounterAsHTML() throws Exception; /** * Lists the message counter history for this queue. */ @Operation(desc = "List the message counters history", impact = MBeanOperationInfo.INFO) String listMessageCounterHistory() throws Exception; /** * Lists the message counter history for this queue as a HTML table. */ @Operation(desc = "List the message counters history HTML", impact = MBeanOperationInfo.INFO) String listMessageCounterHistoryAsHTML() throws Exception; /** * Pauses the queue. Messages are no longer delivered to its consumers. */ @Operation(desc = "Pauses the Queue", impact = MBeanOperationInfo.ACTION) void pause() throws Exception; /** * Pauses the queue. Messages are no longer delivered to its consumers. */ @Operation(desc = "Pauses the Queue", impact = MBeanOperationInfo.ACTION) void pause(@Parameter(name = "persist", desc = "if true, the pause state will be persisted.") boolean persist) throws Exception; /** * Resumes the queue. Messages are again delivered to its consumers. */ @Operation(desc = "Resumes delivery of queued messages and gets the queue out of paused state. It will also affected the state of a persisted pause.", impact = MBeanOperationInfo.ACTION) void resume() throws Exception; @Operation(desc = "List all the existent consumers on the Queue") String listConsumersAsJSON() throws Exception; /** * Returns whether the queue is paused. */ @Attribute(desc = "whether the queue is paused") boolean isPaused() throws Exception; @Operation(desc = "Browse Messages", impact = MBeanOperationInfo.ACTION) CompositeData[] browse() throws Exception; /** * Resets the MessagesAdded property */ @Operation(desc = "Browse Messages", impact = MBeanOperationInfo.ACTION) CompositeData[] browse(@Parameter(name = "filter", desc = "A message filter (can be empty)") String filter) throws Exception; /** * Resets the MessagesAdded property */ @Operation(desc = "Resets the MessagesAdded property", impact = MBeanOperationInfo.ACTION) void resetMessagesAdded() throws Exception; /** * Resets the MessagesAdded property */ @Operation(desc = "Resets the MessagesAcknowledged property", impact = MBeanOperationInfo.ACTION) void resetMessagesAcknowledged() throws Exception; /** * Resets the MessagesExpired property */ @Operation(desc = "Resets the MessagesExpired property", impact = MBeanOperationInfo.ACTION) void resetMessagesExpired() throws Exception; /** * Resets the MessagesExpired property */ @Operation(desc = "Resets the MessagesKilled property", impact = MBeanOperationInfo.ACTION) void resetMessagesKilled() throws Exception; /** * it will flush one cycle on internal executors, so you would be sure that any pending tasks are done before you call * any other measure. * It is useful if you need the exact number of counts on a message */ void flushExecutor(); }