外观
ActiveMQ Classic 快速开始
本页结论:最短闭环——启动单节点 Classic(镜像 digest 锁定、OpenWire 默认匿名),向
orders-basic发 3 条订单事件(队列自动创建,无需预建拓扑),消费者业务落库后才 session.commit(),确认队列深度归零,然后干净清理。
前置条件
- Docker(含 Compose v2)与 JDK 21+、Maven。
- 端口
61616(OpenWire,默认允许匿名)与8161(Web 控制台,admin/admin)仅绑定到127.0.0.1。 - 匿名访问是本实验的默认配置,不是生产配置;安全基线见 运维与观测。
一步运行实验
bash
bash demos/activemq-classic/basic/run.sh该命令完成整个闭环:启动 Classic(镜像 digest 锁定)→ healthcheck 等 61616 就绪 → Producer persistent send 发 3 条 OrderCreated.v1 到 orders-basic(队列首次发送时自动创建,同步确认)→ Consumer SESSION_TRANSACTED 会话读取、业务写 sqlite 后才 session.commit()(幂等表拦截重复)→ 断言(含 QueueBrowser 深度为 0,证明 commit 即删除)→ 自动停止并删除容器。
手工走一遍(理解每一步)
bash
cd demos/activemq-classic/basic
# 1. 启动完整流程:activemq → producer → consumer → inspect-db → stats
# (Classic 无显式建队命令:队列首次收发时自动创建;顺序与健康等待由 depends_on 条件保证)
docker compose --env-file ../../../.env.versions up -d
docker compose wait stats
# 2. 观察关键语义:确认后队列深度归零(stats 服务的日志即 QueueBrowser 深度)
docker compose logs stats
# 3. 查看各角色日志与退出码
docker compose logs producer consumer
docker compose ps --all
# 4. 清理(仅删除本实验的 Compose Project)
docker compose --env-file ../../../.env.versions down --volumes预期输出
每条日志都是统一的 key=value 结构,生产端关键一行(brokerMessageId 为 JMSMessageID):
text
[producer] ... messageId=... destination=orders-basic brokerMessageId=ID:... status=confirmed消费端关键两行(先业务提交,后 session.commit):
text
[consumer] ... messageId=... attempt=1 redelivered=false status=received
[consumer] ... messageId=... attempt=1 status=business_committedactivemq-classic / basic
bash demos/activemq-classic/basic/run.shassert.out.txt
PASS confirmed: 3 PASS received: 3 PASS uniqueMessageIds: 3 PASS redeliveredCount: 0 PASS businessCommitted: 3 PASS business_rows: 3 PASS queueDepth: 0 PASS consumer.exitCode: 0 RESULT: all assertions passed
consumer.out.txt
SLF4J(W): No SLF4J providers were found. SLF4J(W): Defaulting to no-operation (NOP) logger implementation SLF4J(W): See https://www.slf4j.org/codes.html#noProviders for further details. [consumer] timestamp=2026-08-20T17:03:16.067658735Z level=INFO service=order-service product=activemq-classic lab=basic destination=orders-basic consumer=consumer-1 status=subscribed [consumer] timestamp=2026-08-20T17:03:16.237533314Z level=INFO service=order-service product=activemq-classic lab=basic messageId=01JMQ000000000000000000001 eventType=order.created schemaVersion=1 aggregateId=order-1001 traceId=00000000000000000000000000000001 correlationId=order-1001 destination=orders-basic seq=1 consumer=consumer-1 attempt=1 redelivered=false deliveryDelayMs=1290 status=received [consumer] timestamp=2026-08-20T17:03:16.251916737Z level=INFO service=order-service product=activemq-classic lab=basic messageId=01JMQ000000000000000000001 eventType=order.created schemaVersion=1 aggregateId=order-1001 traceId=00000000000000000000000000000001 correlationId=order-1001 destination=orders-basic consumer=consumer-1 attempt=1 status=business_committed [consumer] timestamp=2026-08-20T17:03:16.262464695Z level=INFO service=order-service product=activemq-classic lab=basic messageId=01JMQ000000000000000000002 eventType=order.created schemaVersion=1 aggregateId=order-1002 traceId=00000000000000000000000000000002 correlationId=order-1002 destination=orders-basic seq=2 consumer=consumer-1 attempt=1 redelivered=false deliveryDelayMs=1282 status=received [consumer] timestamp=2026-08-20T17:03:16.269795123Z level=INFO service=order-service product=activemq-classic lab=basic messageId=01JMQ000000000000000000002 eventType=order.created schemaVersion=1 aggregateId=order-1002 traceId=00000000000000000000000000000002 correlationId=order-1002 destination=orders-basic consumer=consumer-1 attempt=1 status=business_committed [consumer] timestamp=2026-08-20T17:03:16.275367505Z level=INFO service=order-service product=activemq-classic lab=basic messageId=01JMQ000000000000000000003 eventType=order.created schemaVersion=1 aggregateId=order-1003 traceId=00000000000000000000000000000003 correlationId=order-1003 destination=orders-basic seq=3 consumer=consumer-1 attempt=1 redelivered=false deliveryDelayMs=1288 status=received [consumer] timestamp=2026-08-20T17:03:16.281910220Z level=INFO service=order-service product=activemq-classic lab=basic messageId=01JMQ000000000000000000003 eventType=order.created schemaVersion=1 aggregateId=order-1003 traceId=00000000000000000000000000000003 correlationId=order-1003 destination=orders-basic consumer=consumer-1 attempt=1 status=business_committed [consumer] timestamp=2026-08-20T17:03:16.287269525Z level=INFO service=order-service product=activemq-classic lab=basic destination=orders-basic consumer=consumer-1 received=3 poisonMaxAttempt=1 status=done
inspect-db.out.txt
SLF4J(W): No SLF4J providers were found. SLF4J(W): Defaulting to no-operation (NOP) logger implementation SLF4J(W): See https://www.slf4j.org/codes.html#noProviders for further details. [inspect] timestamp=2026-08-20T17:03:16.980012696Z level=INFO service=order-service product=activemq-classic lab=basic business_rows=3 processed_rows=3 status=snapshot
producer.out.txt
SLF4J(W): No SLF4J providers were found. SLF4J(W): Defaulting to no-operation (NOP) logger implementation SLF4J(W): See https://www.slf4j.org/codes.html#noProviders for further details. [producer] timestamp=2026-08-20T17:03:14.976692968Z level=INFO service=order-service product=activemq-classic lab=basic messageId=01JMQ000000000000000000001 eventType=order.created schemaVersion=1 aggregateId=order-1001 traceId=00000000000000000000000000000001 correlationId=order-1001 destination=orders-basic seq=1 brokerMessageId=ID:1697211b8a8b-35177-1787245394475-1:1:1:1:1 durationMs=29 status=confirmed [producer] timestamp=2026-08-20T17:03:14.986253658Z level=INFO service=order-service product=activemq-classic lab=basic messageId=01JMQ000000000000000000002 eventType=order.created schemaVersion=1 aggregateId=order-1002 traceId=00000000000000000000000000000002 correlationId=order-1002 destination=orders-basic seq=2 brokerMessageId=ID:1697211b8a8b-35177-1787245394475-1:1:1:1:2 durationMs=6 status=confirmed [producer] timestamp=2026-08-20T17:03:14.990766013Z level=INFO service=order-service product=activemq-classic lab=basic messageId=01JMQ000000000000000000003 eventType=order.created schemaVersion=1 aggregateId=order-1003 traceId=00000000000000000000000000000003 correlationId=order-1003 destination=orders-basic seq=3 brokerMessageId=ID:1697211b8a8b-35177-1787245394475-1:1:1:1:3 durationMs=3 status=confirmed [producer] timestamp=2026-08-20T17:03:14.991548043Z level=INFO service=order-service product=activemq-classic lab=basic destination=orders-basic sent=3 status=done
stats.out.txt
SLF4J(W): No SLF4J providers were found. SLF4J(W): Defaulting to no-operation (NOP) logger implementation SLF4J(W): See https://www.slf4j.org/codes.html#noProviders for further details. [inspect] timestamp=2026-08-20T17:03:17.703296430Z level=INFO service=order-service product=activemq-classic lab=basic queue=orders-basic queueDepth=0 status=snapshot
调试入口
容器运行期间可用 Web 控制台观察 Queue/Topic 与连接:浏览器打开 http://127.0.0.1:8161,默认凭据 admin/admin(镜像 jetty realm)。命令行侧的深度清点用 QueueBrowser(本仓库 stats 命令即用它);镜像自带的统一入口 bin/activemq 及 producer/consumer/status 等任务见 运维与观测 的 cli-tools 小节。指标读法同页。
清理与安全
- run.sh 退出时的
docker compose down --volumes只 down 本实验的 Compose Project(hello-mq-activemq-classic-basic),不会碰其他容器或卷。 - 本仓库的实验 Classic 不挂持久卷:KahaDB 数据随容器销毁;生产环境的持久化与高可用取舍见 存储与高可用。
下一步
- 概念不熟:读 核心概念映射。
- 想看失败路径:运行
bash demos/activemq-classic/retry-dlq/run.sh,观察 Broker 端重投与默认死信 ActiveMQ.DLQ。
官方资料
- Classic 文档首页:https://activemq.apache.org/components/classic/documentation/(checkedAt: 2026-08-20)