4 Replies Latest reply on Aug 17, 2010 4:09 AM by swiegersf.francois.swiegers.gmail.com

    Register Observer Programmatically using CDI?

    paulmooney

      Is there a way to programmatically register an observer? I've noticed there is an interface for an ObserverMethod, but I haven't been able to find a place in CDI to register an observer programmatically as opposed to decoratively.

        • 1. Re: Register Observer Programmatically using CDI?
          nickarls

          Probably not in pure CDI but you might want be able to by casting to a Weld BeanManagerImpl. Never done it so I haven't checked if it's usable (resolving reset etc)

          • 2. Re: Register Observer Programmatically using CDI?
            paulmooney

            Thanks, I'll try out the BeanManagerImpl.addObserver() method. I'm okay with not going pure CDI, it just would have been a nice to have.


            Now the challenge is going to be handling the lifecycle of these non-contextual/non-managed java objects I want to have observers for.

            • 3. Re: Register Observer Programmatically using CDI?
              swd847

              There is also AfterBeanDiscovery.addObserverMethod()

              • 4. Re: Register Observer Programmatically using CDI?
                swiegersf.francois.swiegers.gmail.com

                Your use case statement is a bit vague, so this may not be what you are looking for, but it should be possible to add observers dynamically at runtime using a normal Observer pattern.


                (warning, I'm coding out of my head so the below won't compile, but I hope you get the general idea).


                Like so:




                @ApplicationScoped
                public class Observer {
                
                  private Set<Listener> myListeners ...;
                
                  public void addSomeListener(Listener l) {
                    myListeners.add(l);
                  }
                
                  public void afterEvent(@Observes SomeEvent event) {
                    for (Listener l : myListeners) { //not thread safe!
                      l.notify(event);
                    }
                  }
                
                }



                Then add a observer dynamically:




                public class SomeClass {
                
                 @Inject Observer observer;
                
                 public void readyToRegisterMyObserver() {
                   observer.addSomeListener(new Listener() ...);
                 }
                
                }



                Of course, all the usual disclaimers regarding the fragile observer pattern applies.