[jboss-jira] [JBoss JIRA] (WFLY-9529) Using injected JMS in a background task/thread leads to NameNotFoundException: java:comp/TransactionSynchronizationRegistry

Cody Lerum (Jira) issues at jboss.org
Thu Dec 13 12:12:01 EST 2018


    [ https://issues.jboss.org/browse/WFLY-9529?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13674472#comment-13674472 ] 

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.



--
This message was sent by Atlassian Jira
(v7.12.1#712002)


More information about the jboss-jira mailing list