You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by jb...@apache.org on 2020/05/19 16:52:30 UTC
[activemq] branch activemq-5.15.x updated: AMQ-7467 - A new XStream
serializer is created on every message that flows through the broker
causing high CPU utilization under load (#523)
This is an automated email from the ASF dual-hosted git repository.
jbonofre pushed a commit to branch activemq-5.15.x
in repository https://gitbox.apache.org/repos/asf/activemq.git
The following commit(s) were added to refs/heads/activemq-5.15.x by this push:
new 536bbad AMQ-7467 - A new XStream serializer is created on every message that flows through the broker causing high CPU utilization under load (#523)
536bbad is described below
commit 536bbad6d3b32ed99e82282c3fa1b074cffe45c7
Author: thodimi1 <th...@yahoo.com>
AuthorDate: Tue May 19 12:51:38 2020 -0400
AMQ-7467 - A new XStream serializer is created on every message that flows through the broker causing high CPU utilization under load (#523)
[AMQ-7467] Reuse xstream serializer to reduce CPU usage.
Co-authored-by: murali.mogalayapalli <Mu...@tylertech.com>
(cherry picked from commit 0c00e1b791e90daea8125e7fd572dd1af2435aa5)
---
.../activemq/transport/stomp/JmsFrameTranslator.java | 10 +++++++++-
.../activemq/transport/stomp/ProtocolConverter.java | 16 +++++++++++++++-
2 files changed, 24 insertions(+), 2 deletions(-)
diff --git a/activemq-stomp/src/main/java/org/apache/activemq/transport/stomp/JmsFrameTranslator.java b/activemq-stomp/src/main/java/org/apache/activemq/transport/stomp/JmsFrameTranslator.java
index 3504182..105ba3e 100644
--- a/activemq-stomp/src/main/java/org/apache/activemq/transport/stomp/JmsFrameTranslator.java
+++ b/activemq-stomp/src/main/java/org/apache/activemq/transport/stomp/JmsFrameTranslator.java
@@ -59,6 +59,7 @@ import com.thoughtworks.xstream.io.xml.xppdom.XppFactory;
public class JmsFrameTranslator extends LegacyFrameTranslator implements BrokerContextAware {
XStream xStream = null;
+ XStream xStreamAdvisory = null;
BrokerContext brokerContext;
@Override
@@ -218,12 +219,19 @@ public class JmsFrameTranslator extends LegacyFrameTranslator implements BrokerC
out = new PrettyPrintWriter(buffer);
}
- XStream xstream = getXStream();
+ XStream xstream = getXStreamAdvisory();
xstream.setMode(XStream.NO_REFERENCES);
xstream.aliasPackage("", "org.apache.activemq.command");
xstream.marshal(ds, out);
return buffer.toString();
}
+ private XStream getXStreamAdvisory()
+ {
+ if (xStreamAdvisory == null) {
+ xStreamAdvisory = createXStream();
+ }
+ return xStreamAdvisory;
+ }
// Properties
// -------------------------------------------------------------------------
diff --git a/activemq-stomp/src/main/java/org/apache/activemq/transport/stomp/ProtocolConverter.java b/activemq-stomp/src/main/java/org/apache/activemq/transport/stomp/ProtocolConverter.java
index a7ff21e..927505a 100644
--- a/activemq-stomp/src/main/java/org/apache/activemq/transport/stomp/ProtocolConverter.java
+++ b/activemq-stomp/src/main/java/org/apache/activemq/transport/stomp/ProtocolConverter.java
@@ -125,6 +125,8 @@ public class ProtocolConverter {
private int lastCommandId;
private final AtomicBoolean connected = new AtomicBoolean(false);
private final FrameTranslator frameTranslator = new LegacyFrameTranslator();
+ private ConcurrentMap<String, FrameTranslator> jmsFrameTranslators=new ConcurrentHashMap<String,FrameTranslator>();
+
private final FactoryFinder FRAME_TRANSLATOR_FINDER = new FactoryFinder("META-INF/services/org/apache/activemq/transport/frametranslator/");
private final BrokerContext brokerContext;
private String version = "1.0";
@@ -189,7 +191,17 @@ public class ProtocolConverter {
FrameTranslator translator = frameTranslator;
try {
if (header != null) {
- translator = (FrameTranslator) FRAME_TRANSLATOR_FINDER.newInstance(header);
+ translator=jmsFrameTranslators.get(header);
+ if(translator==null) {
+ LOG.info("Creating a new FrameTranslator to convert "+header);
+ translator = (FrameTranslator) FRAME_TRANSLATOR_FINDER.newInstance(header);
+ if(translator!=null) {
+ LOG.info("Created a new FrameTranslator to convert "+header);
+ jmsFrameTranslators.put(header,translator);
+ }else {
+ LOG.error("Failed in creating FrameTranslator to convert "+header);
+ }
+ }
} else {
if (destination != null && (advisory || AdvisorySupport.isAdvisoryTopic(destination))) {
translator = new JmsFrameTranslator();
@@ -197,6 +209,8 @@ public class ProtocolConverter {
}
} catch (Exception ignore) {
// if anything goes wrong use the default translator
+ LOG.debug("Failed in getting a FrameTranslator to convert ", ignore);
+ translator = frameTranslator;
}
if (translator instanceof BrokerContextAware) {