<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>ActiveMQ Operations Guides on Netdata</title><link>https://www.netdata.cloud/guides/activemq/</link><description>Recent content in ActiveMQ Operations Guides on Netdata</description><generator>Hugo</generator><language>en-us</language><atom:link href="https://www.netdata.cloud/guides/activemq/index.xml" rel="self" type="application/rss+xml"/><item><title>ActiveMQ advisory topics: hidden destinations consuming resources</title><link>https://www.netdata.cloud/guides/activemq/activemq-advisory-topics-overhead/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/activemq/activemq-advisory-topics-overhead/</guid><description>&lt;p>List every topic on a busy ActiveMQ Classic broker and count how many start with &lt;code>ActiveMQ.Advisory.&lt;/code>. On a broker with a thousand queues, you can easily find a thousand or more advisory topics, each a real destination with its own JMX MBeans, each receiving non-persistent messages for broker events.&lt;/p>
&lt;p>This is not a bug. Advisory topics are how the broker publishes internal events: connections opening and closing, consumers and producers starting and stopping, destinations hitting their memory limit, messages expiring. Tools and clients can subscribe to observe the broker. The problem is that the default behavior scales with destination count, not with how much of this information anyone consumes, and the cost is paid in MBean count, heap, GC pressure, and inflated throughput counters.&lt;/p></description></item><item><title>ActiveMQ authentication failures: credential rotation fallout and brute force</title><link>https://www.netdata.cloud/guides/activemq/activemq-authentication-failures/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/activemq/activemq-authentication-failures/</guid><description>&lt;p>Your broker log starts filling with &lt;code>SecurityException: User name [X] or password is invalid&lt;/code> or &lt;code>Authentication failed for user&lt;/code>. Sometimes it is a slow drip from a single client. Sometimes it is a flood from dozens of source IPs. Both look similar in the log, but they are very different incidents: one is usually a forgotten service after a credential rotation, the other is either a production outage (real consumers and producers dropped) or an active attack.&lt;/p></description></item><item><title>ActiveMQ authorization denied: authenticated users hitting Not authorized</title><link>https://www.netdata.cloud/guides/activemq/activemq-authorization-denied/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/activemq/activemq-authorization-denied/</guid><description>&lt;p>Your ActiveMQ broker log is filling with lines like &lt;code>User orders-svc is not authorized to write to: queue://PAYMENTS.INBOUND&lt;/code> or &lt;code>Not authorized to create: topic://ActiveMQ.Advisory.Connection&lt;/code>. The client connected fine. Authentication passed. But every send, consume, or destination creation attempt is rejected.&lt;/p>
&lt;p>This is an authorization failure, not an authentication failure. The user proved who they are; the broker is saying they cannot do the specific thing they attempted. That distinction drives the whole diagnosis: you are not chasing bad passwords, you are chasing a mismatch between the user the client authenticated as, the operation it attempted, and the authorization entries the broker loaded.&lt;/p></description></item><item><title>ActiveMQ broker down: telling a crashed broker from a hung one</title><link>https://www.netdata.cloud/guides/activemq/activemq-broker-down/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/activemq/activemq-broker-down/</guid><description>&lt;p>Your pager says the ActiveMQ broker is down. The first question is not &amp;ldquo;how do I restart it&amp;rdquo; but &amp;ldquo;what kind of down is this.&amp;rdquo; A crashed broker (process gone, port closed) and a hung broker (process alive, port possibly open, nothing moving) have different causes, different evidence, and different safe responses. Restarting a hung broker without capturing diagnostics destroys the evidence. Assuming a crashed broker will come straight back up ignores the KahaDB recovery window, where the process runs and the port may even bind, but no client gets served for minutes to hours.&lt;/p></description></item><item><title>ActiveMQ broker won't start: port conflicts, store recovery, and lock contention</title><link>https://www.netdata.cloud/guides/activemq/activemq-broker-wont-start/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/activemq/activemq-broker-wont-start/</guid><description>&lt;p>The broker process is running, or maybe it is not, and clients cannot connect. You restart the service, and it still does not come up. Or worse: the process starts, the log goes quiet, and ten minutes later you are still staring at a broker that has not opened its transport connectors.&lt;/p>
&lt;p>&amp;ldquo;Won&amp;rsquo;t start&amp;rdquo; in ActiveMQ Classic covers four distinct failure modes that look identical from the outside: something else is holding port 61616 or 8161, KahaDB is replaying a large journal and simply is not done yet, the store is corrupted after an unclean shutdown and the broker is refusing to start, or a store lock in a shared-storage HA pair is held by the wrong broker and this one is waiting forever. Each has a different fix, and applying the wrong one (especially deleting store files or force-clearing locks) can turn a slow start into permanent message loss.&lt;/p></description></item><item><title>ActiveMQ connection and session leak: clients that never close</title><link>https://www.netdata.cloud/guides/activemq/activemq-connection-leak/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/activemq/activemq-connection-leak/</guid><description>&lt;p>The broker&amp;rsquo;s connection count used to sit around 400. Last month it was 600. This week it is 1,100, and nobody deployed anything new. The JVM thread count and open file descriptor count are climbing in lockstep. Eventually, usually at the worst time, the broker hits its FD limit and starts rejecting every new connection, including the healthy clients.&lt;/p>
&lt;p>This is the classic ActiveMQ connection and session leak: clients that open JMS Connections (or Sessions) and never close them. Each leaked connection holds a socket, a file descriptor, one or more transport threads on the default TCP transport, and broker-side state. One JMS Connection can hold many Sessions, and each Session can hold many consumers and producers, so the leak compounds at each layer.&lt;/p></description></item><item><title>ActiveMQ consumers connected but not acknowledging: the zombie consumer</title><link>https://www.netdata.cloud/guides/activemq/activemq-consumer-not-acking/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/activemq/activemq-consumer-not-acking/</guid><description>&lt;p>The queue has consumers. &lt;code>ConsumerCount&lt;/code> is exactly where it should be. But dequeue rate has collapsed to near zero, &lt;code>InFlightCount&lt;/code> is pinned at the prefetch limit, and the backlog keeps growing. From the broker&amp;rsquo;s perspective everything is subscribed; from the business&amp;rsquo;s perspective nothing is being processed.&lt;/p>
&lt;p>This is the zombie consumer: a consumer that holds a live connection and a full prefetch buffer but never acknowledges. ActiveMQ dispatched the prefetch window of messages to it, and the broker will not send that consumer more until acks come back. If it is the only consumer, the queue stalls while looking fully staffed.&lt;/p></description></item><item><title>ActiveMQ CVE-2023-46604: the OpenWire deserialization RCE and how to detect exposure</title><link>https://www.netdata.cloud/guides/activemq/activemq-cve-2023-46604-openwire-rce/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/activemq/activemq-cve-2023-46604-openwire-rce/</guid><description>&lt;p>CVE-2023-46604 is a CVSS 10.0 unauthenticated remote code execution vulnerability in the ActiveMQ Classic OpenWire protocol marshaller. If an attacker can open a TCP connection to your OpenWire transport connector (default port 61616), they can send a crafted packet that causes the broker to instantiate an arbitrary class on the classpath. No credentials are required. It was exploited in the wild before and immediately after disclosure in October 2023, and unpatched, internet-reachable brokers are still being found.&lt;/p></description></item><item><title>ActiveMQ default credentials and exposed web console: admin/admin on port 8161</title><link>https://www.netdata.cloud/guides/activemq/activemq-default-credentials-exposure/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/activemq/activemq-default-credentials-exposure/</guid><description>&lt;p>ActiveMQ Classic ships with a web console on port 8161 and well-known default credentials: admin/admin. Combined with a management interface reachable from the network, that equals full broker control for anyone who finds the port: browse and purge queues, move messages, read message bodies, create destinations, and in some versions reach the Jolokia JMX REST API for much worse.&lt;/p>
&lt;p>Newer releases have improved the defaults. Since 5.16.x and 5.18.x, the embedded Jetty console binds to 127.0.0.1 and the remote JMX connector is disabled (&lt;code>createConnector=&amp;quot;false&amp;quot;&lt;/code>) out of the box. These defaults are routinely undone: operators reconfigure the bind address for remote management, container images override it, and older brokers never had the protection. A large share of production brokers still expose 8161 with credentials that are in every scanner&amp;rsquo;s wordlist.&lt;/p></description></item><item><title>ActiveMQ deserialization errors: ClassNotFoundException and the serializable packages whitelist</title><link>https://www.netdata.cloud/guides/activemq/activemq-deserialization-errors/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/activemq/activemq-deserialization-errors/</guid><description>&lt;p>&lt;code>ClassNotFoundException&lt;/code>, &lt;code>InvalidClassException&lt;/code>, or &lt;code>StreamCorruptedException&lt;/code> in the ActiveMQ broker log means messages are failing to process. Sometimes this is mundane: a producer and consumer compiled against different versions of a class, or an ObjectMessage payload class that is not on the broker&amp;rsquo;s classpath. Sometimes it is the signature of a Java deserialization exploit attempt, and the correct response is a security incident, not a config tweak.&lt;/p>
&lt;p>The two situations look similar in the log. The difference is in which class names appear, how often, and from where. This guide is about making that call quickly, fixing the benign cases correctly, and locking down the whitelist so the dangerous cases fail closed.&lt;/p></description></item><item><title>ActiveMQ destination explosion: dynamic destinations, MBean bloat, and GC pressure</title><link>https://www.netdata.cloud/guides/activemq/activemq-destination-explosion/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/activemq/activemq-destination-explosion/</guid><description>&lt;p>An ActiveMQ Classic broker that has been running for months shows a specific signature: heap usage climbs steadily even when message volume is flat, GC pauses get longer and more frequent, the web console and JMX queries feel sluggish, and eventually the broker OOMs or slides into a GC death spiral. Queue depths look normal. Enqueue and dequeue rates look normal. Nothing about the messaging workload explains it.&lt;/p>
&lt;p>The explanation is usually the destination registry. ActiveMQ Classic creates a destination automatically the first time a client produces to or consumes from a name that does not exist. If an application generates destination names dynamically (per request ID, per user, per session, per tenant) and nothing removes them, the registry grows without bound. Every destination registers at least four JMX MBeans and holds in-memory structures in the broker&amp;rsquo;s heap. At thousands of destinations, JMX itself becomes slow. At tens of thousands, the accumulated metadata is a first-order heap consumer, and the broker degrades or dies.&lt;/p></description></item><item><title>ActiveMQ disk full on the KahaDB partition: write failures and store corruption risk</title><link>https://www.netdata.cloud/guides/activemq/activemq-disk-full-kahadb/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/activemq/activemq-disk-full-kahadb/</guid><description>&lt;p>The KahaDB partition is at 100%. The broker log shows journal write failures, persistent producers have stopped, and you are in the worst ActiveMQ failure mode: the one where freeing space may not be enough, because an in-flight write at the moment the disk filled can leave the journal or index corrupt.&lt;/p>
&lt;p>This is not the same incident as &lt;code>StorePercentUsage&lt;/code> hitting 100%. &lt;code>StorePercentUsage&lt;/code> measures KahaDB against the configured &lt;code>storeUsage&lt;/code> limit in &lt;code>activemq.xml&lt;/code>. Disk full measures the partition against physical capacity with &lt;code>df&lt;/code>. They are independent limits, and either can fire first. If &lt;code>storeUsage&lt;/code> is larger than the partition, the OS runs out of space while the broker still thinks it has headroom, and the failure arrives with no warning from any ActiveMQ metric. This guide covers the OS-level case; for the configured-limit case, see &lt;a href="https://www.netdata.cloud/guides/activemq/activemq-store-is-full/">ActiveMQ store is full&lt;/a>.&lt;/p></description></item><item><title>ActiveMQ DLQ never expires: setting TTL so the dead-letter queue stops leaking storage</title><link>https://www.netdata.cloud/guides/activemq/activemq-dlq-no-expiration/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/activemq/activemq-dlq-no-expiration/</guid><description>&lt;p>Your &lt;code>ActiveMQ.DLQ&lt;/code> has been sitting at some non-zero depth for months. Nobody looks at it because &amp;ldquo;it&amp;rsquo;s just the DLQ.&amp;rdquo; Meanwhile &lt;code>StorePercentUsage&lt;/code> creeps up a fraction of a percent a day, the &lt;code>db-*.log&lt;/code> journal files keep accumulating, and one morning the broker hits 100% store usage and blocks every persistent producer on the bus.&lt;/p>
&lt;p>This is the default behavior of ActiveMQ Classic, not a bug. Messages sent to the dead-letter queue have no TTL. They accumulate forever, and every one of them is a live reference that pins KahaDB journal files against garbage collection. The fix has two parts: configure expiration on the DLQ so the leak stops, and drain-and-investigate the existing backlog instead of just deleting it. Every DLQ message is a failed business transaction; purging blind throws away the evidence.&lt;/p></description></item><item><title>ActiveMQ enqueue outpacing dequeue: reading the rate imbalance before the backlog</title><link>https://www.netdata.cloud/guides/activemq/activemq-enqueue-dequeue-imbalance/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/activemq/activemq-enqueue-dequeue-imbalance/</guid><description>&lt;p>On a healthy ActiveMQ Classic broker, enqueue rate and dequeue rate track each other within normal burst variability. When enqueue outpaces dequeue for more than a few minutes, the broker is accumulating a backlog whether or not QueueSize has moved enough to alarm yet. The rate delta is the leading indicator; QueueSize, MemoryPercentUsage, and StorePercentUsage are the lagging confirmations. If you wait for the backlog gauges to fire, you have already lost your runway.&lt;/p></description></item><item><title>ActiveMQ expired message count climbing: TTL expiry and silent correctness loss</title><link>https://www.netdata.cloud/guides/activemq/activemq-expired-messages/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/activemq/activemq-expired-messages/</guid><description>&lt;p>A queue looks fine. QueueSize is stable, dequeue rate is non-zero, no alerts on memory or store. Then someone asks why a customer order never processed, and you find &lt;code>ExpiredCount&lt;/code> on the destination has been climbing for days. Every tick of that counter is a message the broker threw away or shuffled into the DLQ because its TTL ran out before a consumer got to it. Nothing crashed. Nothing paged. The data is just gone.&lt;/p></description></item><item><title>ActiveMQ GC pause death spiral: long pauses, heartbeat timeouts, and reconnect storms</title><link>https://www.netdata.cloud/guides/activemq/activemq-gc-pause-death-spiral/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/activemq/activemq-gc-pause-death-spiral/</guid><description>&lt;p>The broker is up. The port is listening. But clients keep dropping, reconnecting, dropping again, and every cycle makes things worse. Connection count charts show a sawtooth: a sudden drop, a spike, another drop. In the JVM, heap usage sits above 90% after every major GC and full GC pauses are climbing into the multi-second range.&lt;/p>
&lt;p>This is the GC pause death spiral, a positive-feedback loop and one of the characteristic failure archetypes of ActiveMQ Classic. Heap pressure produces long GC pauses. A long pause freezes every broker thread, including the ones answering client keepalives. Clients exceed &lt;code>wireFormat.maxInactivityDuration&lt;/code> (default 30000 ms) and disconnect. After the pause ends, every client reconnects at once, and each reconnect allocates new connection, session, consumer, and subscription objects. That allocation spike raises heap pressure further, the next GC pause is longer, and more clients time out. The broker oscillates between being frozen in GC and being hammered by reconnect storms until it is effectively down.&lt;/p></description></item><item><title>ActiveMQ HA failover stuck: standby cannot acquire the store lock</title><link>https://www.netdata.cloud/guides/activemq/activemq-ha-failover-stuck/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/activemq/activemq-ha-failover-stuck/</guid><description>&lt;p>The active broker died. The standby broker&amp;rsquo;s process is running, the JVM looks healthy, and yet no client can connect anywhere. &lt;code>ss&lt;/code> shows nothing listening on 61616 on either node. The failover you designed for is not happening.&lt;/p>
&lt;p>This is the shared-storage master/slave stall: the standby is blocked waiting to acquire the lock file in the KahaDB directory, and until it gets that lock it will not start its transport connectors. That behavior is by design. What is not by design is the lock never becoming available. The usual suspects are a stale lock file left behind by a crashed active, an unhealthy NFS lock daemon, or a SAN mount that is unavailable on the standby.&lt;/p></description></item><item><title>ActiveMQ InactivityIOException: Channel was inactive for too long</title><link>https://www.netdata.cloud/guides/activemq/activemq-channel-inactive-too-long/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/activemq/activemq-channel-inactive-too-long/</guid><description>&lt;p>Your producers or consumers are dropping JMS connections with this in the stack trace:&lt;/p>
&lt;pre tabindex="0">&lt;code>org.apache.activemq.transport.InactivityIOException: Channel was inactive for too long
&lt;/code>&lt;/pre>&lt;p>Sometimes it is one client. Sometimes every client on the broker disconnects within the same second and reconnects in a burst. The exception points at the connection, but the connection is almost never the root cause. Something on one side of the wire stopped producing traffic for longer than the OpenWire inactivity timeout, and the other side declared it dead.&lt;/p></description></item><item><title>ActiveMQ InFlightCount high: prefetch full, acks stalled, and zombie consumers</title><link>https://www.netdata.cloud/guides/activemq/activemq-inflight-count-high/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/activemq/activemq-inflight-count-high/</guid><description>&lt;p>A queue shows QueueSize near zero, consumers are connected, and nothing is being processed. Dequeue rate is flat, message age is rising upstream, and the only number that looks wrong is InFlightCount, sitting at a suspiciously round value. This is the zombie consumer pattern: the broker dispatched messages into consumer prefetch buffers, and those messages are never coming back as acknowledgments.&lt;/p>
&lt;p>Operators misread this state constantly. They watch QueueSize, see an &amp;ldquo;empty&amp;rdquo; queue, and conclude the broker is fine while hundreds or thousands of messages sit in consumer limbo: charged against memory, invisible to other consumers, and pinning journal files. This article covers how to read InFlightCount correctly, how to tell a genuinely stuck consumer from one that is high by design, and how to fix it without guessing.&lt;/p></description></item><item><title>ActiveMQ JVM heap exhaustion: OutOfMemoryError and the OOM kill</title><link>https://www.netdata.cloud/guides/activemq/activemq-jvm-heap-exhaustion/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/activemq/activemq-jvm-heap-exhaustion/</guid><description>&lt;p>The broker was fine an hour ago. Now the process is gone, or it is alive but frozen: clients disconnected, the web console hangs, and the log shows &lt;code>java.lang.OutOfMemoryError&lt;/code> or, if it runs in a container, nothing at all because the kernel killed the JVM with SIGKILL (exit code 137, i.e. 128+9).&lt;/p>
&lt;p>This is ActiveMQ JVM heap exhaustion. It is distinct from the broker&amp;rsquo;s internal &lt;code>memoryUsage&lt;/code> hitting 100%. That limit triggers producer flow control and blocks &lt;code>send()&lt;/code> calls; this one kills or freezes the JVM itself. The confusing part is that the two are independent counters. You can have &lt;code>MemoryPercentUsage&lt;/code> at 50% with plenty of headroom while JVM heap is at 97% and the next full GC never finishes. Non-message allocations (destination metadata, MBeans, connection and session state, cursor overhead, transport buffers) live on the heap too, and ActiveMQ&amp;rsquo;s flow control accounting does not protect them.&lt;/p></description></item><item><title>ActiveMQ JVM thread count climbing: transport threads, NIO, and thread leaks</title><link>https://www.netdata.cloud/guides/activemq/activemq-thread-count-growing/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/activemq/activemq-thread-count-growing/</guid><description>&lt;p>The broker&amp;rsquo;s JVM thread count has been climbing for hours or days. Nothing has broken yet, but the trend only goes one direction, and it ends with context-switch overhead, native memory pressure from thread stacks, and eventually a broker that cannot accept new connections or gets OOM-killed despite a healthy heap.&lt;/p>
&lt;p>A rising thread count on ActiveMQ Classic is not one problem. With the default blocking TCP transport, thread count is a proxy for connection count, so growth usually means connections are growing. When thread count climbs without connection growth, you have an actual thread leak, and the diagnostic path is completely different. Telling the two apart takes about two minutes with JMX.&lt;/p></description></item><item><title>ActiveMQ KahaDB corruption: the broker won't start after an unclean shutdown</title><link>https://www.netdata.cloud/guides/activemq/activemq-kahadb-corruption/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/activemq/activemq-kahadb-corruption/</guid><description>&lt;p>The broker was killed (kill -9, power loss, OOM killer, container limit hit) and now it will not come back. Either the process exits during startup, or it sits there with the log stuck partway through KahaDB recovery and port 61616 never accepts a client. The log mentions &lt;code>db.data&lt;/code>, a &lt;code>db-*.log&lt;/code> journal file, or an &lt;code>IOException&lt;/code> about a missing data file.&lt;/p>
&lt;p>This failure became rarer after 5.14, but it still happens, and it carries the highest stakes of the classic ActiveMQ failures: every recovery path trades downtime against message loss. The wrong move at 3 a.m. is deleting the store to get the port back, then discovering you wiped the backlog you were supposed to preserve.&lt;/p></description></item><item><title>ActiveMQ KahaDB db.data index bloat: slow lookups and slow startup recovery</title><link>https://www.netdata.cloud/guides/activemq/activemq-kahadb-index-large/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/activemq/activemq-kahadb-index-large/</guid><description>&lt;p>You restart the broker after an unclean shutdown and it sits there for 20, 30, 40 minutes before it accepts a single client connection. Or the broker is running, but persistent message dispatch feels sluggish and disk reads on the KahaDB partition are elevated for no obvious reason. You look at the KahaDB directory and the journal files are not the problem. The problem is &lt;code>db.data&lt;/code>, the B-tree index, sitting at multiple gigabytes.&lt;/p></description></item><item><title>ActiveMQ KahaDB journal files not deleted: one unacked message pinning a 32MB log</title><link>https://www.netdata.cloud/guides/activemq/activemq-kahadb-journal-files-growing/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/activemq/activemq-kahadb-journal-files-growing/</guid><description>&lt;p>Your application queues are empty or nearly empty. Consumers are connected and processing. Yet the KahaDB directory keeps growing, &lt;code>db-*.log&lt;/code> files pile up, &lt;code>StorePercentUsage&lt;/code> creeps upward, and disk free space trends toward zero. This is the classic KahaDB journal pinning problem, and it confuses operators precisely because the visible queue state looks healthy.&lt;/p>
&lt;p>The mechanism is simple and unforgiving: a KahaDB journal file (default 32MB) is only reclaimable when &lt;strong>every&lt;/strong> message stored in that file has been acknowledged. One unacknowledged message anywhere in the file pins the entire file on disk. If that one message is sitting in the DLQ, held by an offline durable subscriber, or stuck in a dead consumer&amp;rsquo;s prefetch buffer, the file stays, and new files keep being written behind it.&lt;/p></description></item><item><title>ActiveMQ KahaDB journal write latency: fsync as the persistent-throughput ceiling</title><link>https://www.netdata.cloud/guides/activemq/activemq-store-write-latency/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/activemq/activemq-store-write-latency/</guid><description>&lt;p>A producer is sending persistent messages to ActiveMQ Classic and throughput is far below what the network, CPU, and broker configuration suggest should be possible. Sends are not failing. There are no exceptions. Each &lt;code>send()&lt;/code> just takes a few milliseconds, or tens of milliseconds, and the aggregate rate caps out no matter how many producers you add.&lt;/p>
&lt;p>This is almost always the KahaDB journal fsync. For persistent messages, ActiveMQ Classic writes the message to the KahaDB write-ahead journal and acknowledges the producer only after the fsync completes. That fsync is the critical path for every persistent send, and its latency sets a hard ceiling on persistent throughput. When the underlying storage gets slow, persistent messaging gets slower in direct proportion to the fsync latency.&lt;/p></description></item><item><title>ActiveMQ memory limit reached: MemoryPercentUsage at 100% and the flow-control cliff</title><link>https://www.netdata.cloud/guides/activemq/activemq-memory-limit-reached/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/activemq/activemq-memory-limit-reached/</guid><description>&lt;p>Your producers have stopped sending. No exceptions, no timeouts, no errors on the producer side. The &lt;code>send()&lt;/code> calls just hang, and upstream services pile up threads waiting on the broker. In the broker log you find the line operators search for at 3 a.m.:&lt;/p>
&lt;pre tabindex="0">&lt;code>Usage Manager Memory Usage ... reached memory limit
&lt;/code>&lt;/pre>&lt;p>&lt;code>MemoryPercentUsage&lt;/code> on the Broker MBean is at 100%. This is ActiveMQ Classic&amp;rsquo;s own memory accounting, not JVM heap, and 100% is not a slowdown. It is a cliff edge. At 99% everything works. At 100% every producer is flow-controlled: the broker stops reading from producer sockets, TCP backpressure builds, and sends block silently until memory frees up.&lt;/p></description></item><item><title>ActiveMQ MemoryPercentUsage climbing: reading the flow-control leading indicator</title><link>https://www.netdata.cloud/guides/activemq/activemq-memory-percent-usage-high/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/activemq/activemq-memory-percent-usage-high/</guid><description>&lt;p>Your ActiveMQ broker&amp;rsquo;s &lt;code>MemoryPercentUsage&lt;/code> gauge is at 65% and climbing. Nothing is broken yet. Producers are sending, consumers are consuming, queue depths look tolerable. But the trend line only goes one direction, and you know what happens at 100%: producer flow control activates, every producer&amp;rsquo;s &lt;code>send()&lt;/code> call blocks silently, and upstream services start hanging with no error message anywhere.&lt;/p>
&lt;p>This is the right moment to act, and the gauge gives you more information than most operators extract from it. The absolute value tells you where you are. The rate of climb tells you how much time you have. The surrounding signals tell you why. This article is about reading all three before the cliff edge.&lt;/p></description></item><item><title>ActiveMQ memoryUsage vs JVM heap: the two memory budgets teams confuse</title><link>https://www.netdata.cloud/guides/activemq/activemq-systemusage-memory-vs-heap/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/activemq/activemq-systemusage-memory-vs-heap/</guid><description>&lt;p>An ActiveMQ Classic broker can hit 100% &lt;code>MemoryPercentUsage&lt;/code> and silently block every producer while the JVM heap sits at 40%. The same broker, on a different day, can die from &lt;code>OutOfMemoryError&lt;/code> while &lt;code>MemoryPercentUsage&lt;/code> shows 50% and every queue-depth dashboard looks calm. Both incidents look contradictory until you understand that ActiveMQ tracks two separate memory budgets, and only one of them is the JVM&amp;rsquo;s.&lt;/p>
&lt;p>Teams monitor one budget, assume it represents the other, and get surprised by whichever one they ignored. This article covers what each budget counts, how they drift apart, how to size them relative to each other, and which signals detect the drift.&lt;/p></description></item><item><title>ActiveMQ monitoring checklist: the signals every production broker needs</title><link>https://www.netdata.cloud/guides/activemq/activemq-monitoring-checklist/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/activemq/activemq-monitoring-checklist/</guid><description>&lt;p>Most ActiveMQ monitoring setups fail in one of two ways. Either they only watch process liveness and queue depth, and discover producer flow control from angry users. Or they export every JMX attribute into a dashboard nobody reads, and the one signal that mattered is buried on page four.&lt;/p>
&lt;p>This checklist organizes the signals that matter into four maturity levels, from &amp;ldquo;is the broker alive&amp;rdquo; to &amp;ldquo;can you prove end-to-end message flow works.&amp;rdquo; Each level lists the signal, where it comes from, and the threshold that makes it actionable. Scope is ActiveMQ Classic (5.x and 6.x Classic stream). Artemis has a different store, memory model, and MBean tree; do not apply these thresholds to it.&lt;/p></description></item><item><title>ActiveMQ monitoring maturity model: from survival to expert</title><link>https://www.netdata.cloud/guides/activemq/activemq-monitoring-maturity-model/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/activemq/activemq-monitoring-maturity-model/</guid><description>&lt;p>Most ActiveMQ outages are not caused by exotic failure modes. They are caused by signals nobody was watching: a DLQ that grew for three weeks, a memory limit that hit 100% and silently blocked every producer, an offline durable subscription that pinned journal files until the disk filled. The signals were available the whole time. The team had not instrumented them yet.&lt;/p>
&lt;p>This article lays out a four-level maturity model for monitoring ActiveMQ Classic 5.x. It is a map of which signals to add, in which order, so that each level closes the blind spots the previous level leaves open. Use it to audit your current coverage and to prioritize instrumentation work after your next incident review.&lt;/p></description></item><item><title>ActiveMQ network bridge connected but not forwarding: broken demand forwarding</title><link>https://www.netdata.cloud/guides/activemq/activemq-network-bridge-not-forwarding/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/activemq/activemq-network-bridge-not-forwarding/</guid><description>&lt;p>The bridge is up. JMX shows the network bridge MBeans, the broker log shows a successful connection to the remote broker, and yet messages produced on broker A sit in the queue while consumers on broker B wait idle. No errors on either side. Each broker&amp;rsquo;s local dashboard looks healthy.&lt;/p>
&lt;p>This is broken demand forwarding in an ActiveMQ Classic Network of Brokers. A network bridge is not a pipe. It forwards messages only when it knows a consumer exists on the remote side, and it learns that through advisory messages. When the bridge is connected but the demand signal is not flowing, you get a silent stall: backlog on one broker, starvation on the other, nothing alarming on a per-broker view.&lt;/p></description></item><item><title>ActiveMQ network bridge down: a Network of Brokers partition and store-and-forward backlog</title><link>https://www.netdata.cloud/guides/activemq/activemq-network-bridge-down/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/activemq/activemq-network-bridge-down/</guid><description>&lt;p>In a Network of Brokers, messages cross between ActiveMQ Classic brokers over network bridges. When a bridge drops, the failure is asymmetric: the origin broker keeps accepting messages for destinations whose consumers live on the remote broker, and those messages pile up locally. The remote broker keeps running with consumers connected and nothing to consume. Both brokers look healthy in isolation. Only cross-broker correlation reveals the partition.&lt;/p>
&lt;p>The second phase is often worse than the first. When the bridge reconnects, the store-and-forward backlog replays in a burst. The receiving broker gets the entire accumulated backlog at wire speed, which can spike its memory into producer flow control and take down traffic that was fine all along.&lt;/p></description></item><item><title>ActiveMQ Network of Brokers replay storm: burst forwarding after a bridge reconnect</title><link>https://www.netdata.cloud/guides/activemq/activemq-nob-replay-storm/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/activemq/activemq-nob-replay-storm/</guid><description>&lt;p>A network bridge between two ActiveMQ brokers drops. Producers keep sending to the origin broker, and because ActiveMQ networks do reliable store-and-forward, the messages pile up locally. When the bridge reconnects, the accumulated backlog is replayed across the bridge in a burst. The receiving broker, idle a second ago, is now ingesting the backlog at wire speed. Its memory usage spikes, and if the spike reaches 100%, producer flow control activates on the receiver and producers there block silently.&lt;/p></description></item><item><title>ActiveMQ offline durable subscriber pending messages: the silent storage leak</title><link>https://www.netdata.cloud/guides/activemq/activemq-durable-subscriber-pending/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/activemq/activemq-durable-subscriber-pending/</guid><description>&lt;p>StorePercentUsage has been climbing for three weeks. Your queues are draining, consumer counts look right, dequeue rates track enqueue rates, and yet the KahaDB directory keeps growing and journal files keep stacking up. Nothing in the queue-depth metrics explains it.&lt;/p>
&lt;p>The usual suspect is not a queue at all. It is a durable topic subscription whose subscriber went away and never came back. Every persistent message published to that topic is still being written to the store on behalf of that subscription, and it will keep happening forever: ActiveMQ Classic has no automatic expiration for offline durable subscribers by default.&lt;/p></description></item><item><title>ActiveMQ oldest message age: the queue latency depth alone cannot show</title><link>https://www.netdata.cloud/guides/activemq/activemq-message-age-oldest-pending/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/activemq/activemq-message-age-oldest-pending/</guid><description>&lt;p>Every ActiveMQ dashboard has queue depth on it. Almost none show the age of the oldest pending message, which is the number that actually maps to your SLA. A queue holding 50 messages whose head has been waiting 45 minutes is a much bigger problem than a queue holding 50,000 messages whose head is 2 seconds old and draining fast. Depth alone cannot tell you which of those two situations you are looking at.&lt;/p></description></item><item><title>ActiveMQ per-destination DLQ: IndividualDeadLetterStrategy vs the shared ActiveMQ.DLQ</title><link>https://www.netdata.cloud/guides/activemq/activemq-per-destination-dlq/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/activemq/activemq-per-destination-dlq/</guid><description>&lt;p>Out of the box, ActiveMQ Classic routes every undeliverable message from every queue and topic into a single queue: &lt;code>ActiveMQ.DLQ&lt;/code>. One noisy destination with a poison-message problem mixes its failures with everyone else&amp;rsquo;s, and the only way to attribute a message back to its source is to browse the DLQ and inspect the &lt;code>JMSDestination&lt;/code> property on each entry. On a busy broker that is slow, expensive, and usually done too late.&lt;/p></description></item><item><title>ActiveMQ per-destination memory usage: one noisy queue blocking every producer</title><link>https://www.netdata.cloud/guides/activemq/activemq-per-destination-memory-limit/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/activemq/activemq-per-destination-memory-limit/</guid><description>&lt;p>Every producer on the broker is stuck in &lt;code>send()&lt;/code>. Broker-level &lt;code>MemoryPercentUsage&lt;/code> reads 100, the broker log shows the usage manager hitting its memory limit, and upstream services are timing out. But when you list queue depths, almost every queue is empty. One queue holds nearly all the pending messages.&lt;/p>
&lt;p>That one queue has consumed the broker&amp;rsquo;s shared memory pool. Every pending message is charged against its destination&amp;rsquo;s memory accounting and against the broker-wide system memory limit. If either limit is reached, flow control activates. With no per-destination memory limit set, ActiveMQ Classic does not throttle just that queue&amp;rsquo;s producers: it throttles everyone&amp;rsquo;s. This is the default behavior, not a bug.&lt;/p></description></item><item><title>ActiveMQ poison message loop: redelivery storms and DLQ growth</title><link>https://www.netdata.cloud/guides/activemq/activemq-poison-message-redelivery/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/activemq/activemq-poison-message-redelivery/</guid><description>&lt;p>A queue looks busy. Consumers are connected, dequeue counters are moving, and yet the business workflow has stalled: orders are not completing, messages are getting older, and somewhere in the broker a queue called &lt;code>ActiveMQ.DLQ&lt;/code> is quietly filling up. This is the poison message loop, and it is one of the most misread failure modes in ActiveMQ Classic because the headline metrics look healthy while useful work has stopped.&lt;/p>
&lt;p>The mechanism is simple. A message arrives that the consumer cannot process: a deserialization error, a schema mismatch after a producer deploy, a consumer bug, a downstream dependency returning something the consumer never handles. The consumer rolls back (or the session recovers), and the broker redelivers the message. The client-side &lt;code>RedeliveryPolicy&lt;/code> allows this up to &lt;code>maximumRedeliveries&lt;/code>, which defaults to 6, before the broker moves the message to the Dead Letter Queue. If the poisoned input is a class of messages rather than a single message, every one of them burns through its redelivery budget, and the broker spends its dispatch capacity retrying failures instead of doing work.&lt;/p></description></item><item><title>ActiveMQ prefetch limit: unacked hoarding versus idle consumers</title><link>https://www.netdata.cloud/guides/activemq/activemq-prefetch-tuning/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/activemq/activemq-prefetch-tuning/</guid><description>&lt;p>You have four consumers on a queue, producers are sending steadily, and yet throughput is a quarter of what you expect. &lt;code>ConsumerCount&lt;/code> says 4. &lt;code>QueueSize&lt;/code> looks small. &lt;code>DequeueCount&lt;/code> is crawling. The broker looks healthy and the consumers look connected, but three of them are doing nothing.&lt;/p>
&lt;p>This is the classic prefetch mismatch. The ActiveMQ prefetch limit controls how many messages the broker pushes to a consumer before it requires acknowledgments back. It is a client-side buffer the broker fills eagerly. With the default of 1000 for queues, the first consumer to connect can absorb the entire visible backlog into its prefetch buffer, where those messages are invisible to load balancing, no longer read as pending depth, and pinned against broker memory until they are acked.&lt;/p></description></item><item><title>ActiveMQ producer flow control: why send() hangs and producers block silently</title><link>https://www.netdata.cloud/guides/activemq/activemq-producer-flow-control/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/activemq/activemq-producer-flow-control/</guid><description>&lt;p>Your application is healthy. No exceptions, no error logs, no timeouts. But requests are piling up and every thread that touches the message producer is stuck inside &lt;code>send()&lt;/code>. Thread dumps show all your producer threads parked in the JMS client, waiting on a socket write that never completes. Nothing is wrong on the client. Nothing looks wrong on the broker either, until you check one number: &lt;code>MemoryPercentUsage&lt;/code> is at 100.&lt;/p></description></item><item><title>ActiveMQ queue with zero consumers: ConsumerCount at zero and a growing backlog</title><link>https://www.netdata.cloud/guides/activemq/activemq-queue-no-consumers/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/activemq/activemq-queue-no-consumers/</guid><description>&lt;p>A production queue shows &lt;code>ConsumerCount=0&lt;/code>, &lt;code>QueueSize&lt;/code> is climbing, and &lt;code>EnqueueCount&lt;/code> keeps ticking up while &lt;code>DequeueCount&lt;/code> is flat. Nobody is draining the queue. Every message that arrives stays in the broker, charged against destination memory and, for persistent messages, written into the KahaDB journal. Left alone, this ends in one of two places: broker memory hits 100% and producer flow control silently blocks every producer, or the store fills and persistent messaging halts entirely.&lt;/p></description></item><item><title>ActiveMQ QueueSize growing: reading the broker's backlog gauge correctly</title><link>https://www.netdata.cloud/guides/activemq/activemq-queue-size-growing/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/activemq/activemq-queue-size-growing/</guid><description>&lt;p>QueueSize is the first number every operator looks at, and the one most often misread. The common mental model is &amp;ldquo;messages waiting in the queue,&amp;rdquo; but that is not what the broker reports. QueueSize is a broker-maintained gauge, not enqueued-minus-dequeued, and it includes messages already dispatched to consumers but not yet acknowledged. Two queues showing QueueSize=5000 can be in completely different states, and a queue showing QueueSize=0 can still be in trouble.&lt;/p></description></item><item><title>ActiveMQ reconnection storm: transport accept spikes and CPU on handshakes</title><link>https://www.netdata.cloud/guides/activemq/activemq-reconnection-storm/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/activemq/activemq-reconnection-storm/</guid><description>&lt;p>The broker is up. Queues are draining. But the accept rate on the OpenWire connector is running at ten times baseline, JVM thread count and open file descriptors are climbing in a sawtooth, and CPU is pinned even though message throughput is flat or down. Clients are connecting, disconnecting, and reconnecting in a tight loop, and every one of those connections costs the broker real work: a TCP accept, an optional TLS handshake, wire-format negotiation, and a new transport thread.&lt;/p></description></item><item><title>ActiveMQ redelivery rate climbing: rollbacks, nacks, and retry storms</title><link>https://www.netdata.cloud/guides/activemq/activemq-redelivery-rate-high/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/activemq/activemq-redelivery-rate-high/</guid><description>&lt;p>Your dequeue rate looks busy, but useful work is not getting done. Messages are dispatched, rolled back or nacked, and dispatched again. The broker spends its cycles retrying instead of making progress, and the redelivery counters climb. This is the &lt;a href="https://www.netdata.cloud/guides/activemq/activemq-how-it-works-in-production/">poison message replay storm pattern&lt;/a> in its early stage, and it leads two things you do not want: dead letter queue growth and silent correctness loss.&lt;/p>
&lt;p>Redelivery is normal in small doses. A consumer restart, a transient downstream timeout, a transacted session rolled back once: all bump redelivery counters briefly. What matters is a sustained pattern. High dispatch rate combined with an equally high redelivery rate is net-zero progress, and if you only watch dequeue-adjacent throughput the broker can look healthy while nothing completes.&lt;/p></description></item><item><title>ActiveMQ shared-storage HA split-brain: two brokers holding the store lock</title><link>https://www.netdata.cloud/guides/activemq/activemq-ha-split-brain/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/activemq/activemq-ha-split-brain/</guid><description>&lt;p>In a shared-storage HA pair, exactly one ActiveMQ Classic broker is supposed to hold the KahaDB store lock and run active. The second broker sits in a polling loop, waiting for the lock, with its transport connectors down. Split-brain is the state where that invariant breaks: both brokers believe they are active, both accept client connections, and both write to the same KahaDB store on shared storage.&lt;/p>
&lt;p>Two writers on one store means message duplication, ordering violations, and real risk of journal and index corruption. Clients connected to the &amp;ldquo;wrong&amp;rdquo; broker get messages the other broker also delivers. Recovery is not just &amp;ldquo;restart one node&amp;rdquo;: you have to decide which broker&amp;rsquo;s view of the store is authoritative, and the store itself may already be damaged.&lt;/p></description></item><item><title>ActiveMQ store is full: StorePercentUsage at 100% and persistent messaging halted</title><link>https://www.netdata.cloud/guides/activemq/activemq-store-is-full/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/activemq/activemq-store-is-full/</guid><description>&lt;p>StorePercentUsage has hit 100% on the broker MBean and persistent producers have stopped. Their &lt;code>send()&lt;/code> calls are either blocked in flow control or being rejected, depending on your destination policy. Non-persistent traffic may still flow, which makes the outage look partial from the outside.&lt;/p>
&lt;p>This is the disk-side equivalent of the memory wall. Where MemoryPercentUsage at 100% blocks producers against the configured memory limit, StorePercentUsage at 100% blocks persistent producers against the configured &lt;code>storeUsage&lt;/code> limit in &lt;code>activemq.xml&lt;/code>. The broker log shows a &amp;ldquo;Persistent store is Full&amp;rdquo; message, and producers stall silently unless you configured &lt;code>sendFailIfNoSpaceAfterTimeout&lt;/code>.&lt;/p></description></item><item><title>ActiveMQ store usage climbing: the store exhaustion spiral</title><link>https://www.netdata.cloud/guides/activemq/activemq-store-usage-growing/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/activemq/activemq-store-usage-growing/</guid><description>&lt;p>StorePercentUsage was 62% last month. Last week it was 74%. This morning it crossed 80% and your alert fired. Queue depths look normal, consumers are connected, dequeue rates look healthy. Nothing is obviously on fire, but the persistent store keeps growing and nobody knows why.&lt;/p>
&lt;p>This is the store exhaustion spiral, one of the most common slow-burn failure patterns in ActiveMQ Classic. Unlike the memory-pressure cascade, which develops in minutes, the store spiral develops over days or weeks. Messages accumulate in the KahaDB journal faster than they are acknowledged, journal files pile up on disk, and the store limit creeps closer. When StorePercentUsage reaches 100%, the broker stops accepting persistent messages entirely and every persistent producer blocks. The warning signs were visible for weeks.&lt;/p></description></item><item><title>ActiveMQ StorePercentUsage vs actual disk space: the limit that fires after the disk is already full</title><link>https://www.netdata.cloud/guides/activemq/activemq-store-usage-vs-disk-space/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/activemq/activemq-store-usage-vs-disk-space/</guid><description>&lt;p>Your broker just stopped accepting persistent messages. Producers are blocked or erroring, the KahaDB partition is at 100% disk usage, and yet your dashboard shows &lt;code>StorePercentUsage&lt;/code> at 62%. The alert you set on store usage never fired. This is one of the most common ActiveMQ monitoring traps: &lt;code>StorePercentUsage&lt;/code> and actual disk usage are two different counters measured against two different denominators, and if you have not reconciled them, one of them is lying to you.&lt;/p></description></item><item><title>ActiveMQ temp store full: non-persistent overflow and silent message drops</title><link>https://www.netdata.cloud/guides/activemq/activemq-temp-store-full/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/activemq/activemq-temp-store-full/</guid><description>&lt;p>Non-persistent messages in ActiveMQ Classic live in broker memory. When memory fills, the broker spills them to an on-disk overflow area called the temp store (default &lt;code>data/tmp_storage&lt;/code>). When the temp store fills, non-persistent messaging breaks. Depending on your destination policies, it can break in the worst possible way: messages are silently discarded while producers see no error and consumers just see less traffic.&lt;/p>
&lt;p>This is one of the least-monitored resources in ActiveMQ. Many teams do not know the temp store exists until it fills. The signal you need is &lt;code>TempPercentUsage&lt;/code> on the Broker MBean. At 50% you have a performance problem. At 100% you have a correctness problem.&lt;/p></description></item><item><title>ActiveMQ temporary destination leak: request-reply queues that never close</title><link>https://www.netdata.cloud/guides/activemq/activemq-temporary-destination-leak/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/activemq/activemq-temporary-destination-leak/</guid><description>&lt;p>You open the broker&amp;rsquo;s JMX view and the TemporaryQueues attribute lists hundreds or thousands of entries. The count only goes up. Nothing in the application logs looks wrong, request-reply calls mostly work, but the destination count climbs with traffic and never comes back down. That is a temporary destination leak.&lt;/p>
&lt;p>Temporary destinations back the classic JMS request-reply pattern: a client creates a TemporaryQueue, sends a request with the temp queue as the reply-to, and waits for the response. In a healthy system these destinations cycle constantly: created, used, deleted. When the count grows monotonically with request volume, something in that lifecycle is broken, and the broker is accumulating MBeans, metadata, and advisory traffic for destinations that will never be used again.&lt;/p></description></item><item><title>ActiveMQ Too many open files: file descriptor exhaustion and refused connections</title><link>https://www.netdata.cloud/guides/activemq/activemq-too-many-open-files/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/activemq/activemq-too-many-open-files/</guid><description>&lt;p>The broker log shows &lt;code>Too many open files&lt;/code> on the accept path, new clients cannot connect, and existing clients may start timing out. In the worst case the broker also fails to open a new KahaDB journal file during rotation, and now you have a store integrity problem that looks, at first glance, like a disk failure. It is not. The broker has run out of file descriptors.&lt;/p>
&lt;p>The root cause is usually boring: the broker is running with the default Linux per-process limit of 1024 open files. Every client connection, every KahaDB journal file, every temp store file, every log file, and every network bridge connection consumes one descriptor. A modest production broker blows through 1024 without trying.&lt;/p></description></item><item><title>ActiveMQ transport connector not accepting: a live broker that refuses one protocol</title><link>https://www.netdata.cloud/guides/activemq/activemq-transport-connector-not-accepting/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/activemq/activemq-transport-connector-not-accepting/</guid><description>&lt;p>The broker process is running. The JVM is up, OpenWire clients on 61616 are producing and consuming, and your process-level health check is green. But the AMQP clients on 5672 cannot connect, and their reconnect loops are filling your application logs.&lt;/p>
&lt;p>This partial failure is worse than a full outage in one specific way: most monitoring does not see it. A TCP check against one port, or a process-alive check, tells you nothing about the other four connectors. ActiveMQ Classic runs each transport connector (OpenWire 61616, AMQP 5672, STOMP 61613, MQTT 1883, WebSocket 61614) as its own accept path, and each one can fail independently while the rest of the broker looks healthy.&lt;/p></description></item><item><title>ActiveMQ.DLQ growing: dead letter queue accumulation and poison messages</title><link>https://www.netdata.cloud/guides/activemq/activemq-dlq-growing/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/activemq/activemq-dlq-growing/</guid><description>&lt;p>The queue named &lt;code>ActiveMQ.DLQ&lt;/code> is growing and nobody is consuming from it. That is the default dead letter queue: it has no consumers, no TTL, and no automatic cleanup, so every message that lands there stays there forever.&lt;/p>
&lt;p>Every message in the DLQ is two problems at once. It is a failed business transaction that some consumer gave up on after exhausting redeliveries. And it is a storage leak: DLQ messages are never acknowledged, and in KahaDB a single unacknowledged message pins its entire journal file. A DLQ that grows quietly for weeks is a common root cause behind store exhaustion, which eventually halts persistent messaging on the whole broker.&lt;/p></description></item><item><title>How ActiveMQ Classic actually works in production: a mental model for operators</title><link>https://www.netdata.cloud/guides/activemq/activemq-how-it-works-in-production/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.netdata.cloud/guides/activemq/activemq-how-it-works-in-production/</guid><description>&lt;p>Most ActiveMQ incidents are misdiagnosed in the first hour because the operator is looking at the wrong subsystem. A &amp;ldquo;hung producer&amp;rdquo; is flow control doing its job. A &amp;ldquo;slow broker&amp;rdquo; is fsync latency on the KahaDB device. A &amp;ldquo;healthy&amp;rdquo; broker that is losing messages is a full temp store with flow control disabled. Each of these looks like a different problem until you know which subsystem is actually involved.&lt;/p>
&lt;p>This article builds the mental model you need before any runbook makes sense: what the broker is doing at any moment, the path a message takes from producer socket to consumer ack, and where each subsystem fails. It covers ActiveMQ Classic 5.x. Artemis has fundamentally different internals (journal-based store, paging instead of flow control, a different MBean tree), and almost nothing here transfers.&lt;/p></description></item></channel></rss>