所以我有一个EAR从 JMS 队列中读取消息。根据要求,消息是XML数据。我从队列中读取数据,使用JAXB解组并将xml数据保存到数据库中。但是整个过程需要 90-95%的使用率。我跟进了此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();
}
}
答案 0 :(得分:2)
那么你知道什么......我得到了问题的答案。问题中提到的bloglink中的评论也告诉我需要特定的jaxb jar。
评论给出了我的答案
仅供参考,jaxb-impl 2.2.4及更新版本不会出现此问题 (虽然不确定在哪个版本中确切地改变了。)现在你 可以使用最新的JDK 7u7(应该包含jaxb-impl 2.2.4) 或者将jaxb-impl 2.2.6添加到您的项目中。它仍然发生在JDK 6u35上 (根据2.1.10有2.1.10) http://jaxb.java.net/guide/Which_JAXB_RI_is_included_in_which_JDK_.html)。 最后一个信息不会发生在捆绑jaxb-impl的JBoss 7.1.1上 2.2.4)。然后你可以使用旧的方式,不需要为JAXBContext实现任何缓存,以避免重复的类加载。
我正在使用jaxb2.2.4 jar ..包括jaxb2.2.6 jar解决了我的问题并猜测是什么..它将我的CPU使用率降低到 30%并处理 500 < / strong>队列消息的时间不到 1分钟:)