how to set a class as daemon with tomcat?

2019-07-25 06:10发布

I'm new on the java universe, also new in the tomcat world. So, the issue is:

I need to run a java class as a daemon. This class should be able to comunicate with the tomcat requests.

In the past: when I did this in C, I executed the binary file as a background process.

Could you give me some suggestions how to proceed?

thanks ind advance!.

2条回答
Melony?
2楼-- · 2019-07-25 06:12

So it sounds like there are two parts to the answer. The first one is to make sure that your daemon gets started up with the tomcat container, and the other is to ensure that your thread gets properly configured so as not to keep the tomcat instance alive after shutdown.

Since the part about threading is simpler, I'll get that out of the way first. All the threads that you spawn should be daemon threads (e.g. you've called Thread.setDaemon(true)). Quoting from O'reilly's Exploring Java's Chapter on Threads :

In many cases, what we really want is to create background threads that do simple, periodic tasks in an application. The setDaemon() method can be used to mark a Thread as a daemon thread that should be killed and discarded when no other application threads remain. Normally, the Java interpreter continues to run until all threads have completed. But when daemon threads are the only threads still alive, the interpreter will exit.

Having live non-daemon threads will prevent the clean shutdown of tomcat. The reason for this is that tomcat keeps one non-daemon thread running up until it receives the shutdown message, at which point, said thread is stopped. If there are other non-daemon threads, then the JVM will happily keep puttering along, and you'll have to kill the process from the command line.

And now we get on to hooking into the lifecycle of the servlet container in order to spawn our service. There are two steps here...we have to implement a ServletContextListener as Jim Garrison suggested, and then we have to tell the container to load it. There are two things here:

Step 1 : Implement a ServletContextListener :

public class MyDaemonServletContextListener implements ServletContextListener {

    public void contextInitialized(ServletContextEvent sce) {

        Thread th = new Thread() {
            public void run() {
                // implement daemon logic here.
            }
        };
        th.setDaemon(true);
        th.start();
    }

    public void contextDestroyed(ServletContextEvent sce) {
        // you could notify your thread you're shutting down if 
        // you need it to clean up after itself
    }
}

Step 2 : Declare it in your web.xml :

<listener>
    <listener-class>MyDaemonServletContextListener</listener-class>
</listener>

And that should be that.

查看更多
祖国的老花朵
3楼-- · 2019-07-25 06:30

I think you want a ServletContextListener, which will get invoked at servlet context startup and shutdown. You can start and stop the daemon thread from there.

查看更多
登录 后发表回答