Just curious, try this: final Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
and/or try this: <Resource id="MyJmsConnectionFactory" type="javax.jms.ConnectionFactory"> ResourceAdapter = MyJmsResourceAdapter transactionSupport=none </Resource> On Mon, Sep 30, 2019 at 8:53 PM Ihsan Ecemis <miece...@gmail.com> wrote: > > Thanks for digging into this Jon (and pointing my attention toward that > other paragraph in the Javadoc) > > And I highly appreciated the try-with-resources workaround. > > > > On Sep 30, 2019, at 17:11, Jonathan Gallimore < > jonathan.gallim...@gmail.com> wrote: > > > >> 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--> > > > > Good question. The changes in this area between 8.0.0-M3 and 8.0.0, are, > > you'll be unsurprised to find out, around transaction handling. We need > to > > dig in a bit further. > > > > The Javadoc also states this: "Closing a connection causes any of its > > sessions' transactions in progress to be rolled back. In the case where a > > session's work is coordinated by an external transaction manager, a > > session's commit and rollback methods are not used and the result of a > > closed session's work is determined later by the transaction manager. > > Closing a connection does NOT force an acknowledgment of > > client-acknowledged sessions." > > > > A lot of this describes standalone usage, as opposed to usage in an > > application server. The Connection object should actually be a proxy, and > > calling close() shouldn't actually do anything. The sendMessage() method > on > > the CustomJmsService bean is transactional, and the connection should be > > returned back to the pool once the method completes and the transaction > is > > committed. > > > > Thank you for the sample code, we should be able to debug through and see > > what's going on. I should be able to do this over the next day - I'll > post > > my steps here in case you want to dig in and have a go yourself. > > > > Jon > > > > On Mon, Sep 30, 2019 at 6:32 PM Ihsan Ecemis <miece...@gmail.com> wrote: > > > >> > >> 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); > >>>> } > >>>> } > >>>> } > >>>> > >>>> > >>>> > >> > >> > > -- Jonathan | exabr...@gmail.com Pessimists, see a jar as half empty. Optimists, in contrast, see it as half full. Engineers, of course, understand the glass is twice as big as it needs to be.