I don't know but I think I wasn't clear enough !

Here is what I'm trying to do. I have a service that implements "*
RegistryShutdownListener*" which has a method called "*registryDidShutdown*"
within which I should have my clean-up logic.

But to register this service as a "*RegistryShutdownListener*", I should
invoke the "*addRegistryShutdownListener" *method on a "*RegistryShutdownHub
*" instance. I do that by injecting the "*RegistryShutdownHub*" service in
the *AppModule*, and  invoking the mentioned method in a
*@Startup*annotated method in my
*AppModule* class, and of course *@Inject*ing "*RegistryShutdownHub*".

Will it differe if I do this in a *@Startup* annotated method in the *
AppModule* or in a *@PostInjection* annotated method in my service itself ?
>> Or should *each* injected service that required a clean-up, implement the
"*RegistryShutdownListener*" interface and invoke it's own clean-up code ?

I'm currently using a @Startup annotated method and the clean-up code is
executed when tomcat starts to shutdown, it's just that when I try to
reference my services to instruct them to shutdown, I get exceptions because
the registry is already shutdown ! Shouldn't my service's implemented "*
RegistryShutdownListener*.*registryDidShutdown*" method be called
*before*the registry starts to shutdown ? So that I can refer to
services I need to
shutdown ?!

Here is some code to demonstrate what I'm currenlty doing:
*
*
*AppModule.java*
@Inject
private IpkDestroyer ipk;

@Inject
private RegistryShutdownHub rsh;

@Startup
public void init(){
      Runnable r = new Runnable() {
            public void run() {
                ipk.registerRegistryShutdownListener(rsh);
            }
      };
      Thread t = new Thread(r, "SkyContextListener-Initializing-Thread");
      t.start();
      try {
          t.join();
      } catch (InterruptedException e) {
          e.printStackTrace();
      }
}
*
*
*IpkDestroyerImpl.java*
public class IpkDestroyerImpl implements RegistryShutdownListener,
IpkDestroyer {
        public void registryDidShutdown() {
            Runnable r = new Runnable() {
                public void run() {
                    //clean up code referring to tapestry injected services.
This is when an exception is thrown reporting that tapestry's registry is
already closed.
                }
    public void *registerRegistryShutdownListener*(RegistryShutdownHub
shutdownHub) {
        log.info("Service registered as a registry shutdown listener.");
        shutdownHub.addRegistryShutdownListener(*this*);
    }
}

*I use threads because each thread will spawn multiple threads and wait for
them to finish. I do that to speed up the process. Then I wait for the main
threads before I return from the current method.*

Isn't this the right way and as explained in the page mentioned in my first
message ?
@Thiago, Would you please be more specific about what I need to read to do
what I need ? The IoC documentation is huge and time isn't on my side.
@Howard, I have no problem depending on tapestry but I need my core services
to be independent as much as possible. If there is no other way at the
moment then no problem, I have to find out if I have other options or not.

Thank you all for your time and help.

On Thu, Oct 6, 2011 at 1:08 AM, Howard Lewis Ship <hls...@gmail.com> wrote:

> There's more than one way to do these things.
>
> A service builder method (see the docs) is fully responsible for
> instantiating a service.  Tapestry treats this method as a black box.
> Inside the method, your code can instantiate a class, provided
> dependencies, and do other initializations, such as registering the
> new instance as a listener.
>
> However, most people don't want to have to write a main class and a
> builder method; that's why you can bind the service, and let Tapestry
> instantiate it, set dependencies, and invoke @PostInjection methods to
> do secondary initializations, such as this listener business.
>
> Don't like the annotations?  Don't use them ... but you'll write more
> code, since you've deprived Tapestry IoC of the hints it need to
> instantiate your service for you.
>
> On Wed, Oct 5, 2011 at 2:47 PM, Thiago H. de Paula Figueiredo
> <thiag...@gmail.com> wrote:
> > On Wed, 05 Oct 2011 17:23:44 -0300, Muhammad Gelbana <
> m.gelb...@gmail.com>
> > wrote:
> >
> >> I've done everything as directed in the page but the annotation
> >> *@PostInjection *didn't work so I had to invoke the method "public void
> >> startupService(RegistryShutdownHub shutdownHub)" manually at a static
> >> method annotated with @Startup in my "AppModule" class.
> >
> > You mixed two things that are different. You need this method to your
> > AppModule to contribute something to be run at startup:
> >
> > public static void
> contributeRegistryStartup(OrderedConfiguration<Runnable>)
> > {
> >        ...
> > }
> >
> > Please read the Tapestry-IoC documentation to understand what this method
> > does.
> >
> > For shutdown, inject RegistryShutdownHub and add RegistryShutdownLister
> to
> > it.
> >
> > --
> > Thiago H. de Paula Figueiredo
> > Independent Java, Apache Tapestry 5 and Hibernate consultant, developer,
> and
> > instructor
> > Owner, Ars Machina Tecnologia da Informação Ltda.
> > http://www.arsmachina.com.br
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org
> > For additional commands, e-mail: users-h...@tapestry.apache.org
> >
> >
>
>
>
> --
> Howard M. Lewis Ship
>
> Creator of Apache Tapestry
>
> The source for Tapestry training, mentoring and support. Contact me to
> learn how I can get you up and productive in Tapestry fast!
>
> (971) 678-5210
> http://howardlewisship.com
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org
> For additional commands, e-mail: users-h...@tapestry.apache.org
>
>


-- 
*Regards,*
*Muhammad Gelbana
Java Developer*

Reply via email to