1

所以我有这个发布到 JMS 主题的代码:

    public void notifyCreateListeners(MyCreatedObject payload) {
    logger.trace("ServiceImpl.notifyCreateListeners");
    TopicConnection conn = null;
    TopicSession session = null;
    Topic topic = null;

    try {
        Properties props = new Properties();
        props.setProperty("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory");
        props.setProperty("java.naming.factory.url.pkgs","org.jboss.naming");
        props.setProperty("java.naming.provider.url", "jnp://localhost:49227");
        Context context = new InitialContext(props);
        TopicConnectionFactory tcf = (TopicConnectionFactory) context.lookup("/ConnectionFactory");
        conn = tcf.createTopicConnection(JbossJaasAuthenticator.principal, JbossJaasAuthenticator.credentials);
        topic = (Topic)context.lookup("topic/create_notify_topic");
        session = conn.createTopicSession(false, TopicSession.AUTO_ACKNOWLEDGE);
        conn.start();
        TopicPublisher send = session.createPublisher(topic);
        ObjectMessage message = session.createObjectMessage();
        message.setObject(payload);
        send.publish(message);
        conn.close();
    } catch (Exception e) {
        logger.error("an exception occurred notifying create listeners", e);
    }
}

我通过 SOAP 不断地调用这段代码,它执行得相当快,不超过 1-2 秒。但是,我遇到的问题是,有时此代码会挂在“send.publish(message)”上,并且可能需要很长时间,从 5 到 15 分钟,最终会完成或被事务收割者杀死:

[2015-04-01 11:38:00,198] WARN  com.arjuna.ats.arjuna.logging.arjLoggerI18N [com.arjuna.ats.arjuna.coordinator.BasicAction_40] - Abort called on already aborted atomic action -6ec596b6:e039:551a4e56:ff03b 
[2015-04-01 11:38:00,206] ERROR org.jboss.ws.core.jaxws.SOAPFaultHelperJAXWS SOAP request exception 
javax.ejb.EJBTransactionRolledbackException: Transaction rolled back

......

Caused by: javax.transaction.RollbackException: [com.arjuna.ats.internal.jta.transaction.arjunacore.inactive] [com.arjuna.ats.internal.jta.transaction.arjunacore.inactive] The transaction is not active!

奇怪的是我不使用这种方法的事务,我用之前的方法确认了这一点,其中“MyCreatedObject”是在数据库中创建的,所以我不知道哪个事务是收割者杀死的。

问题 1:如何确定 reaper 正在杀死哪个事务?我在“com.arjuna”上启用了跟踪,但没有打印出任何有用的信息。

问题 2:如何导致 send 方法超时?我尝试将 TopicPublisher 上的 timeToLive 设置为 120000(2 分钟),但似乎没有效果。

最终,对我来说理想的是确定为什么会延迟发布到主题,以及我如何通过设置某种超时来干预此发布,因为这部分并不重要,这意味着我不希望如果发布失败,整个 SOAP 调用以错误结束,我只想记录一个错误并让它成功完成。我正在考虑在另一个线程中调用此“notifyCreateListeners”方法,我将在一段时间后将其杀死(如果它仍然处于活动状态)。这是一个可行的解决方案,还是您可以推荐其他方法?

4

0 回答 0