Java tutorial
/* * Copyright 2004,2005 The Apache Software Foundation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.wso2.carbon.core.deployment; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.wso2.carbon.registry.core.session.UserRegistry; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.TimeUnit; /** * This task will periodically run & update the artifacts in the local file system from the Registry */ public class RegistryBasedRepositoryUpdater { private static final Log log = LogFactory.getLog(RegistryBasedRepositoryUpdater.class); private static final ScheduledThreadPoolExecutor exec = (ScheduledThreadPoolExecutor) Executors .newScheduledThreadPool(20); private static final Map<String, ScheduledFuture> futures = new ConcurrentHashMap<String, ScheduledFuture>(); static { Runtime.getRuntime().addShutdownHook(new Thread() { public void run() { exec.shutdownNow(); } }); } /** * Schedule registry based repo update task * * @param userRegistry The relevant user registry to fetch the repo from * @param registryPath The path in the <code>userRegistry</code> to fetch the repo from * @param fileSystemRepo The path in the file system in which the fetched data will be placed * @param startSecs Starting time of the task in seconds * @param periodSecs Period of the task in seconds */ public static void scheduleAtFixedRate(UserRegistry userRegistry, String registryPath, String fileSystemRepo, long startSecs, long periodSecs) { ScheduledFuture<?> scheduledFuture = exec.scheduleAtFixedRate( new UpdaterTask(userRegistry, registryPath, fileSystemRepo), startSecs, periodSecs, TimeUnit.SECONDS); futures.put(fileSystemRepo, scheduledFuture); } private RegistryBasedRepositoryUpdater() { } /** * Cleanup */ public static void cleanup() { exec.shutdownNow(); } /** * Cancel a particular task which updates a repo * * @param fileSystemRepo The location in the file system */ public static void cancelTask(String fileSystemRepo) { ScheduledFuture scheduledFuture = futures.get(fileSystemRepo); if (scheduledFuture != null) { scheduledFuture.cancel(true); exec.purge(); futures.remove(fileSystemRepo); } } private static class UpdaterTask implements Runnable { private RegistryBasedRepository registryBasedRepository; public UpdaterTask(UserRegistry userRegistry, String registryPath, String fileSystemRepo) { registryBasedRepository = new RegistryBasedRepository(userRegistry, registryPath, fileSystemRepo); } public void run() { try { registryBasedRepository.updateFileSystemFromRegistry(); } catch (Throwable e) { log.error("Cannot load repository from registry", e); } } } }