mirror of https://github.com/apache/activemq.git
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 <Murali.Mogalayapalli@tylertech.com>
This commit is contained in:
parent
e13abcf523
commit
0c00e1b791
|
@ -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
|
||||
// -------------------------------------------------------------------------
|
||||
|
|
|
@ -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) {
|
||||
|
|
Loading…
Reference in New Issue