gpt4 book ai didi

java - 减少 MDB-JMS-JAXB-Hibernate 组合应用程序的 CPU 使用率

转载 作者:行者123 更新时间:2023-11-30 04:12:40 25 4
gpt4 key购买 nike

所以我有一个 EAR,可以从 JMS 队列中读取消息。根据要求,消息是 XML 数据。我从队列中读取数据,使用 JAXB 对其进行解码并将 xml 数据保存到数据库中。但整个过程占用了我 90-95% 的 CPU。我跟进了此 link 中建议的更改从而减少我的CPU使用率。但即使在实现这些之后,它仍然使用 90% 的 mu CPU,直到处理队列中的所有消息。

注意,我创建了一个单独的 hibernatePersistance.jar,在其中实现了 JAXB 解码。 hibernate.cfg.xml 文件也在 jar 内。我认为这可能是高使用率的问题吗?

每次调用 save() 函数时,是否有一个单独的 jar 用于持久性建立和关闭数据库连接,这可能会导致 CPU 使用率过高或其他问题?

这是代码

**MDB Listener Class**

/**
* @see MessageListener#onMessage(Message)
*/
public void onMessage(Message message) {
try {
if (message instanceof BytesMessage) {
BytesMessage bytesMessage = (BytesMessage) message;
StringBuffer buffer = new StringBuffer();
for (int i = 0; i < (int) bytesMessage.getBodyLength(); i++) {
buffer.append((char) bytesMessage.readByte());
}
String cbeXml = buffer.toString().trim();
persistAuditMessage(cbeXml);
} else if (message instanceof TextMessage) {
TextMessage textMessage = (TextMessage) message;
persistAuditMessage(textMessage.getText());
}

} catch (JMSException e) {
e.printStackTrace();
} catch (Exception jmse) {
jmse.printStackTrace();
}
}

private void persistAuditMessage(String auditMessage) {
// for without Session Bean Call
count++;
if (auditMessage != null && auditMessage.trim().length() != 0) {
MarshalImpl impl = new MarshalImpl();
impl.saveCbeXml(auditMessage);

}


}

持久性 JAR 中的类

public class MarshalImpl extends AbstractHibernateLayar<BaseEvent, Long> implements Marshal {

private static Logger logger = LoggerFactory.getLogger(MarshalImpl.class);
private static JAXBContext context = null;

public static synchronized JAXBContext createJAXBContext() throws JAXBException {
if (context == null) {
System.out.println("Creating jaxb context");
context = JAXBContext.newInstance(BaseEvents.class.getPackage().getName());
}
return context;
}




public MarshalImpl() {
super();
}


@Override
public void saveCbeXml(String auditMessage) {
try {



Unmarshaller unmarshaller = createJAXBContext().createUnmarshaller();
@SuppressWarnings("unchecked")
JAXBElement<BaseEvents> root = (JAXBElement<BaseEvents>) unmarshaller.unmarshal(new StreamSource(new StringReader(auditMessage)));
List<BaseEvent> baseEvent = root.getValue().getCommonBaseEvent();
// Persist BaseEvent one by one
for (BaseEvent event : baseEvent) {
event.setSequenceNumber(new Long(1));// Indicate Working Flag
event.setCreationTimeItem(new Date());
save(event);

}

} catch (Exception e) {
logger.error("MarshalImpl::saveCbeXml::CBE Records not inserted!!::" + e.getMessage(), e);
} finally {
System.gc();

}
}

最佳答案

那么你知道什么...我得到了我的问题的答案。 bloglink中的评论问题中提到的还告诉我需要有特定的 jaxb jar。

给出我答案的评论

FYI this problem does not happen with jaxb-impl 2.2.4 and newer (though not sure in which version exactly it was changed).So now you can either use latest JDK 7u7 (which should contain jaxb-impl 2.2.4) or add jaxb-impl 2.2.6 to your project. It still happens with JDK 6u35 (which has 2.1.10 according to http://jaxb.java.net/guide/Which_JAXB_RI_is_included_in_which_JDK_.html). Last info it does not happen on JBoss 7.1.1 which bundles jaxb-impl 2.2.4). Then you can use old way and no need to implement any cache for JAXBContext to avoid repeated class loading.

我使用的是 jaxb2.2.4 jar..所以包含 jaxb2.2.6 jar 解决了我的问题,你猜怎么着..它将我的 CPU 使用率减少到仅仅30%,并且处理了500 在不到 1 分钟的时间内将消息排队:)

关于java - 减少 MDB-JMS-JAXB-Hibernate 组合应用程序的 CPU 使用率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19245657/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com