Итак, у меня есть EAR, который читает сообщения из очереди JMS . По требованию сообщения представляют собой данные XML. Я прочитал данные из очереди, отменил его использование JAXB и сохранил данные xml в базе данных. Но весь этот процесс требует 90-95% использования моего процессора. Я продолжил изменения, предложенные в этом документе link, чтобы уменьшить использование моего процессора. Но даже после их реализации все еще используется 90% процессорного процессора до тех пор, пока все сообщения в очереди не будут обработаны.Сокращение использования ЦП для комбинированного приложения MDB-JMS-JAXB-Hibernate
примечание что я создал отдельный hibernatePersistance.jar, где я реализовал JAXB unmarshalling. Файл hibernate.cfg.xml также находится внутри банки. Является ли это тем, что, я думаю, может быть проблемой для высокого использования?
Имеет ли отдельная банка для сохранения, устанавливает и закрывает соединения с базой данных каждый раз, когда вызывается функция save(), которая может вызывать высокий уровень использования ЦП или что-то еще?
Вот код
**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);
}
}
Класс внутри Persistence 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();
}
}
Проголосуйте, если вы сочтете это полезным :) – DarkHorse