2013-10-08 3 views
1

Итак, у меня есть 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(); 

     } 
    } 

ответ

2

Ну что вы знаете ... я получил ответ на свой вопрос в самом вопросе. Комментарии в bloglink, упомянутые в вопросе, также сказали, что мне нужно иметь конкретную банку jaxb.

комментарий, который дал мой ответ

FYI эта проблема не происходит с JAXB-осущ 2.2.4 и новее (хотя и не уверен, что в какой версии именно она была изменена) .so теперь вы может использовать либо последний JDK 7u7 (который должен содержать jaxb-impl 2.2.4) , либо добавить jaxb-impl 2.2.6 в ваш проект. Это все еще происходит с JDK 6u35 (который имеет 2.1.10 согласно http://jaxb.java.net/guide/Which_JAXB_RI_is_included_in_which_JDK_.html). Последнюю информацию об этом на JBoss 7.1.1, которая не связывает Jaxb-impl 2.2.4). Затем вы можете использовать старый способ и не нужно реализовывать кеш для JAXBContext, чтобы избежать повторной загрузки классов.

Я использую jaxb2.2.4 jar..So включая jaxb2.2.6 банку решить мою проблему, и думает, что .. Это уменьшенное мое использование процессора для простой 30% и обрабатывается сообщений очереди всего менее 1 мин. :)

+0

Проголосуйте, если вы сочтете это полезным :) – DarkHorse

Смежные вопросы