6 Replies Latest reply on Apr 19, 2012 3:33 PM by ronaldocwb

    Fire a event inside a determined scope

    ronaldocwb

      Is there some way I can fire an event, but only observers that are in the same scope catch it?

       

      Exemple:

       

      I am in a conversation cid=1, and at some point I fire an event:

       

      createEvent.fire(new DetailChangeEvent("Some description"))
      

       

      Then I have a observer:

       

      public void changeNotifier(@Observes DetailChangeEvent event){
             log.info("Detail changed!");
      }
      

       

      But I want that only the components that are in the same conversation (cid=1) catch this event and notify it! Is is possible using some Weld or Solder functionality?

       

      Thanks in advance.

        • 1. Re: Fire a event inside a determined scope
          luksa

          That is exactly how events work - when you fire an event in a session, only the observers in the same session will be notified (observers in other sessions will not be notified).

          • 2. Re: Fire a event inside a determined scope
            ronaldocwb

            Editing my awnser:

             

             

            What realy happens is:

             

            When I fire a event in a @ConversationScoped component, other components @ConversationScoped that are in other conversations don't cath this event. Until now great!

            But i have some @ApplicationScoped and @ViewScoped that also catch it.

             

            Can I isolate there components from my conversation or do something to my event not be captured in a scope diferent then @ConversationScoped?

            • 3. Re: Fire a event inside a determined scope
              kwintesencja

              As a workaround you could get the bean reference and test the beanScope in changeNotifier method,

               

              something like:

               

              public void changeNotifier(@Observes DetailChangeEvent event){
                     Bean bean = beanManager.getBeans("managedBeanName").iterator().next();
                     if(bean.getScope().equals(ConversationScoped.class)){//dont know if its the right way to test the bean scope
                            log.info("Detail changed!");
                        }
                 
              }
              
              

               

              I didnt test but maybe it helps.

              1 of 1 people found this helpful
              • 4. Re: Fire a event inside a determined scope
                ronaldocwb

                Rafael,

                 

                I've done some workaround and it´s working for me. But I would like to know if there is something I can do using CDI/Seam/Solder to avoid this workaround.

                 

                Thanks anyway!!!

                • 5. Re: Fire a event inside a determined scope
                  luksa

                  OK, I was worried when you said all other conversations also receive the event.

                   

                  Anyway, CDI doesn't have anything that would deliver events only to observers in the same scope type. But you can use different event types or different event qualifiers to achieve what you want.

                   

                  Something like:

                   

                  @Inject @ConversationOnly Event<Foo> fooEvent;

                   

                  and

                   

                  void handleEvent(@Observes @ConversationOnly Foo) {

                  ...

                  }

                   

                  where @ConversationOnly is:

                   

                  @Qualifier

                  @Target(PARAMETER)

                  @Retention(RUNTIME)

                  public @interface ConversationOnly {

                      String value();

                  }

                   

                  Note: @ConversationOnly has nothing to do with conversations or scopes. It's just a qualifier for filtering events. If you had a handleEvent(@Observes @ConversationOnly Foo) inside a @SessionScoped bean, it would be notified also, of course.

                  • 6. Re: Fire a event inside a determined scope
                    ronaldocwb

                    Marko,

                     

                    My workaround is something like this! Using qualifiers.

                     

                    Thanks!