Yes I see all those passing. Here's what's happening: 1. Send good message and all works 2. Send message that causes transaction exception (as before) :: App doesn't crash now (yeaay!) 3. Send good message : Message is received (therefore the transport is still alive even after previous exception) but before it is processed the previous bad transaction is attempted ONCE and so the whole processing fails...almost like the transaction wasn't disposed after the error queue handling was done. Interestingly, NHProf isn't showing all this in a new session either, but not sure that is truthful or not. The 'Error DTC Transaction prepre (sic) phase failed' error pops up BEFORE the other message has a chance to fully process. Oi-vey
On Jun 1, 2:57 pm, Ayende Rahien <[email protected]> wrote: > Hm, can you look at the tests that I committed, they are testing that the > message arrive in the error queue. > > On Mon, Jun 1, 2009 at 4:05 PM, Mike Nichols <[email protected]>wrote: > > > > > > > Hm...the host isn't crashing now but the message that causes the error > > seems not to be moving to the errors queues, or, the transport is > > shutting down. i can't tell yet. > > > On Jun 1, 11:01 am, Ayende Rahien <[email protected]> wrote: > > > Okay, this is now fixed, have fun :-) > > > > On Mon, Jun 1, 2009 at 1:40 PM, Mike Nichols <[email protected] > > >wrote: > > > > > Man thanks Ayende > > > > > On Mon, Jun 1, 2009 at 10:13 AM, Ayende Rahien <[email protected]> > > wrote: > > > > >> Yes, I can.You need to use IEnlistmentNotification impl and register > > that > > > >> on the TX. > > > >> I'll have a fix shortly > > > > >> On Mon, Jun 1, 2009 at 1:01 PM, Mike Nichols < > > [email protected]>wrote: > > > > >>> Are you able to test this without all the NH dependency cruft? I want > > to > > > >>> keep hacking on this but can't figure out how to write a lighter test > > for it > > > >>> to stick in RSB code base. Just throwing TransactionExceptions > > doesn't work > > > > >>> On Mon, Jun 1, 2009 at 8:12 AM, Ayende Rahien <[email protected]> > > wrote: > > > > >>>> Sigh, > > > >>>> I reproduced the issue, not fun. > > > > >>>> On Mon, Jun 1, 2009 at 1:29 PM, Mike Nichols < > > [email protected]>wrote: > > > > >>>>> I think I have narrowed the problem to transaction commit failures > > > >>>>> that take place AFTER the 'Consume' invocation is made (ie in > > > >>>>> MessageCompleted). These exceptions are outside the scope of the > > > >>>>> try...catch wrapping the ProcessMessage call. > > > >>>>> In the code I have above the transaction tries to commit (in ATM) > > and > > > >>>>> then rolls back since SQL Server throws, aborting the transaction. > > > >>>>> When the TransactionScope attempts to Dispose in RQTransport > > > >>>>> ReceiveMessage method, the InternalTransaction throws since it was > > > >>>>> aborted, making the whole app crash since it is unhandled. > > > > >>>>> Any ideas on this? My attempts to handle TransactionException have > > so > > > >>>>> far just thrown RSB into a loop. > > > > >>>>> On May 30, 11:41 pm, Mike Nichols <[email protected]> > > wrote: > > > >>>>> > I have a test case here that demonstrates the problem. I changed > > > >>>>> > RQTransport on ReceiveMessage to catch > > TransactionAbortedException > > > >>>>> and > > > >>>>> > Debugger.Launch inside the catch statement. > > > >>>>> > Note this test is 'heavy' intentionally . RSB tries 5 times to > > handle > > > >>>>> > the message but when the Session flushes the transaction aborts > > and > > > >>>>> > since the transaction reference is outside the try...catch in > > > >>>>> > ReceiveMessage it goes unhandled. > > > > >>>>> > First here is output from NHProf Error logging: > > > >>>>> > It seems like since the exception is thrown inside the > > > >>>>> > TransactionScope (tx) instead the inner try..catch is ignored and > > > >>>>> > hence the TransactionAbortedException goes unhandled in the app, > > > >>>>> > stopping it altogether. > > > > >>>>> > ERROR: > > > >>>>> > DTC transaction prepre phase failed > > > >>>>> > System.Data.SqlTypes.SqlTypeException: SqlDateTime overflow. Must > > be > > > >>>>> > between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM. > > > >>>>> > at System.Data.SqlTypes.SqlDateTime.FromTimeSpan(TimeSpan > > value) > > > >>>>> > at System.Data.SqlTypes.SqlDateTime.FromDateTime(DateTime > > value) > > > >>>>> > at System.Data.SqlClient.MetaType.FromDateTime(DateTime > > dateTime, > > > >>>>> > Byte cb) > > > >>>>> > at System.Data.SqlClient.TdsParser.WriteValue(Object value, > > > >>>>> > MetaType type, Byte scale, Int32 actualLength, Int32 > > > >>>>> encodingByteSize, > > > >>>>> > Int32 offset, TdsParserStateObject stateObj) > > > >>>>> > at System.Data.SqlClient.TdsParser.TdsExecuteRPC(_SqlRPC[] > > > >>>>> > rpcArray, Int32 timeout, Boolean inSchema, SqlNotificationRequest > > > >>>>> > notificationRequest, TdsParserStateObject stateObj, Boolean > > > >>>>> > isCommandProc) > > > >>>>> > at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds > > > >>>>> > (CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean > > > >>>>> > returnStream, Boolean async) > > > >>>>> > at System.Data.SqlClient.SqlCommand.RunExecuteReader > > > >>>>> > (CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean > > > >>>>> > returnStream, String method, DbAsyncResult result) > > > >>>>> > at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery > > > >>>>> > (DbAsyncResult result, String methodName, Boolean sendToPipe) > > > >>>>> > at System.Data.SqlClient.SqlCommand.ExecuteNonQuery() > > > >>>>> > at > > NHibernate.AdoNet.AbstractBatcher.ExecuteNonQuery(IDbCommand > > > >>>>> > cmd) > > > >>>>> > at > > NHibernate.AdoNet.NonBatchingBatcher.AddToBatch(IExpectation > > > >>>>> > expectation) > > > >>>>> > at NHibernate.Persister.Entity.AbstractEntityPersister.Insert > > > >>>>> > (Object id, Object[] fields, Boolean[] notNull, Int32 j, > > > >>>>> > SqlCommandInfo sql, Object obj, ISessionImplementor session) > > > >>>>> > at NHibernate.Persister.Entity.AbstractEntityPersister.Insert > > > >>>>> > (Object id, Object[] fields, Object obj, ISessionImplementor > > session) > > > >>>>> > at NHibernate.Action.EntityInsertAction.Execute() > > > >>>>> > at NHibernate.Engine.ActionQueue.Execute(IExecutable > > executable) > > > >>>>> > at NHibernate.Engine.ActionQueue.ExecuteActions(IList list) > > > >>>>> > at NHibernate.Engine.ActionQueue.ExecuteActions() > > > >>>>> > at > > > NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutions > > > >>>>> > (IEventSource session) > > > >>>>> > at NHibernate.Event.Default.DefaultFlushEventListener.OnFlush > > > >>>>> > (FlushEvent event) > > > >>>>> > at NHibernate.Impl.SessionImpl.Flush() > > > >>>>> > at > > > NHibernate.Impl.AbstractSessionImpl.System.Transactions.IEnlistmentNotification.Prepare > > > >>>>> > (PreparingEnlistment preparingEnlistment) > > > > >>>>> > TEST > > > ============================================================================== > > > >>>>> > I am attaching it here in the Files section to make it easier to > > > >>>>> read, > > > >>>>> > too: > > > > >>>>> > namespace Cei.MaterialsTesting.Bugs > > > >>>>> > { > > > >>>>> > public class RSBBugs : > > > >>>>> > OccasionalConsumerOf<RSBBugs.ConsumerCompleteMessage> > > > >>>>> > { > > > >>>>> > private WindsorContainer container; > > > >>>>> > private ManualResetEvent wait; > > > > >>>>> > public RSBBugs() > > > >>>>> > { > > > >>>>> > container = new WindsorContainer(new > > > >>>>> XmlInterpreter("Bugs/ > > > >>>>> > RSBBugs.config")); > > > >>>>> > container.AddFacility("rhino.esb", new > > > >>>>> RhinoServiceBusFacility > > > >>>>> > ().AddMessageModule<UnitOfWorkMessageModule>()); > > > >>>>> > container.AddFacility("trx", new > > > >>>>> RhinoTransactionFacility()); > > > >>>>> > container.AddFacility("nh_uow", new > > > >>>>> NHibernateUnitOfWorkFacility( > > > new > > > >>>>> > NHibernateUnitOfWorkFacilityConfig( > > > > >>>>> Assembly.GetAssembly(typeof > > > >>>>> > (BadDateEntity))))); > > > container.AddComponent<SQLMessageConsumer>(); > > > > >>>>> > var cfg = new Configuration() > > > > >>>>> .SetProperty(Environment.ReleaseConnections, "on_close") > > > >>>>> > .SetProperty(Environment.Dialect, > > > >>>>> > "NHibernate.Dialect.MsSql2005Dialect") > > > > >>>>> .SetProperty(Environment.ConnectionDriver, > > > >>>>> > "NHibernate.Driver.SqlClientDriver") > > > > >>>>> .SetProperty(Environment.ConnectionString, string.Format("Server= > > > >>>>> > (local);initial catalog={0};Integrated Security=SSPI", > > > >>>>> > "MaterialsTesting_Test")) > > > > >>>>> .SetProperty(Environment.ProxyFactoryFactoryClass, typeof > > > >>>>> > (ProxyFactoryFactory).AssemblyQualifiedName) > > > >>>>> > .SetProperty(Environment.ShowSql, > > > >>>>> "true") > > > .SetProperty(Environment.BatchSize, > > > >>>>> "10") > > > > >>>>> .SetProperty(Environment.GenerateStatistics, "true"); > > > cfg.AddXmlFile("Bugs/BadDateEntity.hbm.xml"); > > > > >>>>> > SessionFactory = > > cfg.BuildSessionFactory(); > > > >>>>> > using (var session = > > > >>>>> SessionFactory.OpenSession()) > > > >>>>> > { > > > >>>>> > new > > SchemaExport(cfg).Execute(false, > > > >>>>> true, false, > > > >>>>> > session.Connection, null); > > > >>>>> > } > > > >>>>> > IoC.Initialize(container); > > > >>>>> > } > > > > >>>>> > protected ISessionFactory SessionFactory { get; > > set; > > > >>>>> } > > > > >>>>> > [Observation] > > > >>>>> > public void should_throw() > > > >>>>> > { > > > >>>>> > using(var bus = > > > >>>>> container.Resolve<IStartableServiceBus>()) > > > >>>>> > { > > > >>>>> > bus.Start(); > > > > >>>>> using(bus.AddInstanceSubscription(this)) > > > >>>>> > { > > > >>>>> > wait = new > > > >>>>> ManualResetEvent(false); > > > >>>>> > bus.Send(new > > SQLMessage()); > > > > >>>>> Assert.True(wait.WaitOne(TimeSpan.FromSeconds(60),false)); > > > >>>>> > } > > > >>>>> > } > > ... > > read more »- Hide quoted text - > > - Show quoted text - --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Rhino Tools Dev" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/rhino-tools-dev?hl=en -~----------~----~----~----~------~----~------~--~---
