]
Cody Lerum commented on WFLY-9529:
----------------------------------
Temp workaround for me is as follows
*Original*
{code:java}
import java.io.Serializable;
import javax.annotation.Resource;
import javax.inject.Inject;
import javax.jms.JMSContext;
import javax.jms.Topic;
import javax.transaction.Transactional;
import javax.transaction.Transactional.TxType;
public class EntityUpdatedMessageSender implements Serializable {
private static final long serialVersionUID = 1L;
@Inject
private JMSContext jmsContext;
@Resource(lookup = JMSResources.ENTITY_UPDATED_TOPIC)
private Topic topic;
@Transactional(value = TxType.REQUIRES_NEW)
public void send(VersionedEntity entity) {
jmsContext.createProducer().send(topic, new EntityUpdate(entity));
}
}
{code}
*Workaround*
{code:java}
import java.io.Serializable;
import javax.annotation.Resource;
import javax.jms.ConnectionFactory;
import javax.jms.JMSContext;
import javax.jms.Topic;
import javax.transaction.Transactional;
import javax.transaction.Transactional.TxType;
public class EntityUpdatedMessageSender implements Serializable {
private static final long serialVersionUID = 1L;
@Resource
private ConnectionFactory connectionFactory;
@Resource(lookup = JMSResources.ENTITY_UPDATED_TOPIC)
private Topic topic;
@Transactional(value = TxType.REQUIRES_NEW)
public void send(VersionedEntity entity) {
try (JMSContext context = connectionFactory.createContext()) {
context.createProducer().send(topic, new EntityUpdate(entity));
}
}
}
{code}
Using injected JMS in a background task/thread leads to
NameNotFoundException: java:comp/TransactionSynchronizationRegistry
---------------------------------------------------------------------------------------------------------------------------
Key: WFLY-9529
URL:
https://issues.jboss.org/browse/WFLY-9529
Project: WildFly
Issue Type: Bug
Components: CDI / Weld, JMS, Naming
Affects Versions: 14.0.1.Final, 10.1.0.Final, 11.0.0.Final, 12.0.0.Final,
13.0.0.Final
Environment: Running on Windows 10, Java 64-bit 1.8.0_131
Reporter: Scott Van Wart
Assignee: Eduardo Martins
Priority: Major
Labels: ActiveMQ, jms, transaction
Attachments: injected-jms.zip, injected-jms2.zip, wildfly-11-injected-jms.txt
If I try to use an @Injected JMSContext while executing within a background task
(ManagedExecutorService) or thread (ManagedThreadFactory), I get the attached stacktrace.
I've experienced this a number of times with Wildfly 10.1.0, including messages sent
in Infinispan's expiry task thread.
My original workaround was to submit an additional task on a separate thread to send the
message, then wait for it to complete. That seemed unreliable (sometimes it would still
produce NameNotFoundException). I've resorted to creating my own JMSContext by using
@Resource( lookup="java:/ConnectionFactory" ) and sending messages that way.
Both workarounds prevent the message sending logic from participating in any ongoing
transactions.
I'm also attaching a sample EAR project. It can be built with Maven. It creates a
background task that waits 3 seconds and then tries to send a JMS message in a new
transaction using an injected JMS context. I use the standalone-full.xml profile to run
it.