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) {