From 6f6c5723d50b179860319d380ab759ea1d65620a Mon Sep 17 00:00:00 2001 From: Howard Gao Date: Thu, 18 Jan 2024 17:31:50 +0800 Subject: [PATCH] ARTEMIS-4576 ServerSessionImpl#updateProducerMetrics access large messages after being routed --- .../artemis/core/server/impl/ServerSessionImpl.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ServerSessionImpl.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ServerSessionImpl.java index a180b0b8421..3e3f268d64f 100644 --- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ServerSessionImpl.java +++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ServerSessionImpl.java @@ -2357,11 +2357,15 @@ public synchronized RoutingStatus doSend(final Transaction tx, routingContext.setAddress(art.getName()); routingContext.setRoutingType(art.getRoutingType()); + // Retrieve message size for metrics update before routing, + // since large message backing files may be closed once routing completes + int mSize = msg instanceof LargeServerMessageImpl ? ((LargeServerMessageImpl)msg).getBodyBufferSize() : msg.getEncodeSize(); + result = postOffice.route(msg, routingContext, direct); logger.debug("Routing result for {} = {}", msg, result); - updateProducerMetrics(msg, senderName); + updateProducerMetrics(msg, senderName, mSize); } finally { if (!routingContext.isReusable()) { routingContext.clear(); @@ -2520,10 +2524,10 @@ public String toManagementString() { return "ServerSession [id=" + getConnectionID() + ":" + getName() + "]"; } - private void updateProducerMetrics(Message msg, String senderName) { + private void updateProducerMetrics(Message msg, String senderName, int mSize) { ServerProducer serverProducer = serverProducers.getServerProducer(senderName, msg, this); if (serverProducer != null) { - serverProducer.updateMetrics(msg.getUserID(), msg instanceof LargeServerMessageImpl ? ((LargeServerMessageImpl)msg).getBodyBufferSize() : msg.getEncodeSize()); + serverProducer.updateMetrics(msg.getUserID(), mSize); } }