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

标签 java hibernate jaxb jms message-driven-bean

所以我有一个 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/

相关文章:

Java - GIF 到 base64 字符串

java - JSF + Hibernate 网络应用开发环境

java - 将 MOXy 的元数据与实现 java.util.Map 的类一起使用时的 NPE

java - 尝试使用 java 应用程序连接 mySQL 数据库一直遇到困难

java - Java 中的序列化问题

java - Spring Boot 不从 application.properties 加载用户名

java - 乐观锁定 - Hibernate 和 EJB - 使用 HQL 批量更新

java - 支持使用 JAXB 进行 XSD 版本控制

java - 在 JAR 中组织 XSD

java - 为什么有些标识符在java中是非法的?