Common utilities, API classes, and shared functionality for Apache ActiveMQ Artemis message broker
—
Apache ActiveMQ Artemis Commons provides a comprehensive logging framework with internationalization support and audit capabilities for system events and operations.
Primary logging interface for utility operations in Artemis.
interface ActiveMQUtilLogger {
// Standard logging methods
void info(String message);
void info(String message, Object... params);
void warn(String message);
void warn(String message, Object... params);
void warn(String message, Throwable cause);
void error(String message);
void error(String message, Object... params);
void error(String message, Throwable cause);
void debug(String message);
void debug(String message, Object... params);
void trace(String message);
void trace(String message, Object... params);
// Conditional logging
boolean isInfoEnabled();
boolean isWarnEnabled();
boolean isErrorEnabled();
boolean isDebugEnabled();
boolean isTraceEnabled();
}Message bundle interface for internationalized messages.
interface ActiveMQUtilBundle {
// Internationalized message methods
String getMessage(String key);
String getMessage(String key, Object... params);
// Formatted exception messages
String getExceptionMessage(String key);
String getExceptionMessage(String key, Object... params);
// Bundle metadata
String getBundleName();
Locale getLocale();
}Specialized logging for audit events and security-related operations.
class AuditLogger {
// Audit event logging
static void logAuditEvent(String event);
static void logAuditEvent(String event, Object... params);
static void logAuditEvent(String event, String details);
static void logAuditEvent(String event, String details, Object... params);
// Security audit events
static void logSecurityEvent(String event, String user);
static void logSecurityEvent(String event, String user, String details);
// Administrative audit events
static void logAdminEvent(String event, String admin);
static void logAdminEvent(String event, String admin, String details);
// Configuration and setup
static void setEnabled(boolean enabled);
static boolean isEnabled();
static void setAuditLevel(String level);
}Factory for creating message bundles with internationalization support.
class BundleFactory {
// Create message bundles
static <T> T newBundle(Class<T> bundleInterface);
static <T> T newBundle(Class<T> bundleInterface, Locale locale);
static <T> T newBundle(Class<T> bundleInterface, String baseName);
static <T> T newBundle(Class<T> bundleInterface, String baseName, Locale locale);
// Bundle configuration
static void setDefaultLocale(Locale locale);
static Locale getDefaultLocale();
static void setFallbackLocale(Locale locale);
static Locale getFallbackLocale();
}import org.apache.activemq.artemis.logs.ActiveMQUtilLogger;
// Get logger instance (typically injected or created by framework)
ActiveMQUtilLogger logger = getLogger();
// Basic logging
logger.info("Server started successfully");
logger.warn("Connection pool nearing capacity: {0}/{1}", currentConnections, maxConnections);
logger.error("Failed to process message", exception);
// Conditional logging for performance
if (logger.isDebugEnabled()) {
logger.debug("Processing message with ID: {0}, size: {1} bytes",
message.getId(), message.getSize());
}
// Trace logging for detailed debugging
if (logger.isTraceEnabled()) {
logger.trace("Buffer state: readable={0}, writable={1}, position={2}",
buffer.readableBytes(), buffer.writableBytes(), buffer.readerIndex());
}import org.apache.activemq.artemis.logs.AuditLogger;
// Enable audit logging
AuditLogger.setEnabled(true);
AuditLogger.setAuditLevel("INFO");
// Log administrative events
AuditLogger.logAdminEvent("QUEUE_CREATED", "admin", "Queue 'orders' created with max consumers: 10");
AuditLogger.logAdminEvent("QUEUE_DELETED", "admin", "Queue 'temp-queue' deleted");
// Log security events
AuditLogger.logSecurityEvent("USER_LOGIN", "john.doe", "Successful login from 192.168.1.100");
AuditLogger.logSecurityEvent("ACCESS_DENIED", "anonymous", "Attempt to access admin queue without permission");
// Log general audit events
AuditLogger.logAuditEvent("MESSAGE_SENT", "Queue: orders, Size: {0} bytes", messageSize);
AuditLogger.logAuditEvent("CONNECTION_ESTABLISHED", "Client: {0}, Protocol: {1}", clientId, protocol);
// Check if audit logging is enabled before expensive operations
if (AuditLogger.isEnabled()) {
String details = buildDetailedAuditInfo(operation);
AuditLogger.logAuditEvent("COMPLEX_OPERATION", details);
}import org.apache.activemq.artemis.logs.BundleFactory;
import org.apache.activemq.artemis.logs.ActiveMQUtilBundle;
// Create message bundle for default locale
ActiveMQUtilBundle bundle = BundleFactory.newBundle(ActiveMQUtilBundle.class);
// Create bundle for specific locale
ActiveMQUtilBundle spanishBundle = BundleFactory.newBundle(
ActiveMQUtilBundle.class,
new Locale("es", "ES")
);
// Use internationalized messages
String errorMessage = bundle.getMessage("queue.not.found", queueName);
String warningMessage = bundle.getMessage("connection.timeout", timeout, TimeUnit.SECONDS);
// Exception messages
String exceptionMsg = bundle.getExceptionMessage("invalid.configuration", configKey);
throw new ActiveMQException(exceptionMsg);
// Bundle information
String bundleName = bundle.getBundleName();
Locale currentLocale = bundle.getLocale();// Define custom message bundle interface
public interface MyComponentBundle {
@Message(id = 1001, value = "Queue {0} created successfully")
String queueCreated(String queueName);
@Message(id = 1002, value = "Failed to connect to broker at {0}:{1}")
String connectionFailed(String host, int port);
@Message(id = 1003, value = "Message processing completed in {0}ms")
String processingCompleted(long durationMs);
@Message(id = 1004, value = "Invalid routing type: {0}. Expected: {1}")
ActiveMQException invalidRoutingType(String actual, String expected);
}
// Use custom bundle
MyComponentBundle messages = BundleFactory.newBundle(MyComponentBundle.class);
// Log with internationalized messages
logger.info(messages.queueCreated("orders"));
logger.error(messages.connectionFailed("localhost", 61616));
logger.debug(messages.processingCompleted(processingTime));
// Throw internationalized exceptions
throw messages.invalidRoutingType("UNKNOWN", "ANYCAST or MULTICAST");public class QueueManager {
private final ActiveMQUtilLogger logger;
private final String componentName;
public QueueManager(String componentName) {
this.componentName = componentName;
this.logger = getLogger();
}
public void createQueue(QueueConfiguration config) {
String queueName = config.getName().toString();
// Log operation start
logger.info("[{0}] Creating queue: {1}", componentName, queueName);
try {
// Perform queue creation
doCreateQueue(config);
// Log success with details
logger.info("[{0}] Queue created successfully: name={1}, durable={2}, maxConsumers={3}",
componentName, queueName, config.getDurable(), config.getMaxConsumers());
// Audit the administrative action
AuditLogger.logAdminEvent("QUEUE_CREATED", getCurrentUser(),
String.format("Queue: %s, Component: %s", queueName, componentName));
} catch (Exception e) {
// Log error with context
logger.error("[{0}] Failed to create queue: {1}", componentName, queueName, e);
// Audit the failure
AuditLogger.logAuditEvent("QUEUE_CREATION_FAILED",
"Queue: {0}, Component: {1}, Error: {2}",
queueName, componentName, e.getMessage());
throw e;
}
}
}public class HighThroughputProcessor {
private final ActiveMQUtilLogger logger;
public void processMessage(Message message) {
// Use conditional logging to avoid expensive string operations
if (logger.isDebugEnabled()) {
logger.debug("Processing message: id={0}, type={1}, size={2}",
message.getId(), message.getType(), message.getSize());
}
try {
// Process message
Object result = doProcessMessage(message);
// Log only critical information at INFO level
if (result != null) {
logger.info("Message processed successfully: {0}", message.getId());
}
// Detailed trace logging
if (logger.isTraceEnabled()) {
logger.trace("Processing result: {0}, duration={1}ms, memory={2}MB",
result.toString(), getDuration(), getMemoryUsage());
}
} catch (Exception e) {
// Always log errors
logger.error("Message processing failed: {0}", message.getId(), e);
// Audit critical failures
if (isCriticalError(e)) {
AuditLogger.logAuditEvent("CRITICAL_PROCESSING_ERROR",
"Message: {0}, Error: {1}",
message.getId(), e.getClass().getSimpleName());
}
}
}
}public class LoggingConfiguration {
public void configureLogging() {
// Set up bundle factory defaults
BundleFactory.setDefaultLocale(Locale.getDefault());
BundleFactory.setFallbackLocale(Locale.ENGLISH);
// Configure audit logging based on system properties
boolean auditEnabled = Boolean.parseBoolean(
System.getProperty("artemis.audit.enabled", "false"));
AuditLogger.setEnabled(auditEnabled);
if (auditEnabled) {
String auditLevel = System.getProperty("artemis.audit.level", "INFO");
AuditLogger.setAuditLevel(auditLevel);
}
// Log configuration
ActiveMQUtilLogger logger = getLogger();
logger.info("Logging configured: audit={0}, locale={1}",
auditEnabled, BundleFactory.getDefaultLocale());
}
}public class ServiceComponent {
private final ActiveMQUtilLogger logger;
private final MyComponentBundle messages;
public ServiceComponent() {
this.logger = getLogger();
this.messages = BundleFactory.newBundle(MyComponentBundle.class);
}
public void performOperation() throws ActiveMQException {
logger.info("Starting operation");
try {
doOperation();
logger.info("Operation completed successfully");
} catch (ActiveMQException e) {
// Log and re-throw ActiveMQ exceptions
logger.error(messages.operationFailed(), e);
throw e;
} catch (Exception e) {
// Wrap and log other exceptions
String errorMsg = messages.unexpectedError(e.getMessage());
logger.error(errorMsg, e);
throw new ActiveMQInternalErrorException(errorMsg, e);
}
}
}public class MessageHandler {
private final ActiveMQUtilLogger logger;
public void handleRequest(String requestId, Object request) {
// Log request start
logger.info("Processing request: {0}", requestId);
if (logger.isDebugEnabled()) {
logger.debug("Request details: {0}, type={1}",
requestId, request.getClass().getSimpleName());
}
long startTime = System.currentTimeMillis();
try {
Object response = processRequest(request);
long duration = System.currentTimeMillis() - startTime;
// Log successful completion
logger.info("Request completed: {0}, duration={1}ms", requestId, duration);
// Trace response details
if (logger.isTraceEnabled()) {
logger.trace("Response for {0}: {1}", requestId, response);
}
} catch (Exception e) {
long duration = System.currentTimeMillis() - startTime;
logger.error("Request failed: {0}, duration={1}ms", requestId, duration, e);
// Audit significant failures
AuditLogger.logAuditEvent("REQUEST_PROCESSING_FAILED",
"RequestId: {0}, Duration: {1}ms, Error: {2}",
requestId, duration, e.getMessage());
}
}
}Install with Tessl CLI
npx tessl i tessl/maven-org-apache-activemq--artemis-commons