Using the ojdbc14-9.2.0.5.jar driver, connecting to a "Oracle9i Enterprise Edition Release 9.2.0.6.0 - Production" instance.
I have a feeling that something else is wrong, as I mentioned before I see hanging transactions when using the local adapter in local-tx mode. And when I ctrl-c G it corrupts the txlog each time... which is very bad IMO. I'm gonna turn up debug for everything, and get a threaddump... Weird thing is that I was able to get all local adapter in local-tx mode working yesterday... not sure how, but it did work, with no hanging remote calls... but then I tried the exact same configuration on my laptop at home, and it did nothing but hang. I'm starting to think this is a god must hate jason problem more than anything else :-( --jason On 2/6/06, lichtner <[EMAIL PROTECTED]> wrote: > > -3 should be javax.transaction.xa.XAException.XA_RMERR: > > http://java.sun.com/j2ee/1.4/docs/api/constant-values.html#javax.transaction > > Anyhow, you are not actually enlisting the oracle resource manager, so > that's a step in the right direction. > > I think that Geronimo is not printing the stack trace. If you can, maybe > add a printStackTrace() and recompile. > > What version of Oracle server and driver are you using? > > On Mon, 6 Feb 2006, Jason Dillon wrote: > > > And the plot thickens... this warning is issued before the exceptions > > are dumped: > > > > <snip> > > 21:21:23,050 WARN [Transaction] Unable to enlist XAResource > > [EMAIL PROTECTED], e > > rrorCode: -3 > > oracle.jdbc.xa.OracleXAException > > at oracle.jdbc.xa.OracleXAResource.checkError > > (OracleXAResource.java:1190) > > at oracle.jdbc.xa.client.OracleXAResource.start > > (OracleXAResource.java:311) > > at > > org.apache.geronimo.transaction.manager.WrapperNamedXAResource.start > > (WrapperNamedXAResource.java:86) > > at > > org.apache.geronimo.transaction.manager.TransactionImpl.enlistResource > > (TransactionImpl.java:166) > > at > > org.apache.geronimo.transaction.context.InheritableTransactionContext.en > > listResource(InheritableTransactionContext.java:92) > > at > > org.apache.geronimo.connector.outbound.TransactionEnlistingInterceptor.g > > etConnection(TransactionEnlistingInterceptor.java:53) > > at > > org.apache.geronimo.connector.outbound.TransactionCachingInterceptor.get > > Connection(TransactionCachingInterceptor.java:81) > > at > > org.apache.geronimo.connector.outbound.ConnectionHandleInterceptor.getCo > > nnection(ConnectionHandleInterceptor.java:43) > > at > > org.apache.geronimo.connector.outbound.TCCLInterceptor.getConnection > > (TCCLInterceptor.java:39) > > at > > org.apache.geronimo.connector.outbound.ConnectionTrackingInterceptor.get > > Connection(ConnectionTrackingInterceptor.java:66) > > at > > org.apache.geronimo.connector.outbound.AbstractConnectionManager.allocat > > eConnection(AbstractConnectionManager.java:57) > > at org.tranql.connector.jdbc.DataSource.getConnection > > (DataSource.java:56) > > at $javax.sql.DataSource$$FastClassByCGLIB$$6525cafd.invoke > > (<generated>) > > at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:149) > > at > > org.apache.geronimo.connector.ConnectorMethodInterceptor.intercept > > (ConnectorMethodInterceptor.java:53) > > at $javax.sql.DataSource$$EnhancerByCGLIB$ > > $4e89d0c0.getConnection(<generated>) > > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > > at sun.reflect.NativeMethodAccessorImpl.invoke > > (NativeMethodAccessorImpl.java:39) > > at sun.reflect.DelegatingMethodAccessorImpl.invoke > > (DelegatingMethodAccessorImpl.java:25) > > at java.lang.reflect.Method.invoke(Method.java:324) > > at > > org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection( > > AopUtils.java:282) > > at > > org.springframework.aop.framework.JdkDynamicAopProxy.invoke > > (JdkDynamicAopProxy.java:163) > > at $Proxy1.getConnection(Unknown Source) > > at > > org.springframework.orm.hibernate.LocalDataSourceConnectionProvider.getC > > onnection(LocalDataSourceConnectionProvider.java:75) > > at net.sf.hibernate.cfg.SettingsFactory.buildSettings > > (SettingsFactory.java:73) > > at net.sf.hibernate.cfg.Configuration.buildSettings > > (Configuration.java:1155) > > at net.sf.hibernate.cfg.Configuration.buildSessionFactory > > (Configuration.java:789) > > at > > org.springframework.orm.hibernate.LocalSessionFactoryBean.newSessionFact > > ory(LocalSessionFactoryBean.java:535) > > at > > org.springframework.orm.hibernate.LocalSessionFactoryBean.afterPropertie > > sSet(LocalSessionFactoryBean.java:470) > > at > > org.springframework.beans.factory.support.AbstractAutowireCapableBeanFac > > tory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1065) > > at > > org.springframework.beans.factory.support.AbstractAutowireCapableBeanFac > > tory.createBean(AbstractAutowireCapableBeanFactory.java:343) > > at > > org.springframework.beans.factory.support.AbstractAutowireCapableBeanFac > > tory.createBean(AbstractAutowireCapableBeanFactory.java:260) > > at > > org.springframework.beans.factory.support.AbstractBeanFactory.getBean > > (AbstractBeanFactory.java:221) > > at > > org.springframework.beans.factory.support.AbstractBeanFactory.getBean > > (AbstractBeanFactory.java:145) > > at > > org.springframework.beans.factory.support.AbstractAutowireCapableBeanFac > > tory.resolveReference(AbstractAutowireCapableBeanFactory.java:973) > > at > > org.springframework.beans.factory.support.AbstractAutowireCapableBeanFac > > tory.resolveValueIfNecessary(AbstractAutowireCapableBeanFactory.java: > > 911) > > at > > org.springframework.beans.factory.support.AbstractAutowireCapableBeanFac > > tory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:852) > > at > > org.springframework.beans.factory.support.AbstractAutowireCapableBeanFac > > tory.populateBean(AbstractAutowireCapableBeanFactory.java:680) > > at > > org.springframework.beans.factory.support.AbstractAutowireCapableBeanFac > > tory.createBean(AbstractAutowireCapableBeanFactory.java:325) > > at > > org.springframework.beans.factory.support.AbstractAutowireCapableBeanFac > > tory.createBean(AbstractAutowireCapableBeanFactory.java:260) > > at > > org.springframework.beans.factory.support.AbstractBeanFactory.getBean > > (AbstractBeanFactory.java:221) > > at > > org.springframework.beans.factory.support.AbstractBeanFactory.getBean > > (AbstractBeanFactory.java:145) > > at > > org.springframework.beans.factory.support.DefaultListableBeanFactory.pre > > InstantiateSingletons(DefaultListableBeanFactory.java:282) > > at > > org.springframework.context.support.AbstractApplicationContext.refresh > > (AbstractApplicationContext.java:317) > > at > > org.springframework.context.support.ClassPathXmlApplicationContext.<init > > >(ClassPathXmlApplicationContext.java:80) > > at > > org.springframework.context.support.ClassPathXmlApplicationContext.<init > > >(ClassPathXmlApplicationContext.java:65) > > at > > org.springframework.context.access.ContextJndiBeanFactoryLocator.createB > > eanFactory(ContextJndiBeanFactoryLocator.java:40) > > at > > org.springframework.beans.factory.access.JndiBeanFactoryLocator.useBeanF > > actory(JndiBeanFactoryLocator.java:68) > > at > > org.springframework.ejb.support.AbstractEnterpriseBean.loadBeanFactory > > (AbstractEnterpriseBean.java:115) > > at > > org.springframework.ejb.support.AbstractStatelessSessionBean.ejbCreate > > (AbstractStatelessSessionBean.java:63) > > at > > com.solidusnetworks.paycore.ach.model.merchant.service.MerchantViewServi > > ceBean$$FastClassByCGLIB$$e322b03a.invoke(<generated>) > > at org.openejb.slsb.EJBCreateMethod.execute > > (EJBCreateMethod.java:94) > > at org.openejb.dispatch.DispatchInterceptor.invoke > > (DispatchInterceptor.java:72) > > at > > org.apache.geronimo.naming.java.ComponentContextInterceptor.invoke > > (ComponentContextInterceptor.java:56) > > at org.openejb.ConnectionTrackingInterceptor.invoke > > (ConnectionTrackingInterceptor.java:81) > > at org.openejb.slsb.StatelessInstanceContext.ejbCreate > > (StatelessInstanceContext.java:168) > > at org.openejb.slsb.StatelessInstanceFactory.createInstance > > (StatelessInstanceFactory.java:74) > > at org.openejb.util.SoftLimitedInstancePool.acquire > > (SoftLimitedInstancePool.java:81) > > at org.openejb.slsb.StatelessInstanceInterceptor.invoke > > (StatelessInstanceInterceptor.java:84) > > at org.openejb.transaction.ContainerPolicy$TxRequired.invoke > > (ContainerPolicy.java:119) > > at > > org.openejb.transaction.TransactionContextInterceptor.invoke > > (TransactionContextInterceptor.java:80) > > at org.openejb.SystemExceptionInterceptor.invoke > > (SystemExceptionInterceptor.java:82) > > at org.openejb.GenericEJBContainer.invoke > > (GenericEJBContainer.java:238) > > at org.openejb.proxy.EJBMethodInterceptor.intercept > > (EJBMethodInterceptor.java:129) > > at org.openejb.proxy.SessionEJBLocalHome$$EnhancerByCGLIB$ > > $8d17d4ce.create(<generated>) > > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > > at sun.reflect.NativeMethodAccessorImpl.invoke > > (NativeMethodAccessorImpl.java:39) > > at sun.reflect.DelegatingMethodAccessorImpl.invoke > > (DelegatingMethodAccessorImpl.java:25) > > at java.lang.reflect.Method.invoke(Method.java:324) > > at > > com.solidusnetworks.paycore.ach.system.J2EEUtils.getLocalInstance > > (J2EEUtils.java:133) > > at > > com.solidusnetworks.paycore.ach.system.J2EEUtils.getMerchantViewServiceL > > ocal(J2EEUtils.java:248) > > at > > com.solidusnetworks.paycore.ach.business.pos.POSCheckServiceBean.ejbCrea > > te(POSCheckServiceBean.java:90) > > at > > com.solidusnetworks.paycore.ach.business.pos.POSCheckServiceBean$ > > $FastClassByCGLIB$$ac29a8c5.invoke(<generated>) > > at org.openejb.slsb.EJBCreateMethod.execute > > (EJBCreateMethod.java:94) > > at org.openejb.dispatch.DispatchInterceptor.invoke > > (DispatchInterceptor.java:72) > > at > > org.apache.geronimo.naming.java.ComponentContextInterceptor.invoke > > (ComponentContextInterceptor.java:56) > > at org.openejb.ConnectionTrackingInterceptor.invoke > > (ConnectionTrackingInterceptor.java:81) > > at org.openejb.slsb.StatelessInstanceContext.ejbCreate > > (StatelessInstanceContext.java:168) > > at org.openejb.slsb.StatelessInstanceFactory.createInstance > > (StatelessInstanceFactory.java:74) > > at org.openejb.util.SoftLimitedInstancePool.acquire > > (SoftLimitedInstancePool.java:81) > > at org.openejb.slsb.StatelessInstanceInterceptor.invoke > > (StatelessInstanceInterceptor.java:84) > > at org.openejb.transaction.ContainerPolicy$TxRequired.invoke > > (ContainerPolicy.java:140) > > at > > org.openejb.transaction.TransactionContextInterceptor.invoke > > (TransactionContextInterceptor.java:80) > > at org.openejb.SystemExceptionInterceptor.invoke > > (SystemExceptionInterceptor.java:82) > > at org.openejb.GenericEJBContainer.invoke > > (GenericEJBContainer.java:238) > > at org.openejb.server.ejbd.EjbRequestHandler.invoke > > (EjbRequestHandler.java:297) > > at org.openejb.server.ejbd.EjbRequestHandler.doEjbHome_CREATE > > (EjbRequestHandler.java:342) > > at org.openejb.server.ejbd.EjbRequestHandler.processRequest > > (EjbRequestHandler.java:205) > > at org.openejb.server.ejbd.EjbDaemon.service(EjbDaemon.java: > > 150) > > at org.openejb.server.ejbd.EjbServer.service(EjbServer.java:87) > > at org.openejb.server.ejbd.EjbServer$$FastClassByCGLIB$ > > $d379d2ff.invoke(<generated>) > > at net.sf.cglib.reflect.FastMethod.invoke(FastMethod.java:53) > > at org.apache.geronimo.gbean.runtime.FastMethodInvoker.invoke > > (FastMethodInvoker.java:38) > > at org.apache.geronimo.gbean.runtime.GBeanOperation.invoke > > (GBeanOperation.java:118) > > at org.apache.geronimo.gbean.runtime.GBeanInstance.invoke > > (GBeanInstance.java:800) > > at org.apache.geronimo.gbean.runtime.RawInvoker.invoke > > (RawInvoker.java:57) > > at > > org.apache.geronimo.kernel.basic.RawOperationInvoker.invoke > > (RawOperationInvoker.java:36) > > at > > org.apache.geronimo.kernel.basic.ProxyMethodInterceptor.intercept > > (ProxyMethodInterceptor.java:96) > > at org.activeio.xnet.ServerService$$EnhancerByCGLIB$ > > $944b9c52.service(<generated>) > > at org.activeio.xnet.ServicePool$2.run(ServicePool.java:67) > > at org.activeio.xnet.ServicePool$3.run(ServicePool.java:90) > > at org.apache.geronimo.pool.ThreadPool > > $ContextClassLoaderRunnable.run(ThreadPool.java:138) > > at EDU.oswego.cs.dl.util.concurrent.PooledExecutor$Worker.run > > (Unknown Source) > > at java.lang.Thread.run(Thread.java:552) > > </snip> > > > > I found this related to -3: > > > > http://bugs.caucho.com/view.php?id=180 > > > > Unfortunately its hard to search for "-3", and that is all the > > context I have to go from :-( > > > > --jason > > > > > > On Feb 6, 2006, at 5:17 PM, Jason Dillon wrote: > > > > > No love :-( > > > > > > When I configure both of my datasources to use the oracle xa adapter, > > > and use the xa adapter for activemq, I get exceptions like: > > > > > > <snip> > > > [2/6/06 16:35:17:456 PST] [ERROR] - > > > org.apache.geronimo.kernel.log.GeronimoLog.error(line:104) - > > > ORA-02089: COMMIT is not allowed in a subordinate session > > > > > > [2/6/06 16:35:17:458 PST] [ERROR] - > > > org.apache.geronimo.kernel.log.GeronimoLog.error(line:108) - Could not > > > execute query > > > java.sql.SQLException: ORA-02089: COMMIT is not allowed in a > > > subordinate session > > > > > > at oracle.jdbc.dbaccess.DBError.throwSqlException > > > (DBError.java:134) > > > at oracle.jdbc.ttc7.TTIoer.processError(TTIoer.java:289) > > > at oracle.jdbc.ttc7.Oall7.receive(Oall7.java:582) > > > at oracle.jdbc.ttc7.TTC7Protocol.doOall7(TTC7Protocol.java: > > > 1986) > > > at oracle.jdbc.ttc7.TTC7Protocol.parseExecuteDescribe > > > (TTC7Protocol.java:880) > > > at oracle.jdbc.driver.OracleStatement.doExecuteQuery > > > (OracleStatement.java:2516) > > > at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout > > > (OracleStatement.java:2850) > > > at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate > > > (OraclePreparedStatement.java:609) > > > at oracle.jdbc.driver.OraclePreparedStatement.executeQuery > > > (OraclePreparedStatement.java:537) > > > at > > > org.tranql.connector.jdbc.PreparedStatementHandle.executeQuery > > > (PreparedStatementHandle.java:49) > > > at net.sf.hibernate.impl.BatcherImpl.getResultSet > > > (BatcherImpl.java:87) > > > at net.sf.hibernate.loader.Loader.getResultSet(Loader.java: > > > 875) > > > at net.sf.hibernate.loader.Loader.doQuery(Loader.java:269) > > > at > > > net.sf.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections( > > > Loader.java:133) > > > at net.sf.hibernate.loader.Loader.doList(Loader.java:1033) > > > at net.sf.hibernate.loader.Loader.list(Loader.java:1024) > > > at net.sf.hibernate.hql.QueryTranslator.list > > > (QueryTranslator.java:854) > > > at net.sf.hibernate.impl.SessionImpl.find(SessionImpl.java: > > > 1544) > > > at net.sf.hibernate.impl.QueryImpl.list(QueryImpl.java:39) > > > at org.springframework.orm.hibernate.HibernateTemplate > > > $26.doInHibernate(HibernateTemplate.java:667) > > > at > > > org.springframework.orm.hibernate.HibernateTemplate.execute > > > (HibernateTemplate.java:312) > > > at org.springframework.orm.hibernate.HibernateTemplate.find > > > (HibernateTemplate.java:655) > > > at > > > com.solidusnetworks.paycore.util.hibernate.BaseDAOHibernate.find > > > (BaseDAOHibernate.java:423) > > > at > > > com.solidusnetworks.ach.oltp.dao.impl.NegativeFileDAOHibernate.findAct > > > iveNegativeFiles(NegativeFileDAOHibernate.java:394) > > > at > > > com.solidusnetworks.paycore.ach.model.negativefile.service.NegativeFil > > > eViewServiceBean.retrieveActiveGlobalAndMerchantNegativeFiles > > > (NegativeFileViewServiceBean.java:87) > > > at > > > com.solidusnetworks.paycore.ach.model.negativefile.service.NegativeFil > > > eViewServiceBean$$FastClassByCGLIB$$55b05efa.invoke(<generated>) > > > at org.openejb.dispatch.AbstractMethodOperation.invoke > > > (AbstractMethodOperation.java:90) > > > at org.openejb.slsb.BusinessMethod.execute > > > (BusinessMethod.java:67) > > > at org.openejb.dispatch.DispatchInterceptor.invoke > > > (DispatchInterceptor.java:72) > > > at > > > org.apache.geronimo.naming.java.ComponentContextInterceptor.invoke > > > (ComponentContextInterceptor.java:56) > > > at org.openejb.ConnectionTrackingInterceptor.invoke > > > (ConnectionTrackingInterceptor.java:81) > > > at org.openejb.transaction.ContainerPolicy$TxRequired.invoke > > > (ContainerPolicy.java:119) > > > at > > > org.openejb.transaction.TransactionContextInterceptor.invoke > > > (TransactionContextInterceptor.java:80) > > > at org.openejb.slsb.StatelessInstanceInterceptor.invoke > > > (StatelessInstanceInterceptor.java:98) > > > at org.openejb.transaction.ContainerPolicy$TxRequired.invoke > > > (ContainerPolicy.java:119) > > > at > > > org.openejb.transaction.TransactionContextInterceptor.invoke > > > (TransactionContextInterceptor.java:80) > > > at org.openejb.SystemExceptionInterceptor.invoke > > > (SystemExceptionInterceptor.java:82) > > > at org.openejb.GenericEJBContainer.invoke > > > (GenericEJBContainer.java:238) > > > at org.openejb.proxy.EJBMethodInterceptor.intercept > > > (EJBMethodInterceptor.java:129) > > > at org.openejb.proxy.SessionEJBLocalObject$$EnhancerByCGLIB$ > > > $c4231b05.retrieveActiveGlobalAndMerchantNegativeFiles(<generated>) > > > at > > > com.solidusnetworks.paycore.ach.business.pos.POSCheckServiceBean.retri > > > eveNegativeFileData(POSCheckServiceBean.java:414) > > > at > > > com.solidusnetworks.paycore.ach.business.pos.POSCheckServiceBean.check > > > ForNegativeFileAndDollarLimit(POSCheckServiceBean.java:300) > > > at > > > com.solidusnetworks.paycore.ach.business.pos.POSCheckServiceBean.autho > > > rize(POSCheckServiceBean.java:206) > > > at > > > com.solidusnetworks.paycore.ach.business.pos.POSCheckServiceBean$ > > > $FastClassByCGLIB$$ac29a8c5.invoke(<generated>) > > > at org.openejb.dispatch.AbstractMethodOperation.invoke > > > (AbstractMethodOperation.java:90) > > > at org.openejb.slsb.BusinessMethod.execute > > > (BusinessMethod.java:67) > > > at org.openejb.dispatch.DispatchInterceptor.invoke > > > (DispatchInterceptor.java:72) > > > at > > > org.apache.geronimo.naming.java.ComponentContextInterceptor.invoke > > > (ComponentContextInterceptor.java:56) > > > at org.openejb.ConnectionTrackingInterceptor.invoke > > > (ConnectionTrackingInterceptor.java:81) > > > at org.openejb.transaction.ContainerPolicy$TxRequired.invoke > > > (ContainerPolicy.java:119) > > > at > > > org.openejb.transaction.TransactionContextInterceptor.invoke > > > (TransactionContextInterceptor.java:80) > > > at org.openejb.slsb.StatelessInstanceInterceptor.invoke > > > (StatelessInstanceInterceptor.java:98) > > > at org.openejb.transaction.ContainerPolicy$TxRequired.invoke > > > (ContainerPolicy.java:140) > > > at > > > org.openejb.transaction.TransactionContextInterceptor.invoke > > > (TransactionContextInterceptor.java:80) > > > at org.openejb.SystemExceptionInterceptor.invoke > > > (SystemExceptionInterceptor.java:82) > > > at org.openejb.GenericEJBContainer.invoke > > > (GenericEJBContainer.java:238) > > > at org.openejb.server.ejbd.EjbRequestHandler.invoke > > > (EjbRequestHandler.java:297) > > > at > > > org.openejb.server.ejbd.EjbRequestHandler.doEjbObject_BUSINESS_METHOD( > > > EjbRequestHandler.java:325) > > > at org.openejb.server.ejbd.EjbRequestHandler.processRequest > > > (EjbRequestHandler.java:196) > > > at org.openejb.server.ejbd.EjbDaemon.service(EjbDaemon.java: > > > 150) > > > at org.openejb.server.ejbd.EjbServer.service(EjbServer.java: > > > 87) > > > at org.openejb.server.ejbd.EjbServer$$FastClassByCGLIB$ > > > $d379d2ff.invoke(<generated>) > > > at net.sf.cglib.reflect.FastMethod.invoke(FastMethod.java:53) > > > at > > > org.apache.geronimo.gbean.runtime.FastMethodInvoker.invoke > > > (FastMethodInvoker.java:38) > > > at org.apache.geronimo.gbean.runtime.GBeanOperation.invoke > > > (GBeanOperation.java:118) > > > at org.apache.geronimo.gbean.runtime.GBeanInstance.invoke > > > (GBeanInstance.java:800) > > > at org.apache.geronimo.gbean.runtime.RawInvoker.invoke > > > (RawInvoker.java:57) > > > at > > > org.apache.geronimo.kernel.basic.RawOperationInvoker.invoke > > > (RawOperationInvoker.java:36) > > > at > > > org.apache.geronimo.kernel.basic.ProxyMethodInterceptor.intercept > > > (ProxyMethodInterceptor.java:96) > > > at org.activeio.xnet.ServerService$$EnhancerByCGLIB$ > > > $944b9c52.service(<generated>) > > > at org.activeio.xnet.ServicePool$2.run(ServicePool.java:67) > > > at org.activeio.xnet.ServicePool$3.run(ServicePool.java:90) > > > at org.apache.geronimo.pool.ThreadPool > > > $ContextClassLoaderRunnable.run(ThreadPool.java:138) > > > at EDU.oswego.cs.dl.util.concurrent.PooledExecutor > > > $Worker.run(Unknown > > > Source) > > > at java.lang.Thread.run(Thread.java:552) > > > </snip> > > > > > > The only way I could get anything to work, was to use the oracle local > > > rars, configure everything (both jdbc ds and jms ds) to use > > > <local-transaction/>, but it appears that the remote call from my > > > client never returns, even though logging suggests that the beans > > > method completed. I'm guessing the tx is stuck. I started from > > > stretch (new geronimo dist) and redeployed the plan that was > > > previously sticking and it seems okay. > > > > > > Any idea what is up with this subordinate session muck? > > > > > > --jason > > > > >