That's interesting. We'll see if we can create some test cases for these
different scenarios.

Jon

On Thu, Oct 10, 2019 at 4:55 PM Ihsan Ecemis <miece...@gmail.com> wrote:

>
> Sorry I just had time to make these experiments.
>
> Having the following (setting transacted = false) did not fix the problem
> if we do not use try-with-resources:
>
> final Session session = connection.createSession(false,
> Session.AUTO_ACKNOWLEDGE);
>
>
> On the other hand, when we added transactionSupport=none to resources.xml,
> we could dequeue only 1 message, which is weird  (at each server restart,
> we dequeue 1 message even though there are more message in the queue.
> Reverting the code back to try-with-resources  makes the server dequeue all
> the messages)
>
>
> Hope that would help you guys find out where the problem is.
>
>
>
> > On Oct 1, 2019, at 16:42, Jonathan S. Fisher <exabr...@gmail.com> wrote:
> >
> > 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.
>
>

Reply via email to