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));
> >>>>> >                                 }
> >>>>> >                         }
> >>>>> >                 }
> >>>>> >                 public class SQLMessage
> >>>>> >                 {
>
> >>>>> >                 }
>
> >>>>> >                 [Transactional]
> >>>>> >                 public class SQLMessageConsumer :
> >>>>> ConsumerOf<SQLMessage>
> >>>>> >                 {
> >>>>> >                         private IServiceBus bus;
>
> >>>>> >                         public SQLMessageConsumer(IServiceBus bus)
> >>>>> >                         {
> >>>>> >                                 this.bus = bus;
> >>>>> >                         }
>
> >>>>> >                         [Transaction]
> >>>>> >                         public void Consume(SQLMessage message)
> >>>>> >                         {
>
> >>>>> >                                 var bad = new BadDateEntity
> >>>>> {CreatedOn = DateTime.MinValue};
> >>>>> >                                 UnitOfWork.CurrentSession.Save(bad);
>
> ...
>
> read more »
--~--~---------~--~----~------------~-------~--~----~
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