On 2/13/2015 8:52 AM, Kevin Hale Boyes wrote:
I'll look into the timers for sure.
I've also noticed that my application (lots of code) also uses Executors
and ExecutorService so I might do something there.

One of the things that WorkManager gave us, and we take advantage of, is a
callback handler that lets us know when the work was accepted for
processing and when it was complete.  I'll have to find replacements for
that feature.  Maybe that's easily done with Future's in the concurrency
framework.

Thanks for your help.
Kevin

On 13 February 2015 at 06:15, David kerber <dcker...@verizon.net> wrote:

On 2/13/2015 7:29 AM, Daniel Mikusa wrote:

On Thu, Feb 12, 2015 at 11:59 PM, Kevin Hale Boyes <kcbo...@gmail.com>
wrote:

  I currently have an application running on weblogic that I'm moving over
to
tomcat 8.
One of the things the application does is run background jobs using the
commonj WorkManager.  These jobs are managed by weblogic which seems to
be
the recommended practice.

What is the best/recommended way to run background jobs in Tomcat 8?


Personally I'd use Spring, which has a nice and simple way to schedule
tasks.  I'd also be using Spring for other things though and I'm not sure
I'd pull it in just for scheduled tasks.

I use java.util.timer for my scheduled jobs in tomcat.



A quick google search came up with this library.

     http://commonj.myfoo.de/

Haven't personally used it though.

I suppose another option would be to just use java.util.concurrent.

Dan



Thanks,
Kevin


I've used something similar to the following in the past:


public class AServletContextListener implements ServletContextListener
{

    private ScheduledExecutorService executor;


    /**
     * Constructs AServletContextListener object.
     */

    public AServletContextListener()
    {
    }


    /**
     * Invoked when context is initialized.
     *
     * @param    sce        triggering ServletContextEvent
     */

    public void contextInitialized( ServletContextEvent sce )
    {
        if ( executor == null )
        {
            executor = Executors.newSingleThreadScheduledExecutor();

            Calendar firstRunTime = new GregorianCalendar();
            firstRunTime.set( Calendar.HOUR_OF_DAY, 12 );
            firstRunTime.set( Calendar.MINUTE, 0 );
            firstRunTime.set( Calendar.SECOND, 0 );
            firstRunTime.set( Calendar.MILLISECOND, 0 );

            executor.scheduleAtFixedRate(
                new ARunnable(),
firstRunTime.getTimeInMillis() - System.currentTimeMillis(),
                1000 * 60 * 60 * 24,
                TimeUnit.MILLISECONDS );
        }
    }


    /**
     * Invoked when context is destroyed.
     *
     * @param    sce        triggering ServletContextEvent
     */

    public void contextDestroyed( ServletContextEvent sce )
    {
        if ( executor != null )
        {
            boolean isTerminated = false;

            executor.shutdown();

            do
            {
                try
                {
                    isTerminated = executor.awaitTermination(
                        1, TimeUnit.SECONDS );
                }
                catch ( InterruptedException ignore )
                {
                }
            }
            while ( !isTerminated );

            executor = null;

            Thread.yield();
        }
    }

}


It's simple, not very much code and gets the job done. The call to Thread.yield was added to eliminate an error message in the Tomcat logs.

-Terence Bandoian


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org
For additional commands, e-mail: users-h...@tomcat.apache.org

Reply via email to