Skip to content

Instantly share code, notes, and snippets.

@davydmaker
Created April 22, 2026 02:30
Show Gist options
  • Select an option

  • Save davydmaker/bc57be7b313acb7b8de2fe3e82737a70 to your computer and use it in GitHub Desktop.

Select an option

Save davydmaker/bc57be7b313acb7b8de2fe3e82737a70 to your computer and use it in GitHub Desktop.
active-mq-artemis-utils: browser console scripts for Apache ActiveMQ Artemis 7 queue maintenance

active-mq-artemis-utils

Browser console scripts to streamline routine operational tasks on Apache ActiveMQ Artemis 7 (AMQ7) through the Broker Console web UI.

Scripts

  • clear-queue-artemis-amq7.js — clears and resets one or more queues (flushes executor, removes all messages, resets counters, clears duplicate ID cache, and resumes).
  • find-messages-limbo-artemis-amq7.js — identifies queues that have pending messages but zero consumers (messages stuck "in limbo").

Requirements

  • Apache ActiveMQ Artemis 7.
  • Active session logged into the Artemis Broker Console (the scripts read the current URL to derive the broker identifier).
  • Account permissions to execute the underlying operations (e.g., removeAllMessages, flushExecutor).

Usage

  1. Open the Artemis Broker Console and log in.
  2. Open your browser's developer console (usually F12).
  3. Copy the content of the desired script.
  4. Paste into the console and press Enter.
  5. When prompted, enter a comma-separated list of queue addresses.

Notes

  • Scripts are best-effort utilities intended for operational use. Read them before running against production environments.
  • Originally built for team use while working with Artemis queues day-to-day; published as standalone community utilities.

License

MIT.

/**
* @author Davyd Maker
* @version 1.0
* @description Script to clear and reset queues in the Artemis AMQ7 Broker Console.
* @date 2021-08-25
*/
if (window.location.href.indexOf("auth/login") > -1) throw 'You must be logged in to execute these operations.';
const operationsQueue = ['enable', 'flushExecutor', 'removeAllMessages',
'resetAllGroups', 'resetMessageCounter', 'resetMessagesAcknowledged',
'resetMessagesAdded', 'resetMessagesExpired', 'resetMessagesKilled'];
const operationsAddress = ['clearDuplicateIdCache', 'resume'];
const queuesInput = prompt("Enter the full queue address(es), comma-separated:");
const queues = queuesInput.replaceAll(/\s/g, '').split(",");
const user = window.location.href.split("root-org.apache.activemq.artemis-")[1].split("-").splice(0, 3).join("-");
const urlAddress = `/console/jolokia/exec/org.apache.activemq.artemis:broker=!%22${user}!%22,component=addresses,address=!%22{queue}!%22/{operation}()`;
const urlQueue = `/console/jolokia/exec/org.apache.activemq.artemis:broker=!%22${user}!%22,component=addresses,address=!%22{queue}!%22,subcomponent=queues,routing-type=!%22anycast!%22,queue=!%22{queue}!%22/{operation}()`;
queues.forEach(async (queue) => {
for (const operation of operationsQueue) {
let url = urlQueue.replace("{operation}", operation).replaceAll("{queue}", queue);
try {
const response = await fetch(url);
const data = await response.json();
console.log(`Queue: ${queue} - ${operation}() - ${data.status}`);
} catch (error) {
console.error(`Error executing operation on queue ${queue}: ${error}`);
}
}
for (const operation of operationsAddress) {
let url = urlAddress.replace("{operation}", operation).replaceAll("{queue}", queue);
try {
const response = await fetch(url);
const data = await response.json();
console.log(`Address: ${queue} - ${operation}() - ${data.status}`);
} catch (error) {
console.error(`Error executing operation on address ${queue}: ${error}`);
}
}
});
/**
* @author Davyd Maker
* @version 1.0
* @description Script to identify queues with messages in limbo (pending messages without active consumers) in the Artemis AMQ7 Broker Console.
* @date 2021-08-25
*/
if (window.location.href.indexOf("auth/login") > -1) throw 'You must be logged in to execute these operations.';
let queues = [];
if (queues.length === 0) {
const input = prompt("Enter the full queue address(es), comma-separated:");
queues = input.replaceAll(/\s/g, '').split(",");
}
const user = window.location.href.split("root-org.apache.activemq.artemis-")[1].split("-").splice(0, 3).join("-");
const url = `/console/jolokia/exec/org.apache.activemq.artemis:broker=!%22${user}!%22,component=addresses,address=!%22{queue}!%22,subcomponent=queues,routing-type=!%22anycast!%22,queue=!%22{queue}!%22/{operation}()`;
queues.forEach(async (queue) => {
try {
const urlCountMessages = url.replaceAll("{queue}", queue).replaceAll("{operation}", "countMessages");
const responseCountMessages = await fetch(urlCountMessages);
const dataCountMessages = await responseCountMessages.json();
if (responseCountMessages.status !== 200) {
console.error(`Queue: ${queue} - Failed to fetch message count.`);
return;
}
const messagesCount = dataCountMessages.value;
if (messagesCount > 0) {
const urlCountConsumers = url.replaceAll("{queue}", queue).replaceAll("{operation}", "listConsumersAsJSON");
const responseCountConsumers = await fetch(urlCountConsumers);
const dataCountConsumers = await responseCountConsumers.json();
if (responseCountConsumers.status !== 200) {
console.error(`Queue: ${queue} - Messages: ${messagesCount} - Failed to fetch consumer count.`);
return;
}
const consumersCount = JSON.parse(dataCountConsumers.value).length;
if (consumersCount <= 0) {
console.warn(`Queue: ${queue} - Messages: ${messagesCount} - Messages are in limbo (no active consumers).`);
} else {
console.log(`Queue: ${queue} - Messages: ${messagesCount} - Consumers: ${consumersCount}`);
}
} else {
console.log(`Queue: ${queue} - No messages.`);
}
} catch (error) {
console.error(`Error processing queue ${queue}: ${error}`);
}
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment