InMemorySagaPersister
I'm wondering if the consumer is being properly released from the container
upon saga completion.  It appears container.release is being called but it
can't be released if the next OutcomeImportStartedEvent is going into the
same object without ever hitting the constructor again.  I'll try changing
the lifecycle of my object to transient (using castle windsor) to see if
this changes anything.

On Sun, May 6, 2012 at 6:51 PM, Corey Kaylor <co...@kaylors.net> wrote:

> What are you using for saga persistence?
>
>
> On Sun, May 6, 2012 at 5:49 PM, RyanL <rlangto...@gmail.com> wrote:
>
>> I modified my "OutcomeImportStartedEvent" consumer to reset the state
>> and completed status.  This causes everything to work correctly.  It
>> doesn't feel right, but it works.
>>
>>        public void Consume(OutcomeImportStartedEvent message)
>>        {
>>            State = new OutcomeImportState {OutcomesToImport =
>> message.OutcomesToImport, OutcomesImported = 0 };
>>            IsCompleted = false;
>>         }
>>
>> On May 6, 6:43 pm, RyanL <rlangto...@gmail.com> wrote:
>> > I set threadcount to 1.  The behavior is the same.
>> > When the first message is fired (OutcomeImportStartedEvent) a saga is
>> > created, as expected.  Debugging into Rhino ESB it hits this part of
>> > the code (in DefaultServiceBus), which verifies to me that it is
>> > detecting the event as a saga starting event (InitiatedBy).  My
>> > consumer is in the "consumers" collection (nothing in
>> > "instanceConsumers" or "sagas" collections).
>> >
>> >                 saga.Id = sagaMessage != null ?
>> >                     sagaMessage.CorrelationId :
>> >                     GuidCombGenerator.Generate();
>> >
>> >             return instanceConsumers
>> >                 .Union(sagas)
>> >                 .Union(consumers.Where(x => x != null))
>> >                 .ToArray();
>> >
>> > My consumer is instantiated which news up the state and everything
>> > following runs as expected.  It consumes all of the Orchestrates
>> > messages and IsCompleted is set to true at the correct time.  The saga
>> > runs correctly from start to finish the first time through.  I then
>> > try to run a new saga, started once again by
>> > OutcomeImportStartedEvent.  The problem I see now however is that the
>> > consumer and state are not "newed up", instead my consumer picks up
>> > the saga starting event which has a state of IsCompleted = true, this
>> > causes my consumer to be released from the container and then there is
>> > nothing to consume my Orchestrates events.  Do I need to reset the
>> > state in my initiatedby consume function rather than in the
>> > constructor?
>> >
>> > On May 6, 1:56 pm, Corey Kaylor <co...@kaylors.net> wrote:
>> >
>> >
>> >
>> >
>> >
>> >
>> >
>> > > Invoking a consumer does not require a subscription. It only requires
>> that
>> > > there is a consumer registered in the container at the endpoint that
>> > > receives the message. With sagas you will get this error message if
>> the
>> > > Orchestrates<TMessage> is received and the saga has already been
>> completed,
>> > > OR the saga hasn't started yet. Based on your code sample it's
>> possible
>> > > that you are receiving OutcomeImportedEvent before the saga is
>> started. You
>> > > can possibly test if this is true by setting the threadCount to 1 and
>> see
>> > > if you still have the same problem.
>> >
>> > > On Sun, May 6, 2012 at 12:28 PM, RyanL <rlangto...@gmail.com> wrote:
>> > > > When the consumer marks the saga as complete, the following code is
>> > > > called in DefaultServiceBus.cs (saga.IsCompleted is true).
>> >
>> > > >            if (saga.IsCompleted)
>> > > >                reflection.InvokeSagaPersisterComplete(persister,
>> > > > saga);
>> > > >            else
>> > > >                reflection.InvokeSagaPersisterSave(persister, saga);
>> >
>> > > > However, when I send another message to start a new saga
>> (InitiatedBy)
>> > > > it is consumed by the same consumer and when I inspect the State it
>> > > > has not changed.  After this first message is consumed, the consumer
>> > > > is released from the container by this area of code in
>> > > > DefaultServiceBus.cs:
>> >
>> > > >                var initiatedBy =
>> > > > reflection.GetGenericTypeOf(typeof(InitiatedBy<>), msgType);
>> > > >                if (initiatedBy.IsInstanceOfType(saga) == false)
>> > > >                {
>> > > >                    serviceLocator.Release(consumers[i]);
>> > > >                    consumers[i] = null;
>> > > >                    continue;
>> > > >                }
>> >
>> > > > It is at this point future messages throw the error that there are
>> no
>> > > > consumers.
>> >
>> > > > On May 6, 8:58 am, RyanL <rlangto...@gmail.com> wrote:
>> > > > > I am creating a new saga, but I'm getting an error that there are
>> no
>> > > > > consumers, so it appears that the subscription is lost after one
>> saga
>> > > > > is completed.  Here is my code that creates and publishes the saga
>> > > > > events:
>> >
>> > > > >             var outcomes =
>> retriever.GetFile(textReader).NewsItems;
>> > > > >             var sagaId = Guid.NewGuid();
>> >
>> > > > >             bus.Send(new OutcomeImportStartedEvent() {
>> CorrelationId =
>> > > > > sagaId, OutcomesToImport = outcomes.Count() });
>> > > > >             foreach (var o in outcomes)
>> > > > >             {
>> > > > >                  var outcomeImportedEvent = new
>> OutcomeImportedEvent()
>> > > > > { Outcome = o, CorrelationId = sagaId };
>> > > > >                  bus.Send(outcomeImportedEvent);
>> > > > >             }
>> >
>> > > > > On May 6, 8:45 am, "Oren Eini (Ayende Rahien)" <aye...@ayende.com
>> >
>> > > > > wrote:
>> >
>> > > > > > Ryan,
>> > > > > > Each customer create a NEW saga.
>> >
>> > > > > > On Sun, May 6, 2012 at 4:45 PM, RyanL <rlangto...@gmail.com>
>> wrote:
>> > > > > > > Also how does making the consumer go away make sense?  Using
>> > > > Starbucks
>> > > > > > > as an example, this would mean you can only handle taking a
>> single
>> > > > > > > order.  The next customer could not place an order.
>> >
>> > > > > > > On May 5, 12:27 pm, Ryan Langton <rlangto...@gmail.com>
>> wrote:
>> > > > > > > > Ok, is there any way to implement this sort of behavior
>> then?
>> > > > > > > > Users are importing entities.  I want an action to occur on
>> each
>> > > > entity
>> > > > > > > > import and another action to occur when the import is 100%
>> > > > complete.  I
>> > > > > > > > assumed sagas would be the best way to handle this.  But I
>> need to
>> > > > allow
>> > > > > > > > users to perform multiple imports as well as possible
>> simultaneous
>> > > > > > > imports
>> > > > > > > > (multiple users importing at the same time - edge case).
>>  The
>> > > > import
>> > > > > > > files
>> > > > > > > > can be quite large to where putting all of the entities in
>> a single
>> > > > > > > message
>> > > > > > > > can easily exceed the limitations of msmq.
>> >
>> > > > > > > > Just looking for ideas.  Thanks for the response.
>> >
>> > > > > > > > On Sat, May 5, 2012 at 6:40 AM, Oren Eini (Ayende Rahien) <
>> > > > > > > aye...@ayende.com
>> >
>> > > > > > > > > wrote:
>> > > > > > > > > Once the saga is completed, it is just that, completed,
>> done.
>> > > > > > > > > This is the by design behavior.
>> >
>> > > > > > > > > On Fri, May 4, 2012 at 10:17 PM, RyanL <
>> rlangto...@gmail.com>
>> > > > wrote:
>> >
>> > > > > > > > >> I have a saga.  Once it completes the saga consumer
>> disappears
>> > > > and
>> > > > > > > > >> future messages get an error "Got Message X, but had no
>> > > > consumers for
>> > > > > > > > >> it".  What do I do to leave the consumer / subscription
>> active
>> > > > and
>> > > > > > > > >> just start a new saga?  Here is my class:
>> >
>> > > > > > > > >>    public class OutcomeImportSagaLuceneIndexer :
>> > > > > > > > >> ISaga<OutcomeImportState>,
>> >
>> > > > > > > > >> InitiatedBy<OutcomeImportStartedEvent>,
>> >
>> > > > > > > > >> Orchestrates<OutcomeImportedEvent>
>> > > > > > > > >>    {
>> > > > > > > > >>        private readonly
>> ILuceneRepository<OutcomeListModel>
>> > > > > > > > >> repository;
>> >
>> > > > > > > > >>        public
>> >
>> > > > OutcomeImportSagaLuceneIndexer(ILuceneRepository<OutcomeListModel>
>> > > > > > > > >> repository)
>> > > > > > > > >>        {
>> > > > > > > > >>            this.repository = repository;
>> > > > > > > > >>            State = new OutcomeImportState();
>> > > > > > > > >>        }
>> >
>> > > > > > > > >>        public void Consume(OutcomeImportStartedEvent
>> message)
>> > > > > > > > >>        {
>> > > > > > > > >>            State.OutcomesToImport =
>> message.OutcomesToImport;
>> > > > > > > > >>        }
>> >
>> > > > > > > > >>        public void Consume(OutcomeImportedEvent message)
>> > > > > > > > >>        {
>> >
>> > > >  repository.Upsert(MapToLuceneListRecord(message.Outcome));
>> > > > > > > > >>            State.OutcomesImported++;
>> > > > > > > > >>            if (State.OutcomesImported <
>> State.OutcomesToImport)
>> > > > > > > > >> return;
>> >
>> > > > > > > > >>            repository.RebuildIndex();
>> > > > > > > > >>            IsCompleted = true;
>> > > > > > > > >>        }
>> >
>> > > > > > > > >>        private static OutcomeListModel
>> > > > > > > > >> MapToLuceneListRecord(OutcomeViewModel model)
>> > > > > > > > >>        {
>> > > > > > > > >>            return Mapper.Map<OutcomeViewModel,
>> > > > > > > > >> OutcomeListModel>(model);
>> > > > > > > > >>        }
>> >
>> > > > > > > > >>        public Guid Id { get; set; }
>> > > > > > > > >>        public bool IsCompleted { get; set; }
>> > > > > > > > >>        public OutcomeImportState State { get; set; }
>> > > > > > > > >>    }
>> >
>> > > > > > > > >> --
>> > > > > > > > >> You received this message because you are subscribed to
>> the
>> > > > Google
>> > > > > > > Groups
>> > > > > > > > >> "Rhino Tools Dev" group.
>> > > > > > > > >> To post to this group, send email to
>> > > > rhino-tools-dev@googlegroups.com
>> > > > > > > .
>> > > > > > > > >> To unsubscribe from this group, send email to
>> > > > > > > > >> rhino-tools-dev+unsubscr...@googlegroups.com.
>> > > > > > > > >> For more options, visit this group at
>> > > > > > > > >>http://groups.google.com/group/rhino-tools-dev?hl=en.
>> >
>> > > > > > > > >  --
>> > > > > > > > > You received this message because you are subscribed to
>> the
>> > > > Google
>> > > > > > > Groups
>> > > > > > > > > "Rhino Tools Dev" group.
>> > > > > > > > > To post to this group, send email to
>> > > > rhino-tools-dev@googlegroups.com.
>> > > > > > > > > To unsubscribe from this group, send email to
>> > > > > > > > > rhino-tools-dev+unsubscr...@googlegroups.com.
>> > > > > > > > > For more options, visit this group at
>> > > > > > > > >http://groups.google.com/group/rhino-tools-dev?hl=en.
>> >
>> > > > > > > --
>> > > > > > > You received this message because you are subscribed to the
>> Google
>> > > > Groups
>> > > > > > > "Rhino Tools Dev" group.
>> > > > > > > To post to this group, send email to
>> > > > rhino-tools-dev@googlegroups.com.
>> > > > > > > To unsubscribe from this group, send email to
>> > > > > > > rhino-tools-dev+unsubscr...@googlegroups.com.
>> > > > > > > For more options, visit this group at
>> > > > > > >http://groups.google.com/group/rhino-tools-dev?hl=en.
>> >
>> > > > --
>> > > > You received this message because you are subscribed to the Google
>> Groups
>> > > > "Rhino Tools Dev" group.
>> > > > To post to this group, send email to
>> rhino-tools-dev@googlegroups.com.
>> > > > To unsubscribe from this group, send email to
>> >
>> > ...
>> >
>> > 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 rhino-tools-dev@googlegroups.com.
>> To unsubscribe from this group, send email to
>> rhino-tools-dev+unsubscr...@googlegroups.com.
>> For more options, visit this group at
>> http://groups.google.com/group/rhino-tools-dev?hl=en.
>>
>>
>  --
> You received this message because you are subscribed to the Google Groups
> "Rhino Tools Dev" group.
> To post to this group, send email to rhino-tools-dev@googlegroups.com.
> To unsubscribe from this group, send email to
> rhino-tools-dev+unsubscr...@googlegroups.com.
> For more options, visit this group at
> http://groups.google.com/group/rhino-tools-dev?hl=en.
>

-- 
You received this message because you are subscribed to the Google Groups 
"Rhino Tools Dev" group.
To post to this group, send email to rhino-tools-dev@googlegroups.com.
To unsubscribe from this group, send email to 
rhino-tools-dev+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/rhino-tools-dev?hl=en.

Reply via email to