1

したがって、 JMSキューからメッセージを読み取る EAR があります。要件により、メッセージは XML データです。キューからデータを読み取り、JAXB を使用してアンマーシャリングし、xml データをデータベースに保存します。しかし、このプロセス全体で CPU の90 ~ 95% が使用されます。CPU使用率を減らすために、このリンクで提案されている変更をフォローアップしました。ただし、それらを実装した後でも、キュー内のすべてのメッセージが処理されるまで、mu CPU の 90% を使用します。

JAXB アンマーシャリングを実装した別の hibernatePersistance.jar を作成したことに注意してください。hibernate.cfg.xml ファイルも jar 内にあります。これは、使用率が高い場合の問題だと思いますか?

永続化のために個別の jar を使用すると、save() 関数が呼び出されるたびにデータベース接続が確立されて閉じられ、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);

        }


    }

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();

        }
    }
4

1 に答える 1