Thank you very much for your suggestion Jon,  adding 
connection.createSession(), session.createProducer(), and 
session.createConsumer() in the try-with-resources block  make things work 
again!


Is this a bug with TomEE 8.0.0?   Because Connection.close()’s Javadoc states 
the following:  There is no need to close the sessions, producers, and 
consumers of a closed connection.

Here is the link:  
https://docs.oracle.com/javaee/7/api/javax/jms/Connection.html#close-- 
<https://docs.oracle.com/javaee/7/api/javax/jms/Connection.html#close-->


And our original code, that did not close/auto-close Session, MessageProducer, 
and MessageConsumer objects worked fine since at least TomEE 7.0.2  (our git 
history shows that we had such a piece of code implemented in March 2017)



> On Sep 30, 2019, at 09:14, Jonathan Gallimore <jonathan.gallim...@gmail.com> 
> wrote:
> 
> Hi,
> 
> I'm wondering if this is because your send method isn't closing the
> producer and the session? I did try your code and I saw the issue. I turned
> it into an example, and added an Arquillian test:
> https://github.com/apache/tomee/pull/578
> 
> Note that I added the session, producer and consumer into the
> try-with-resources block so they are auto-closed at the end of the method.
> 
> Can you take a look and let me know what you think?
> 
> Jon
> 
> On Fri, Sep 27, 2019 at 6:05 PM Ihsan Ecemis <miece...@gmail.com> wrote:
> 
>> 
>> Hello Everyone,
>> 
>> We recently upgraded our staging environment from TomEE 8.0.0-M3 to 8.0.0
>> and things started to break.
>> 
>> After some troubleshooting, we realized that we cannot dequeue JMS
>> messages from our ActiveMQ server using MessageConsumers.
>> 
>> 
>> We dequeue messages in 2 different ways:  We use MessageDriven beans for
>> most of our queues.  But with some others, we periodically poll by creating
>> a MessageConsumer (please see the code below for that second case)
>> 
>> MessageDriven beans work without any problems but we cannot receive any
>> messages via MessageConsumers.  That same backend code is working fine with
>> 8.0.0-M3.
>> 
>> 
>> We tested this with different versions of ActiveMQ server (5.15.6, 5.15.9,
>> 5.15.10) but TomEE  8.0.0 did not work with any of them.
>> 
>> 
>> Below is redacted code snippets showing where we have the problem.
>> 
>> Any help will be greatly appreciated.   Please let me know if you have any
>> questions about our setup.
>> 
>> Thanks,
>> 
>> Ihsan.
>> 
>> 
>> 
>> @Stateless
>> public class LogService {
>> 
>>    @EJB
>>    private CustomJmsService customJmsService;
>> 
>>    @javax.ejb.Schedule(second = "*/30", minute = "*", hour = "*")
>>    public void pollLogQueue() throws Exception {
>>        final TextMessage logMessage =
>> customJmsService.receiveLogMessage(1000);
>>        if (logMessage != null) {
>>            persistLogMessages(logMessages);
>>        }
>>    }
>> }
>> 
>> @Stateless
>> public class CustomJmsService {
>> 
>>    @Resource(name = "logQueue")
>>    private Queue logQueue;
>> 
>>    public void sendLogMessage(final LogMessage message) {
>>        sendMessage(logQueue, message);
>>    }
>> 
>>    private void sendMessage(final Queue queue, final CustomJmsMessage
>> message) {
>>        try (final Connection connection =
>> connectionFactory.createConnection()) {
>>            connection.start();
>> 
>>            final Session session = connection.createSession(true,
>> Session.AUTO_ACKNOWLEDGE);
>>            final MessageProducer producer = session.createProducer(queue);
>>            final String serializedMessage =
>> CustomJsonProvider.toJson(message);
>>            final Message jmsMessage =
>> session.createTextMessage(serializedMessage);
>> 
>>            // This enqueues messages successfully with both 8.0.0-M3 and
>> 8.0.0
>>            producer.send(jmsMessage);
>>        } catch (final Exception e) {
>>            throw new RuntimeException("Caught exception from JMS when
>> sending a message", e);
>>        }
>>    }
>> 
>>    public TextMessage receiveLogMessage(final long receiveTimeoutMillis) {
>>        return receiveMessage(logQueue, receiveTimeoutMillis);
>>    }
>> 
>>    private TextMessage receiveMessage(final Queue queue, final long
>> receiveTimeoutMillis) {
>>        try (final Connection connection =
>> connectionFactory.createConnection()) {
>>            connection.start();
>> 
>>            final Session session = connection.createSession(true,
>> Session.AUTO_ACKNOWLEDGE);
>>            final MessageConsumer messageConsumer =
>> session.createConsumer(queue);
>>            final Message jmsMessage =
>> messageConsumer.receive(receiveTimeoutMillis);
>> 
>>            // PROBLEM: jmsMessage is always null with 8.0.0. This was
>> working with 8.0.0-M3
>>            if (jmsMessage == null) {
>>                return null;
>>            }
>> 
>>            return (TextMessage) jmsMessage;
>>        } catch (final Exception e) {
>>            throw new RuntimeException("Caught exception from JMS when
>> receiving a message", e);
>>        }
>>    }
>> }
>> 
>> 
>> 

Reply via email to