package cn.vicky.sgs.app; import java.io.Serializable; import java.util.Properties; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import cn.vicky.sgs.task.BaseTask; import cn.vicky.sgs.task.impl.TestTask; import com.sun.sgs.app.AppContext; import com.sun.sgs.app.AppListener; import com.sun.sgs.app.ClientSession; import com.sun.sgs.app.ClientSessionListener; import com.sun.sgs.app.util.ScalableList; public class MainApp implements AppListener, Serializable { private static final long serialVersionUID = 1L; private static final Logger logger = LoggerFactory.getLogger(MainApp.class); public void initialize(Properties properties) { logger.info("initialize begin ... "); ScalableList<BaseTask> testTasks = new ScalableList<BaseTask>(); // 一个任务需要执行的子任务 ... testTasks.add(new TestTask()); testTasks.add(new TestTask()); testTasks.add(new TestTask()); testTasks.add(new TestTask()); testTasks.add(new TestTask()); AppContext.getTaskManager().scheduleTask(new TestTask(testTasks)); logger.info("initialize over ... "); } public ClientSessionListener loggedIn(ClientSession clientsession) { return null; } }
package cn.vicky.sgs.task; import java.io.Serializable; import com.sun.sgs.app.AppContext; import com.sun.sgs.app.ManagedReference; import com.sun.sgs.app.Task; import com.sun.sgs.app.util.ScalableList; public abstract class BaseTask implements Task, Serializable { private static final long serialVersionUID = 1L; private ManagedReference<ScalableList<BaseTask>> subTasksRef; public BaseTask() { } public BaseTask(ScalableList<BaseTask> subTasks) { subTasksRef = AppContext.getDataManager().createReference(subTasks); } public void doSubTask() { if (subTasksRef != null && subTasksRef.get() != null) { BaseTask task = null; try { task = subTasksRef.getForUpdate().remove(0); } catch (IndexOutOfBoundsException e) { } if (task != null) { task.setSubTasksRef(subTasksRef); AppContext.getTaskManager().scheduleTask(task); } } } public void setSubTasksRef(ManagedReference<ScalableList<BaseTask>> subTasksRef) { this.subTasksRef = subTasksRef; } }
package cn.vicky.sgs.task.impl; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.sun.sgs.app.AppContext; import com.sun.sgs.app.NameNotBoundException; import com.sun.sgs.app.util.ScalableList; import cn.vicky.sgs.mo.Counter; import cn.vicky.sgs.task.BaseTask; public class TestTask extends BaseTask { private static final long serialVersionUID = 1L; private static final Logger logger = LoggerFactory.getLogger(TestTask.class); public TestTask() { } public TestTask(ScalableList<BaseTask> subTasks) { super(subTasks); } public void run() throws Exception { // Thread.sleep(80); doSubTask(); long id = 0; Counter counter = null; try { counter = (Counter) AppContext.getDataManager().getBinding("id"); } catch (NameNotBoundException e) { AppContext.getDataManager().setBinding("id", new Counter()); counter = (Counter) AppContext.getDataManager().getBinding("id"); } id = counter.next(); logger.info("Done ~ " + id); } }
package cn.vicky.sgs.mo; import java.io.Serializable; import com.sun.sgs.app.AppContext; import com.sun.sgs.app.ManagedObject; public class Counter implements ManagedObject, Serializable { private static final long serialVersionUID = 1L; public long id = 0; public long next() { id++; AppContext.getDataManager().markForUpdate(this); return id; } @Override public String toString() { return "Counter id ::[ " + id + " ]"; } }
打印::
2010-3-30 16:08:58 com.sun.sgs.impl.kernel.Kernel <init> 信息: The Kernel is ready, version: 0.9.11 2010-3-30 16:08:58 com.sun.sgs.impl.service.data.store.DataStoreImpl <init> 信息: Creating database directory : G:/学习/SubTask/data/MainApp/dsdb 2010-3-30 16:09:02 com.sun.sgs.impl.service.watchdog.WatchdogServerImpl registerNode 信息: node:com.sun.sgs.impl.service.watchdog.NodeImpl[1,health:GREEN,backup:(none)]@12D5D97FF9764F4 registered [10/03/30 16:09:03][cn.vicky.sgs.app.MainApp - initialize] - initialize begin ... [10/03/30 16:09:03][cn.vicky.sgs.app.MainApp - initialize] - initialize over ... 2010-3-30 16:09:03 com.sun.sgs.impl.kernel.Kernel startApplication 信息: MainApp: application is ready [10/03/30 16:09:03][cn.vicky.sgs.task.impl.TestTask - run] - Done ~ 1 [10/03/30 16:09:03][cn.vicky.sgs.task.impl.TestTask - run] - Done ~ 2 [10/03/30 16:09:03][cn.vicky.sgs.task.impl.TestTask - run] - Done ~ 3 [10/03/30 16:09:03][cn.vicky.sgs.task.impl.TestTask - run] - Done ~ 4 [10/03/30 16:09:03][cn.vicky.sgs.task.impl.TestTask - run] - Done ~ 5 [10/03/30 16:09:03][cn.vicky.sgs.task.impl.TestTask - run] - Done ~ 6