[ https://issues.apache.org/jira/browse/ISIS-1045?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14333153#comment-14333153 ]
Oscar Bou commented on ISIS-1045: --------------------------------- COMMENTS FOR GUAVA EVENT BUS The per-thread queueing behavior is irrespective of using the EventBus or the AsyncEventBus implementation. Notice on [1] the definition of the queue. And on [2] the logic of the "dispatch" method, that originates the problem, as it will introduce different behavior depending on its internal state when a new Event is posted to be dispatched: - If it's currently dispatching a previously posted Event, it will queue it, so its event handlers will be invoked after previously invoking all event handlers of this previous event. - If it's not currently dispatching any other Event, it will instead invoke all its event handlers immediately. I've just noticed on [3] the availability of an "immediate" Service Bus, whose comment is that it will not queue Events. So perhaps this could be a simpler solution. But not sure if the ServiceBus can be configured to use this Dispatcher instead of the "queue" one ... Perhaps simply creating a custom EventBus inheriting from the current one, which overrides the Dispatcher configured at [4]? Look there how it currently instantiates the "queuePerThread" dispatcher ... [1] https://code.google.com/p/guava-libraries/source/browse/guava/src/com/google/common/eventbus/Dispatcher.java#87 [2] https://code.google.com/p/guava-libraries/source/browse/guava/src/com/google/common/eventbus/Dispatcher.java#96 [3] https://code.google.com/p/guava-libraries/source/browse/guava/src/com/google/common/eventbus/Dispatcher.java#63 [4] https://code.google.com/p/guava-libraries/source/browse/guava/src/com/google/common/eventbus/EventBus.java#119 > New domain events are created for each phase for properties, but not for > collections nor actions. The current design doesn't support use of the > wrapper factory. > ----------------------------------------------------------------------------------------------------------------------------------------------------------------- > > Key: ISIS-1045 > URL: https://issues.apache.org/jira/browse/ISIS-1045 > Project: Isis > Issue Type: Improvement > Components: Core > Affects Versions: core-1.7.0 > Reporter: Dan Haywood > Assignee: Dan Haywood > Priority: Minor > Fix For: core-1.9.0 > > > In the domain events design we have 5 phases: > hide/disable/validate/pre-execute/post-execute. The framework attempts to > reuse the same event where possible > for actions: > - for hide, always creates new event > - for disable, always creates new event > - for validate, always creates new event, puts onto thread-local > - for pre-execute, uses the event from validate (obtain from thread-local) > - for post-execute, uses the event from pre-execute (passed as local var). > for collections: > - ditto > but for properties, although we originally had the same algorithm, this was > changed (patch from Oscar) to: > - for hide, always creates new event > - for disable, always creates new event > - for validate, always creates new event, puts onto thread-local > - for pre-execute, always creates a new event (ignores that on thread-local) > - for post-execute, uses the event from pre-execute (passed as local var). > The reason that Oscar needed this change was because the framework does not > anticipate there being more than one "pending" interaction. However, if the > wrapper factory is used, then this assumption isn't true, because validateX() > -> wrap -> validateY(). > This use case actually needs a stack of pending interaction events to support > this change. > As things stand: > * the getUserData() functionality is broken for property domain events > * the underlying problem remains for actions -> actions using the wrapper > factory during the validate phase. > There is also a suggestion that the Guava event bus might be an issue in that > it buffers changes; I'm not exactly sure what this means (we don't use the > async guava bus), and I don't know if its behaviour is significant or not. > But in any case, the above design defect is an issue irrespective and which > needs addressing; once that's fixed then we can look at the Guava event bus > to decide if it is also a problem for us or not. -- This message was sent by Atlassian JIRA (v6.3.4#6332)