The test I wrote passes (unfortunately). I just can't figure out why NH
would try to insert again after the previous message was failed, almost like
the session wasn't disposed in my UnitOfWork module after the  previous
message was moved to the error queue...Let me check to make sure the message
module MessageProcesSINGCompleted event is getting fired after a transaction
failure....
On Mon, Jun 1, 2009 at 4:03 PM, Ayende Rahien <[email protected]> wrote:

> Hm, can you try to write a test that reproduce this?
>
>
> On Mon, Jun 1, 2009 at 6:55 PM, Mike Nichols <[email protected]>wrote:
>
>>
>> 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.IEnlistmentNotifica­tion.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
-~----------~----~----~----~------~----~------~--~---

Reply via email to