You might have already explained this,  but… why is beforeCompletion() called 
before handleReleased()?  If that’s happening, I’d expect something is wrong.  
However, I haven’t looked at this code in years.

thanks!
David Jencks

> On Sep 3, 2019, at 12:27 PM, Jonathan S. Fisher <[email protected]> wrote:
> 
> Two more updates:
> 
> For the log message, it looks like beforeCompletion() Is being called
> before handleReleased(), leading to that warning. I ran a couple thousand
> messages through and took a heap dump and didn't get any leak suspects, so
> I think it's working correctly despite the warning. I'll add that to my
> existing PR with your tests.
> 
> Second, on my 10K messages test, it looks like it might be Arquillian
> crashing, not TomEE. I'm going to try the same test but without Arquillian,
> just deploy those classes to a server and see what happens.
> 
> On Tue, Sep 3, 2019 at 10:54 AM Jonathan S. Fisher <[email protected]>
> wrote:
> 
>> If I bump the number of messages up to 10k or so I get a VM Crash... I
>> cannot figure out how to get arquillian to give me a heap dump on exit
>> though.
>> 
>> On Tue, Sep 3, 2019 at 10:01 AM Jonathan S. Fisher <[email protected]>
>> wrote:
>> 
>>> https://github.com/apache/tomee/pull/546/files
>>> 
>>> This passes consistently for me with no issues
>>> 
>>> On Tue, Sep 3, 2019 at 9:08 AM Jonathan S. Fisher <[email protected]>
>>> wrote:
>>> 
>>>> There are actually a few log messages we regularly ignore all the time
>>>> from the transaction manager ::wince face:: I'm not sure if we should be
>>>> concerned with that one.
>>>> 
>>>> On your test, first, how is the broker xml declared? Often something
>>>> that trips our newbies up to TomEE is having a persistent broker that is
>>>> storing messages between TomEE runs. The tricky thing is that the broker
>>>> store does always appear in /target, so it might not get cleaned up with
>>>> mvn clean install. As such, for local development we use this
>>>> URL: 
>>>> broker:(vm://localhost)?persistent=false&amp;deleteAllMessagesOnStartup=true.
>>>> Next, on JMSReceiverBean, you're missing transactionAttribute. Technically
>>>> it should work without it, but I'd add it just in case. Finally, I'd add a
>>>> small thread.sleep, or check to the queue length == 0 before doing your
>>>> assert on messagecounter. It could be you're beating the receiver bean to
>>>> the finish line. The default messaging mode is auto-ack, so technically the
>>>> message just has to be on the broker, it doesn't have to be processed
>>>> before your sender bean will return.
>>>> 
>>>> 
>>>> 
>>>> 
>>>> 
>>>> On Mon, Sep 2, 2019 at 2:28 PM Jonathan Gallimore <
>>>> [email protected]> wrote:
>>>> 
>>>>> In case it means anything to anyone, the unexpected output I'm getting
>>>>> is
>>>>> an abandoned connection notification:
>>>>> 
>>>>> WARNING: Transaction complete, but connection still has handles
>>>>> associated:
>>>>> ManagedConnectionInfo:
>>>>> org.apache.geronimo.connector.outbound.ManagedConnectionInfo@5b5a4aed.
>>>>> mc:
>>>>> 
>>>>> [org.apache.openejb.resource.activemq.jms2.TomEEManagedConnection@37e69c43
>>>>> ,ActiveMQConnection
>>>>> 
>>>>> {id=ID:MacBook-Pro.jlpsoftwareltd.net-50025-1567452049768-7:1,clientId=ID:MacBook-Pro.jlpsoftwareltd.net-50025-1567452049768-6:1,started=false}]]
>>>>> Abandoned connection information:
>>>>>  Connection handle opened at
>>>>> 
>>>>> org.apache.geronimo.connector.outbound.ConnectionInfo.setTrace(ConnectionInfo.java:119),
>>>>> 
>>>>> org.apache.geronimo.connector.outbound.ConnectionHandleInterceptor.getConnection(ConnectionHandleInterceptor.java:57),
>>>>> 
>>>>> org.apache.geronimo.connector.outbound.TCCLInterceptor.getConnection(TCCLInterceptor.java:39),
>>>>> 
>>>>> org.apache.geronimo.connector.outbound.ConnectionTrackingInterceptor.getConnection(ConnectionTrackingInterceptor.java:66),
>>>>> 
>>>>> org.apache.geronimo.connector.outbound.AbstractConnectionManager.allocateConnection(AbstractConnectionManager.java:81),
>>>>> 
>>>>> org.apache.activemq.ra.ActiveMQConnectionFactory.createConnection(ActiveMQConnectionFactory.java:94),
>>>>> 
>>>>> org.apache.activemq.ra.ActiveMQConnectionFactory.createConnection(ActiveMQConnectionFactory.java:67),
>>>>> 
>>>>> org.apache.openejb.resource.activemq.jms2.JMSContextImpl.connection(JMSContextImpl.java:83),
>>>>> 
>>>>> org.apache.openejb.resource.activemq.jms2.JMSContextImpl.session(JMSContextImpl.java:99),
>>>>> 
>>>>> org.apache.openejb.resource.activemq.jms2.JMSContextImpl.createQueue(JMSContextImpl.java:309),
>>>>> 
>>>>> org.apache.openejb.resource.activemq.jms2.cdi.JMS2CDIExtension$InternalJMSContext.createQueue(JMS2CDIExtension.java:371),
>>>>> 
>>>>> org.apache.openejb.arquillian.tests.jms.JMSSenderBean.sendToQueue(JMSSenderBean.java:37),
>>>>> 
>>>>> org.apache.openejb.arquillian.tests.jms.JMSSenderBean.sendToQueue(JMSSenderBean.java:33),
>>>>> sun.reflect.GeneratedMethodAccessor42.invoke(Unknown Source),
>>>>> 
>>>>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43),
>>>>> java.lang.reflect.Method.invoke(Method.java:498),
>>>>> 
>>>>> org.apache.openejb.core.interceptor.ReflectionInvocationContext$Invocation.invoke(ReflectionInvocationContext.java:205),
>>>>> 
>>>>> org.apache.openejb.core.interceptor.ReflectionInvocationContext.proceed(ReflectionInvocationContext.java:186),
>>>>> 
>>>>> org.apache.openejb.monitoring.StatsInterceptor.record(StatsInterceptor.java:191),
>>>>> 
>>>>> org.apache.openejb.monitoring.StatsInterceptor.invoke(StatsInterceptor.java:102),
>>>>> sun.reflect.GeneratedMethodAccessor35.invoke(Unknown Source),
>>>>> 
>>>>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43),
>>>>> java.lang.reflect.Method.invoke(Method.java:498),
>>>>> 
>>>>> org.apache.openejb.core.interceptor.ReflectionInvocationContext$Invocation.invoke(ReflectionInvocationContext.java:205),
>>>>> 
>>>>> org.apache.openejb.core.interceptor.ReflectionInvocationContext.proceed(ReflectionInvocationContext.java:186),
>>>>> 
>>>>> org.apache.openejb.core.interceptor.InterceptorStack.invoke(InterceptorStack.java:85),
>>>>> 
>>>>> org.apache.openejb.core.singleton.SingletonContainer._invoke(SingletonContainer.java:272),
>>>>> 
>>>>> org.apache.openejb.core.singleton.SingletonContainer.invoke(SingletonContainer.java:221),
>>>>> 
>>>>> org.apache.openejb.core.ivm.EjbObjectProxyHandler.synchronizedBusinessMethod(EjbObjectProxyHandler.java:265),
>>>>> 
>>>>> org.apache.openejb.core.ivm.EjbObjectProxyHandler.businessMethod(EjbObjectProxyHandler.java:260),
>>>>> 
>>>>> org.apache.openejb.core.ivm.EjbObjectProxyHandler._invoke(EjbObjectProxyHandler.java:89),
>>>>> 
>>>>> org.apache.openejb.core.ivm.BaseEjbProxyHandler.invoke(BaseEjbProxyHandler.java:347),
>>>>> 
>>>>> org.apache.openejb.arquillian.tests.jms.JMSSenderBean$$LocalBeanProxy.sendToQueue(org/apache/openejb/arquillian/tests/jms/JMSSenderBean.java),
>>>>> 
>>>>> org.apache.openejb.arquillian.tests.jms.JMSContextInjectionTest.testShouldSendAndReceiveMessages(JMSContextInjectionTest.java:61),
>>>>> sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method),
>>>>> 
>>>>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62),
>>>>> 
>>>>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43),
>>>>> java.lang.reflect.Method.invoke(Method.java:498),
>>>>> 
>>>>> org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50),
>>>>> 
>>>>> org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12),
>>>>> 
>>>>> org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47),
>>>>> org.jboss.arquillian.junit.Arquillian$8$1.invoke(Arquillian.java:379),
>>>>> 
>>>>> org.jboss.arquillian.container.test.impl.execution.LocalTestExecuter.execute(LocalTestExecuter.java:60),
>>>>> sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method),
>>>>> 
>>>>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62),
>>>>> 
>>>>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43),
>>>>> java.lang.reflect.Method.invoke(Method.java:498),
>>>>> 
>>>>> org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:96),
>>>>> 
>>>>> org.jboss.arquillian.core.impl.EventContextImpl.invokeObservers(EventContextImpl.java:103),
>>>>> 
>>>>> org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:85),
>>>>> org.jboss.arquillian.core.impl.ManagerImpl.fire(ManagerImpl.java:143),
>>>>> org.jboss.arquillian.core.impl.ManagerImpl.fire(ManagerImpl.java:114),
>>>>> org.jboss.arquillian.core.impl.EventImpl.fire(EventImpl.java:67),
>>>>> 
>>>>> org.jboss.arquillian.container.test.impl.client.protocol.local.LocalContainerMethodExecutor.invoke(LocalContainerMethodExecutor.java:50),
>>>>> 
>>>>> org.jboss.arquillian.container.test.impl.execution.RemoteTestExecuter.execute(RemoteTestExecuter.java:109),
>>>>> sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method),
>>>>> 
>>>>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62),
>>>>> 
>>>>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43),
>>>>> java.lang.reflect.Method.invoke(Method.java:498),
>>>>> 
>>>>> org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:96),
>>>>> 
>>>>> org.jboss.arquillian.core.impl.EventContextImpl.invokeObservers(EventContextImpl.java:103),
>>>>> 
>>>>> org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:85),
>>>>> org.jboss.arquillian.core.impl.ManagerImpl.fire(ManagerImpl.java:143),
>>>>> org.jboss.arquillian.core.impl.ManagerImpl.fire(ManagerImpl.java:114),
>>>>> org.jboss.arquillian.core.impl.EventImpl.fire(EventImpl.java:67),
>>>>> 
>>>>> org.jboss.arquillian.container.test.impl.execution.ClientTestExecuter.execute(ClientTestExecuter.java:57),
>>>>> sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method),
>>>>> 
>>>>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62),
>>>>> 
>>>>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43),
>>>>> java.lang.reflect.Method.invoke(Method.java:498),
>>>>> 
>>>>> org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:96),
>>>>> 
>>>>> org.jboss.arquillian.core.impl.EventContextImpl.invokeObservers(EventContextImpl.java:103),
>>>>> 
>>>>> org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:85),
>>>>> 
>>>>> org.apache.openejb.arquillian.common.TestObserver.switchLoader(TestObserver.java:98),
>>>>> 
>>>>> org.apache.openejb.arquillian.common.TestObserver.observesTest(TestObserver.java:75),
>>>>> sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method),
>>>>> 
>>>>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62),
>>>>> 
>>>>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43),
>>>>> java.lang.reflect.Method.invoke(Method.java:498),
>>>>> 
>>>>> org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:96),
>>>>> 
>>>>> org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:92),
>>>>> 
>>>>> org.jboss.arquillian.container.test.impl.client.ContainerEventController.createContext(ContainerEventController.java:142),
>>>>> 
>>>>> org.jboss.arquillian.container.test.impl.client.ContainerEventController.createTestContext(ContainerEventController.java:129),
>>>>> sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method),
>>>>> 
>>>>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62),
>>>>> 
>>>>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43),
>>>>> java.lang.reflect.Method.invoke(Method.java:498),
>>>>> 
>>>>> org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:96),
>>>>> 
>>>>> org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:92),
>>>>> 
>>>>> org.jboss.arquillian.test.impl.TestContextHandler.createTestContext(TestContextHandler.java:130),
>>>>> sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method),
>>>>> 
>>>>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62),
>>>>> 
>>>>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43),
>>>>> java.lang.reflect.Method.invoke(Method.java:498),
>>>>> 
>>>>> org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:96),
>>>>> 
>>>>> org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:92),
>>>>> 
>>>>> org.jboss.arquillian.test.impl.TestContextHandler.createClassContext(TestContextHandler.java:92),
>>>>> sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method),
>>>>> 
>>>>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62),
>>>>> 
>>>>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43),
>>>>> java.lang.reflect.Method.invoke(Method.java:498),
>>>>> 
>>>>> org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:96),
>>>>> 
>>>>> org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:92),
>>>>> 
>>>>> org.jboss.arquillian.test.impl.TestContextHandler.createSuiteContext(TestContextHandler.java:73),
>>>>> sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method),
>>>>> 
>>>>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62),
>>>>> 
>>>>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43),
>>>>> java.lang.reflect.Method.invoke(Method.java:498),
>>>>> 
>>>>> org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:96),
>>>>> 
>>>>> org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:92),
>>>>> org.jboss.arquillian.core.impl.ManagerImpl.fire(ManagerImpl.java:143),
>>>>> 
>>>>> org.jboss.arquillian.test.impl.EventTestRunnerAdaptor.test(EventTestRunnerAdaptor.java:136),
>>>>> org.jboss.arquillian.junit.Arquillian$8.evaluate(Arquillian.java:372),
>>>>> org.jboss.arquillian.junit.Arquillian$4.evaluate(Arquillian.java:246),
>>>>> org.jboss.arquillian.junit.Arquillian.multiExecute(Arquillian.java:431),
>>>>> org.jboss.arquillian.junit.Arquillian.access$200(Arquillian.java:55),
>>>>> org.jboss.arquillian.junit.Arquillian$5.evaluate(Arquillian.java:260),
>>>>> org.jboss.arquillian.junit.Arquillian$7$1.invoke(Arquillian.java:324),
>>>>> 
>>>>> org.jboss.arquillian.container.test.impl.execution.ClientBeforeAfterLifecycleEventExecuter.execute(ClientBeforeAfterLifecycleEventExecuter.java:99),
>>>>> 
>>>>> org.jboss.arquillian.container.test.impl.execution.ClientBeforeAfterLifecycleEventExecuter.on(ClientBeforeAfterLifecycleEventExecuter.java:72),
>>>>> sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method),
>>>>> 
>>>>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62),
>>>>> 
>>>>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43),
>>>>> java.lang.reflect.Method.invoke(Method.java:498),
>>>>> 
>>>>> org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:96),
>>>>> 
>>>>> org.jboss.arquillian.core.impl.EventContextImpl.invokeObservers(EventContextImpl.java:103),
>>>>> 
>>>>> org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:85),
>>>>> 
>>>>> org.apache.openejb.arquillian.common.TestObserver.switchLoader(TestObserver.java:98),
>>>>> 
>>>>> org.apache.openejb.arquillian.common.TestObserver.observesTest(TestObserver.java:75),
>>>>> sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method),
>>>>> 
>>>>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62),
>>>>> 
>>>>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43),
>>>>> java.lang.reflect.Method.invoke(Method.java:498),
>>>>> 
>>>>> org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:96),
>>>>> 
>>>>> org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:92),
>>>>> 
>>>>> org.jboss.arquillian.container.test.impl.client.ContainerEventController.createContext(ContainerEventController.java:142),
>>>>> 
>>>>> org.jboss.arquillian.container.test.impl.client.ContainerEventController.createBeforeContext(ContainerEventController.java:124),
>>>>> sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method),
>>>>> 
>>>>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62),
>>>>> 
>>>>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43),
>>>>> java.lang.reflect.Method.invoke(Method.java:498),
>>>>> 
>>>>> org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:96),
>>>>> 
>>>>> org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:92),
>>>>> 
>>>>> org.jboss.arquillian.test.impl.TestContextHandler.createTestContext(TestContextHandler.java:130),
>>>>> sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method),
>>>>> 
>>>>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62),
>>>>> 
>>>>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43),
>>>>> java.lang.reflect.Method.invoke(Method.java:498),
>>>>> 
>>>>> org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:96),
>>>>> 
>>>>> org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:92),
>>>>> 
>>>>> org.jboss.arquillian.test.impl.TestContextHandler.createClassContext(TestContextHandler.java:92),
>>>>> sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method),
>>>>> 
>>>>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62),
>>>>> 
>>>>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43),
>>>>> java.lang.reflect.Method.invoke(Method.java:498),
>>>>> 
>>>>> org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:96),
>>>>> 
>>>>> org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:92),
>>>>> 
>>>>> org.jboss.arquillian.test.impl.TestContextHandler.createSuiteContext(TestContextHandler.java:73),
>>>>> sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method),
>>>>> 
>>>>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62),
>>>>> 
>>>>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43),
>>>>> java.lang.reflect.Method.invoke(Method.java:498),
>>>>> 
>>>>> org.jboss.arquillian.core.impl.ObserverImpl.invoke(ObserverImpl.java:96),
>>>>> 
>>>>> org.jboss.arquillian.core.impl.EventContextImpl.proceed(EventContextImpl.java:92),
>>>>> org.jboss.arquillian.core.impl.ManagerImpl.fire(ManagerImpl.java:143),
>>>>> org.jboss.arquillian.core.impl.ManagerImpl.fire(ManagerImpl.java:114),
>>>>> 
>>>>> org.jboss.arquillian.test.impl.EventTestRunnerAdaptor.fireCustomLifecycle(EventTestRunnerAdaptor.java:159),
>>>>> org.jboss.arquillian.junit.Arquillian$7.evaluate(Arquillian.java:317),
>>>>> org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325),
>>>>> 
>>>>> org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78),
>>>>> 
>>>>> org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57),
>>>>> org.junit.runners.ParentRunner$3.run(ParentRunner.java:290),
>>>>> org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71),
>>>>> org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288),
>>>>> org.junit.runners.ParentRunner.access$000(ParentRunner.java:58),
>>>>> org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268),
>>>>> org.jboss.arquillian.junit.Arquillian$2.evaluate(Arquillian.java:205),
>>>>> org.jboss.arquillian.junit.Arquillian.multiExecute(Arquillian.java:431),
>>>>> org.jboss.arquillian.junit.Arquillian.access$200(Arquillian.java:55),
>>>>> org.jboss.arquillian.junit.Arquillian$3.evaluate(Arquillian.java:219),
>>>>> org.junit.runners.ParentRunner.run(ParentRunner.java:363),
>>>>> org.jboss.arquillian.junit.Arquillian.run(Arquillian.java:167),
>>>>> org.junit.runners.Suite.runChild(Suite.java:128),
>>>>> org.junit.runners.Suite.runChild(Suite.java:27),
>>>>> org.junit.runners.ParentRunner$3.run(ParentRunner.java:290),
>>>>> org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71),
>>>>> org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288),
>>>>> org.junit.runners.ParentRunner.access$000(ParentRunner.java:58),
>>>>> org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268),
>>>>> org.junit.runners.ParentRunner.run(ParentRunner.java:363),
>>>>> org.apache.maven.surefire.junitcore.JUnitCore.run(JUnitCore.java:55),
>>>>> 
>>>>> org.apache.maven.surefire.junitcore.JUnitCoreWrapper.createRequestAndRun(JUnitCoreWrapper.java:137),
>>>>> 
>>>>> org.apache.maven.surefire.junitcore.JUnitCoreWrapper.executeEager(JUnitCoreWrapper.java:107),
>>>>> 
>>>>> org.apache.maven.surefire.junitcore.JUnitCoreWrapper.execute(JUnitCoreWrapper.java:83),
>>>>> 
>>>>> org.apache.maven.surefire.junitcore.JUnitCoreWrapper.execute(JUnitCoreWrapper.java:75),
>>>>> 
>>>>> org.apache.maven.surefire.junitcore.JUnitCoreProvider.invoke(JUnitCoreProvider.java:157),
>>>>> 
>>>>> org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:386),
>>>>> 
>>>>> org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:323),
>>>>> org.apache.
>>>>> 
>>>>> Also, I see out by one errors - e.g. if I send 200 messages, sometimes I
>>>>> receive 201 or 199. Not sure if its related to the above warning or not.
>>>>> 
>>>>> Jon
>>>>> 
>>>>> On Mon, Sep 2, 2019 at 8:25 PM Jonathan Gallimore <
>>>>> [email protected]> wrote:
>>>>> 
>>>>>> I had a play around with this, and got my previously failing
>>>>>> JMSContextInjectionTest to work -- some of the time. (
>>>>>> 
>>>>> https://github.com/apache/tomee/blob/e58ff848a3a80938d4d99fc9bcfeaade5a72d644/arquillian/arquillian-tomee-tests/arquillian-tomee-jms-tests/src/test/java/org/apache/openejb/arquillian/tests/jms/JMSContextInjectionTest.java
>>>>>> ).
>>>>>> 
>>>>>> I'm getting some log output that I'm not expecting so I've rolled
>>>>> back my
>>>>>> removal of @Ignore so I can dig into it some more.
>>>>>> 
>>>>>> Jon
>>>>>> 
>>>>>> On Tue, Aug 27, 2019 at 5:36 PM Jonathan Gallimore <
>>>>>> [email protected]> wrote:
>>>>>> 
>>>>>>> Hi Jonathan
>>>>>>> 
>>>>>>> Thanks for this. I think I had run into some of the things you fixed
>>>>> I
>>>>>>> little while back. I'll take a look at your change later today.
>>>>> Happy for
>>>>>>> you to commit and I can review after, too. :)
>>>>>>> 
>>>>>>> Cheers
>>>>>>> 
>>>>>>> The other Jonathan
>>>>>>> 
>>>>>>> 
>>>>>>> On Tue, Aug 27, 2019 at 2:59 AM Jonathan S. Fisher <
>>>>> [email protected]>
>>>>>>> wrote:
>>>>>>> 
>>>>>>>> 
>>>>>>>> 
>>>>> https://github.com/exabrial/tomee/commit/08dd4c744818702f3be5edfd8a1c4cf2b69d524d
>>>>>>>> 
>>>>>>>> With these patches the JMS2.0 API works pretty well now :) If anyone
>>>>>>>> wants
>>>>>>>> to review, please go ahead, otherwise I'll commit them tomorrow.
>>>>>>>> 
>>>>>>>> cheers,
>>>>>>>> - [The other] Jonathan
>>>>>>>> 
>>>>>>>> On Mon, Aug 26, 2019 at 3:45 PM Jonathan S. Fisher <
>>>>> [email protected]>
>>>>>>>> wrote:
>>>>>>>> 
>>>>>>>>> I've narrowed down the problem to AutoConnectionTracker. It's not
>>>>>>>>> completing, which isn't allowing the connections to be returned
>>>>> to the
>>>>>>>> pool.
>>>>>>>>> 
>>>>>>>>> 
>>>>>>>> 
>>>>> https://github.com/apache/tomee/blob/master/container/openejb-core/src/main/java/org/apache/openejb/resource/AutoConnectionTracker.java#L174
>>>>>>>>> 
>>>>>>>>> getResource() is throwing an IllegalStateException. The JavaDoc (
>>>>>>>>> 
>>>>>>>> 
>>>>> https://docs.oracle.com/javaee/7/api/javax/transaction/TransactionSynchronizationRegistry.html#getResource-java.lang.Object-
>>>>>>>> )
>>>>>>>>> states it should throw an ISE if a current transaction is not
>>>>> Active.
>>>>>>>> The
>>>>>>>>> transaction is in the state ROLLED_BACK when AutoConnectionTracker
>>>>>>>> tries to
>>>>>>>>> call getResource().
>>>>>>>>> 
>>>>>>>>> I think the Geronimo implementation (
>>>>>>>>> 
>>>>>>>> 
>>>>> https://github.com/apache/geronimo-txmanager/blame/trunk/geronimo-transaction/src/main/java/org/apache/geronimo/transaction/manager/TransactionManagerImpl.java#L203
>>>>>>>> )
>>>>>>>>> maybe be a little too strict. The JTA Spec pdf doesn't offer exact
>>>>>>>> hints of
>>>>>>>>> which statuses (
>>>>>>>>> 
>>>>> https://docs.oracle.com/javaee/7/api/javax/transaction/Status.html)
>>>>>>>>> should be have getResource _not_ throw an ISE unfortunately. I was
>>>>>>>> thinking
>>>>>>>>> of changing Geronimo's implementation to check for anything
>>>>>>>>> but STATUS_UNKNOWN, and STATUS_NO_TRANSACTION.
>>>>>>>>> 
>>>>>>>>> The other way is to cast Transaction to the Geronimo
>>>>> implementation and
>>>>>>>>> use Geronimo specific APIs to get call getResource(). Do you guys
>>>>> have
>>>>>>>> any
>>>>>>>>> preference which route I should take to fix?
>>>>>>>>> 
>>>>>>>>> 
>>>>>>>>> On Mon, Aug 26, 2019 at 9:15 AM Jonathan S. Fisher <
>>>>> [email protected]
>>>>>>>>> 
>>>>>>>>> wrote:
>>>>>>>>> 
>>>>>>>>>> 
>>>>> https://github.com/exabrial/tomee-jms2-bug/tree/connection-pool-leak
>>>>>>>>>> 
>>>>>>>>>> Here's a project that reproduces the bug. This project
>>>>> intentionally
>>>>>>>>>> exceeds the transaction timeout (of 1s). Each invocation, the
>>>>>>>> connection is
>>>>>>>>>> not returned to the pool and eventually you run out, causing your
>>>>>>>>>> application to freeze.
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>> On Fri, Aug 23, 2019 at 2:37 PM Jonathan S. Fisher <
>>>>>>>> [email protected]>
>>>>>>>>>> wrote:
>>>>>>>>>> 
>>>>>>>>>>> Hello Apache friends :) I have a question about the JTA and
>>>>> JMS/RA
>>>>>>>> specs:
>>>>>>>>>>> 
>>>>>>>>>>> If you borrow something from a RA, like a JMS Connection, and
>>>>> you're
>>>>>>>> in
>>>>>>>>>>> XA Transaction, is it necessary to call connection.close()? It
>>>>> would
>>>>>>>> seem
>>>>>>>>>>> JTA should be smart enough to know the connection is enrolled
>>>>> for 2
>>>>>>>> phase
>>>>>>>>>>> commit and should be smart enough to close it, but I'm not sure
>>>>> if
>>>>>>>> that's
>>>>>>>>>>> part of the spec.
>>>>>>>>>>> 
>>>>>>>>>>> In TomEE 7.0.6 we're noticing that if you borrow a JMS
>>>>> Connection
>>>>>>>> with
>>>>>>>>>>> connectionFactory.createConnection(), and your code fails to
>>>>> call
>>>>>>>> close()
>>>>>>>>>>> before the transaction completion, the connection leaks. (And
>>>>>>>>>>> unfortunately, calling close() after the transaction completes
>>>>>>>> doesn't
>>>>>>>>>>> mitigate the problem). It took awhile for us to track this down.
>>>>>>>>>>> 
>>>>>>>>>>> This becomes a huge problem if you're calling external services
>>>>> in
>>>>>>>> your
>>>>>>>>>>> transaction. Let's say you have a reasonable transaction
>>>>> timeout of
>>>>>>>> 30s
>>>>>>>>>>> set. You call three services, and they end up taking 15s a
>>>>> piece.
>>>>>>>> Even if
>>>>>>>>>>> you're doing the right thing and you have connection.close() in
>>>>> a
>>>>>>>> finally
>>>>>>>>>>> block, because your transaction isn't active when you call
>>>>> close, it
>>>>>>>> leaks
>>>>>>>>>>> and it just gets "stuck" as an active connection, which
>>>>> eventually
>>>>>>>> you hit
>>>>>>>>>>> the pool limit and your app freezes.
>>>>>>>>>>> 
>>>>>>>>>>> On a separate note, we noticed if you open a connection outside
>>>>> of
>>>>>>>> the
>>>>>>>>>>> scope of a transaction, then start a transaction, then create a
>>>>>>>> session
>>>>>>>>>>> with session_transacted option, the session does not
>>>>> participate in
>>>>>>>> the JTA
>>>>>>>>>>> (which seems out of spec). One most open the connection inside
>>>>> the
>>>>>>>>>>> transaction, AND open the session in the transaction, and close
>>>>> the
>>>>>>>>>>> connection in the transaction for everything to work.
>>>>>>>>>>> 
>>>>>>>>>>> I'll get a reproducing project created, but I was curious if
>>>>> anyone
>>>>>>>> knew
>>>>>>>>>>> offhand what the spec says.
>>>>>>>>>>> 
>>>>>>>>>>> cheers, and thanks,
>>>>>>>>>>> -[the other] Jonathan
>>>>>>>>>>> 
>>>>>>>>>>> --
>>>>>>>>>>> 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.
>>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>> --
>>>>>>>>>> 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.
>>>>>>>>>> 
>>>>>>>>> 
>>>>>>>>> 
>>>>>>>>> --
>>>>>>>>> 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.
>>>>>>>>> 
>>>>>>>> 
>>>>>>>> 
>>>>>>>> --
>>>>>>>> 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.
>>>>>>>> 
>>>>>>> 
>>>>> 
>>>> 
>>>> 
>>>> --
>>>> 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.
>>>> 
>>> 
>>> 
>>> --
>>> 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.
>>> 
>> 
>> 
>> --
>> 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.
>> 
> 
> 
> -- 
> 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.

Reply via email to