public void snapShotJob(final JobDescriptor job, final SnapShotDescripter snapShotDesc) throws IOException {
        scheduler.suspend(job);

        final LocalPhysicalGraph graph = jobInfo.getLocalPhysicalGraph(job);
        final Iterator<LocalVertex> iter = graph.iteratorOfVertex();
        while (iter.hasNext()) {
            final LocalVertex lv = iter.next();

            if (!(lv instanceof LocalPhysicalVertex)) {
                continue;
            }

            final LocalPhysicalVertex lpv = (LocalPhysicalVertex) lv;
            if (lpv.isVirtual()) {
                continue;
            }

            final ThreadContextBase context = lpv.getContext();
            final ModuleBase base = context.getModuleBase();

            if (ReflectionUtil.isImplemented(base.getClass(), SnapShottable.class)) {
                FileOutputStream fileOut = new FileOutputStream(snapShotManager.getVertexFile(snapShotDesc, lpv));
                ObjectOutputStream output = new ObjectOutputStream(fileOut);
                context.snapShotModule(output);
                output.close();
            }
        }

        FileOutputStream fileOut = new FileOutputStream(snapShotManager.getGraphFile(snapShotDesc));
        ObjectOutputStream output = new ObjectOutputStream(fileOut);
        output.writeObject(graph);
        output.close();

        scheduler.resumeJob(job);
    }