所以我有这个发布到 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”方法,我将在一段时间后将其杀死(如果它仍然处于活动状态)。这是一个可行的解决方案,还是您可以推荐其他方法?