Well, beforeCompletion() is called as a result of commit() being called on the transaction, presumably by an EJB “interceptor”, and handleClosed() is called as a result of the “user level” connection being closed. I’m used to the latter being called by user code... perhaps with all the CDI and dependency injection I haven’t kept up with this is no longer the case?
Thanks. David Jencks Sent from my iPhone > On Sep 3, 2019, at 3:25 PM, Jonathan S. Fisher <exabr...@gmail.com> wrote: > > Honestly I have no idea. And the interface specification is silent > unfortunately: > https://github.com/apache/geronimo-txmanager/blob/trunk/geronimo-connector/src/main/java/org/apache/geronimo/connector/outbound/connectiontracking/ConnectionTracker.java > > On Tue, Sep 3, 2019 at 3:32 PM David Jencks <david.a.jen...@gmail.com> > wrote: > >> 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 <exabr...@gmail.com> >> 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 <exabr...@gmail.com> >>> 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 <exabr...@gmail.com> >>>> 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 <exabr...@gmail.com> >>>>> 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&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 < >>>>>> jonathan.gallim...@gmail.com> 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 < >>>>>>> jonathan.gallim...@gmail.com> 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 < >>>>>>>> jonathan.gallim...@gmail.com> 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 < >>>>>>> exabr...@gmail.com> >>>>>>>>> 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 < >>>>>>> exabr...@gmail.com> >>>>>>>>>> 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 < >>>>>>> exabr...@gmail.com >>>>>>>>>>> >>>>>>>>>>> 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 < >>>>>>>>>> exabr...@gmail.com> >>>>>>>>>>>> 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 | 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. >>>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> -- >>>>>>>>>>>> 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. >>>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> -- >>>>>>>>>>> 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. >>>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> -- >>>>>>>>>> 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. >>>>>>>>>> >>>>>>>>> >>>>>>> >>>>>> >>>>>> >>>>>> -- >>>>>> 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. >>>>>> >>>>> >>>>> >>>>> -- >>>>> 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. >>>>> >>>> >>>> >>>> -- >>>> 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. >>>> >>> >>> >>> -- >>> 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. >> >> > > -- > 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.