1

EDIT
現在のコードは、アプリケーションをブロックしない実用的なソリューションであり、承認された回答で行われた提案が組み込まれています。


Tomcat 7 Web アプリケーションの実行中に、バックグラウンド スレッドで MS Access データベースを継続的にダウンロードしたいのですが、スレッドはデータベースをダウンロードしますが、サービスからどのページにもアクセスできないため、アプリケーションの起動がブロックされているようです。これは私が使用しているコードです:

public class DatabaseUpdater implements ServletContextListener {
    private Thread thread = null;

    private final Runnable updater = new Runnable() {

        private boolean hasExpired(File mdbFile) throws IOException {
            if (!mdbFile.exists())
                return true;

            Long ttl = Long.parseLong(Configuration.getValueForOS("db.http-expiration"));

            Date now = new Date();
            Date fileDate = new Date(mdbFile.lastModified());

            return (now.getTime() - fileDate.getTime()) > ttl;
        }

        @Override
        public void run() {
            while (true) {
                if (Thread.currentThread().isInterrupted())
                    throw new RuntimeException("Application Shutdown");

                try {
                    String databases[] = new String[]{"database1", "database2"};
                    for (String database : databases) {

                        String fileName = database + "." + StringUtil.randomString(8) + ".mdb";
                        String fileLocation = Configuration.getValueForOS("db.path");

                        File mdbFile = new File(fileLocation, fileName);
                        File currentDatabaseFile = new File(fileLocation, database + ".mdb");

                        if (hasExpired(currentDatabaseFile)) {
                            URL url = new URL(Configuration.getValueForOS("db.url." + database));
                            InputStream in = url.openConnection().getInputStream();
                            OutputStream out = new FileOutputStream(mdbFile);

                            FileUtil.streamBridge(in, out);
                            FileUtil.close(in, out);

                            while (currentDatabaseFile.exists() && !currentDatabaseFile.delete()) ;
                            while (!mdbFile.renameTo(currentDatabaseFile)) ;
                       }
                   }
                     // Put the thread to sleep so the other threads do not starve
                    Thread.sleep(Long.parseLong(
                        Configuration.getValueForOS("db.http-expiration"));
                } catch (IOException ioe) {
                    ioe.printStackTrace();
                } catch (InterruptedException ie) {
                    ie.printStackTrace();
                }
            }
        }
    };

    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        this.thread = new Thread(updater);
        thread.start();
    }

    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        if (this.thread.isAlive())
            this.thread.interrupt();
    }
}

何が原因ですか?

私はこの質問に基づいて実装しました: Tomcatサーブレットアプリのバックグラウンドスレッド

4

1 に答える 1