/** * Copyright (c)2010-2011 Enterprise Website Content Management System(EWCMS), All rights reserved. * EWCMS PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. * http://www.ewcms.com */ package com.ewcms.publication.task; import java.util.ArrayList; import java.util.Collections; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.concurrent.Semaphore; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.util.Assert; import com.ewcms.core.site.model.Site; import com.ewcms.core.site.model.SiteServer; import com.ewcms.publication.task.publish.SitePublish; import com.ewcms.publication.task.publish.SitePublishable; /** * 内存任务注册 * <br> * 任务以Map形式保存在内存中。 * * @author wangwei */ public class MemoryTaskRegistry implements TaskRegistryable{ private static final Logger logger = LoggerFactory.getLogger(MemoryTaskRegistry.class); private static final int DEFAULT_MAX_RUNNNING = 5; private final Map<Integer, SiteTaskRunnerable> taskPool = Collections.synchronizedMap(new LinkedHashMap<Integer,SiteTaskRunnerable>()); private final Semaphore limit; public MemoryTaskRegistry(){ this(DEFAULT_MAX_RUNNNING); } public MemoryTaskRegistry(int maxRunning){ limit = new Semaphore(maxRunning); } @Override public void registerNewTask(Site site,Taskable task) { Assert.notNull(task,"task is null"); synchronized(taskPool){ final Integer siteId = site.getId(); SiteTaskRunnerable running = taskPool.get(siteId); if(running == null){ logger.debug("create site running,site id is {}",siteId); SiteServer server = site.getSiteServer(); //TODO server add multi property SitePublishable publish = new SitePublish(server); running = new QueueSiteTaskRunner(publish,limit); taskPool.put(siteId, running); //start publish Thread t = new Thread(running); t.start(); } running.add(task); } } @Override public void removeTask(Integer siteId,String id,String username)throws TaskException { synchronized(taskPool){ SiteTaskRunnerable runner = taskPool.get(siteId); if(runner == null){ logger.debug("Site's runner is not exist,site id is {}",siteId); return ; } Taskable task = runner.get(id); if(task == null){ logger.debug("Task is not exist,task id is {}.",id); return ; } if(!username.equals(task.getUsername()) && !username.equals(MANAGER_USERNAME)){ logger.debug("{} is owner of task,{} does not operator",task.getUsername(),username); throw new TaskException("The task is not owner of it"); } runner.remov(task); } } @Override public List<Taskable> getSiteTasks(Integer siteId) { SiteTaskRunnerable runner; synchronized(taskPool){ runner = taskPool.get(siteId); } if(runner == null){ logger.debug("Site's runner is not exist,site id is {}",siteId); return new ArrayList<Taskable>(); } return runner.getTasks(); } /** * 判断任务是否存在 * * @param task 任务 * @return */ boolean containsTask(Taskable task){ synchronized(taskPool){ boolean contains = false; for(SiteTaskRunnerable runner :taskPool.values()){ contains = contains || runner.contains(task); } return contains; } } /** * 判断站点是否已运行 * * @param siteId 站点编号 * @return */ boolean containsSite(Integer siteId){ synchronized(taskPool){ return taskPool.containsKey(siteId); } } @Override public void closeSite(Integer siteId) { synchronized(taskPool){ SiteTaskRunnerable runner = taskPool.get(siteId); if(runner == null){ logger.debug("Site runner is not exist,site id is {}.",siteId); return ; } runner.close(); taskPool.remove(siteId); } } }