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 <[email protected]> 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 <
> [email protected]> 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 <[email protected]> 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 <
> >> [email protected]> 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 <[email protected]>
> 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 | [email protected]
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.