精华内容
下载资源
问答
  •   对于任何事物来说,创建都是第一步。所以第二节是信息系统开发技术。   对于系统来说,集成非常重要。所以第三节是信息系统的集成技术。   由于信息系统与C/S紧密相关,而最紧密相关的就是软件工程。第四节...

    1. 目录学习

    1. 信息系统与信息化
    2. 信息系统开发技术
    3. 信息系统集成技术
    4. 软件工程
    5. 新一代信息技术
    6. 信息系统安全技术
    7. 信息化发展与应用
    8. 信息系统服务管理
    9. 信息系统规划
    10. 企业首席信息官及其职责

      第一节主要介绍基本概念,所以是信息系统与信息化。

      对于任何事物来说,创建都是第一步。所以第二节是信息系统开发技术。

      对于系统来说,集成非常重要。所以第三节是信息系统的集成技术。

      由于信息系统与C/S紧密相关,而最紧密相关的就是软件工程。第四节为软件工程。

      第五节为新一代信息技术

      第六节为信息系统安全技术。

      第七节为信息系统的发展与应用。

      第八节为信息系统服务管理(Service Management, SM)。

      第九节为信息系统规划。

      第十节为首席信息官及其职责。

    2. 重要知识点

      个别重要知识点将会单独作为一小节内容。

    2.1 信息系统与信息化

      选择题:信息的质量属性

    • 精确性, 对事物状态描述的精准程度
    • 完整性,对事物状态描述的全面程度
    • 可靠性,指信息的来源、采集方法、传输过程是可以信任的,符合预期。
    • 及时性,指获得信息的时刻与事情发生时刻的间隔长短
    • 经济性,指信息获取、传输带来的成本在可以接受的范围之内
    • 可验证性,指信息的主要质量属性可以被证实或者证伪的程度。
    • 安全性,指在信息的生命周期中,信息可以被非授权访问的可能性,可能性越低,安全性越高。

      这段话除了是选择题这个考点以外,还包括了很多重要的关键词,如生命周期。

      选择题,信息传输模型:

      TCP/IP网络是信道。而TCP协议对应的是传输层,IP协议对应的是网络层。

      选择题,信息化的五个层次(从底层往高层走):

    • 产品信息化
    • 企业信息化
    • 产业信息化
    • 国民经济信息化
    • 社会生活信息化

      信息化的主体是全体社会成员。时域是一个长期的过程。空域是政治、经济、文化、军事和社会的一切领域;它的手段是基于现代信息技术的先进社会生产工具途径是创建信息时代的社会生产力,它的目标是使国家的综合实力、社会的文明素质和人民的生活质量全面提升。

    • ;"两网"指的是政务内网和政务外网。
    • "一站"指的是政府门户网站。
    • “四库”,即建立人口、法人单位、空间地理和自然资源、宏观经济等四个基础数据库。

    在这里插入图片描述
      左人右法,上树应用下树产业。信息资源、信息网络是中间件。

      信息资源的开发和利用是国家信息化的核心任务

      信息网络是信息资源开发和利用的基础设施。三网融合指的是电信网、广播电视网和计算机网络(电信、电话、互联网)。

      信息技术应用是信息化体系六要素中的龙头

      信息产业是信息化的物质基础

      人才是信息化的成功之本

      信息化政策和法规、标准、规范用于规范和协调信息化体系各要素之间的关系,是国家信息化快速、有序、健康和持续发展的保障

    2.2 信息系统生命周期

      软件的生命周期通常包括:可行性分析与项目开发计划、需求分析、概要设计、详细设计、编码、测试、维护等阶段。信息系统的生命周期可以简化为系统规划(可行性分析与项目开发计划)、系统分析(需求分析)、系统设计(概要设计、详细设计)、系统实施(编码、测试)、运行维护等阶段。

      另外,为了便于论述针对信息系统的项目管理,信息系统的生命周期还可以简化为立项(系统规划)、开发(系统分析、系统设计、系统实施)、运维及消亡四个阶段,在开发阶段不仅包括系统分析、系统设计、系统实施,还包括系统验收等工作。如果从项目管理的角度来看,项目的生命周期又划分为启动、计划、执行和收尾4个典型的阶段。5阶段的生命周期,如下图所示:
    在这里插入图片描述
      系统规划阶段的任务是对组织的环境、目标及现行系统的状况进行初步调查

    • 系统规划: 系统设计任务书。
    • 系统分析:系统说明书。
    • 系统设计:系统设计说明书。
    展开全文
  • 工作流学习——Activiti流程实例、任务管理

    万次阅读 多人点赞 2015-06-26 10:15:15
    6)重复3和4直到流程执行完。   查询历史任务   员工张三的任务已经完成,现在任务到部门经理李四了,如果我们现在仍然查询张三的任务的话,自然是查询不到了,只有查询李四才可以查到,...

    一、前言

     

        上一篇文章中我们将Activiti流程定义管理的知识进行了介绍,这篇文章我们继续Activiti流程实例和任务管理的学习。

     

    二、正文

     

    流程实例(ProcessInstance

     

        流程实例(ProcessInstance)和上一篇文章中流程定义(ProcessDefinition)的关系,与类和实例对象的关系有点像,ProcessDefinition是整个流程步骤的说明而ProcessInstance就是指流程定义从开始到结束的那个最大的执行路线。 

     

    执行对象(Execution

     

        提到ProcessInstance同时又会出现另一个名词,那就是执行对象(Execution),Execution是按照ProcessDefinition的规则执行的当前的路线,

     

        如果ProcessDefinition只有一个执行路线的话,那么Execution和ProcessInstance就是完全一样了如果ProcessDefinition中有多个执行路线的话,Execution和ProcessInstance可能是同一个也可能不是同一个。所以得出结论:一个流程中ProcessInstance有且只能有一个,而Execution可以存在多个。

     

    任务(Task )

     

        任务(Task)应该比较好理解,就是当流程执行到某步骤或某环节时生产的任务信息。

     

        在上篇文章中我们将如何画流程图、如何部署流程定义已经介绍,流程定义和流程实例的关系刚才已经介绍了,所有现在我们就该开始启动流程实例了:


    代码

     

    启动流程实例

    /**
     * 启动流程实例
     */
    @Test
    public void startProcessInstance() {
    	// 流程定义的key
    	String processDefinitionKey = "HelloWorld";
    	ProcessInstance pi = processEngine.getRuntimeService()// 与正在执行的流程实例和执行对象相关的Service
    			.startProcessInstanceByKey(processDefinitionKey);// 使用流程定义的key启动流程实例,key对应HelloWorld.bpmn文件中id的属性值,使用key值启动,默认是按照最新版本的流程定义启动
    	System.out.println("流程实例ID:" + pi.getId());
    	System.out.println("流程定义ID:" + pi.getProcessDefinitionId());
    }
    

    运行结果:


        流程实例ID:501

        流程定义ID:HelloWorld:2:404

     

    说明:

     

        1)数据库的act_ru_execution正在执行的执行对象表中插入一条记录

        2)在数据库的act_hi_procinst程实例的历史表中插入一条记录

        3)在数据库的act_hi_actinst活动节点的历史表中插入一条记录

        4)我们图中节点都是任务节点,所以同时也会在act_ru_task流程实例的历史表添加一条记录

        5)在数据库的act_hi_taskinst任务历史表中也插入一条记录。

     

     


    查询历史流程实例

        

        流程实例启动以后,我们也可以对某个流程实例一共一共执行了多少次流程进行查询,因为我们本例中现在刚进行了一个流程,所以目前只能查出一个流程:

    /**
     * 查询历史流程实例
     */
    @Test
    public void findHistoryProcessInstance(){
    	String processInstanceId="501";
    	HistoricProcessInstance hpi = processEngine.getHistoryService()
    			.createHistoricProcessInstanceQuery()
    			.processInstanceId(processInstanceId)
    			.singleResult();
    	System.out.println(hpi.getId() +"    "+hpi.getProcessDefinitionId()+"   "+ hpi.getStartTime()+"   "+hpi.getDurationInMillis());
    }
    

    运行结果:


        501    HelloWorld:2:404   Fri Jun 26 09:34:51 CST 2015   null

     

     

     


    查询当前的个人任务


        在上面讲流程启动后,因为该节点是任务节点所以在任务表中插入了任务的记录,现在我们就通过办理人将任务进行下查询:

    /**
     * 查询当前的个人任务
     */
    @Test
    public void findMyPersonTask() {
    	String assignee = "张三"; // TODO
    	List<Task> list = processEngine.getTaskService()// 与正在执行的任务管理相关的service
    			.createTaskQuery()// 创建任务查询对象
    			// 查询条件
    			.taskAssignee(assignee)// 指定个人任务查询,指定办理人
    			// .taskCandidateGroup("")//组任务的办理人查询
    			// .processDefinitionId("")//使用流程定义ID查询
    			// .processInstanceId("")//使用流程实例ID查询
    			// .executionId(executionId)//使用执行对象ID查询
    			/** 排序 */
    			.orderByTaskCreateTime().asc()// 使用创建时间的升序排列
    			// 返回结果集
    			// .singleResult() //返回唯一的结果集
    			// .count()//返回结果集的数量
    			// .listPage(firstResult, maxResults)//分页查询
    			.list();// 返回列表
    	if (list != null && list.size() > 0) {
    		for (Task task : list) {
    			System.out.println("任务ID:" + task.getId());
    			System.out.println("任务名称:" + task.getName());
    			System.out.println("任务的创建时间:" + task.getCreateTime());
    			System.out.println("任务的办理人:" + task.getAssignee());
    			System.out.println("流程实例ID:" + task.getProcessInstanceId());
    			System.out.println("执行对象ID:" + task.getExecutionId());
    			System.out.println("流程定义ID:" + task.getProcessDefinitionId());
    			System.out
    					.println("##################################################");
    		}
    

    运行结果:


        任务ID:504

        任务名称:提交申请

        任务的创建时间:Fri Jun 2609:34:51 CST 2015

        任务的办理人:张三

        流程实例ID:501

        执行对象ID:501

        流程定义ID:HelloWorld:2:404

        ##################################################

     

    说明:


        1)因为是任务查询,所以从processEngine中应该得到TaskService

        2)使用TaskService获取到任务查询对象TaskQuery

        3)为查询对象添加查询过滤条件,使用taskAssignee指定任务的办理者(即查询指定用户的代办任务),同时可以添加分页排序等过滤条件

        4)调用list方法执行查询,返回办理者为指定用户的任务列表

        5)任务ID、名称、办理人、创建时间可以从act_ru_task表中查到。

        6)在现在这种情况下,ProcessInstance相当于Execution

        7) 一个Task节点和Execution节点是1对1的情况,在task对象中使用Execution_来表示他们之间的关系

        8)任务ID在数据库表act_ru_task中对应“ID_”列

     


    完成任务


        查询完任务后,我们接下来将这个任务id504的任务进行完成:

    /**
     * 完成我的任务
     */
    @Test
    public void compliteMyPersonTask() {
    	// 任务ID
    	String taskId = "504";
    	processEngine.getTaskService().complete(taskId);
    	;
    	System.out.println("完成任务:任务ID:" + taskId);
    }
    

    运行结果:


        完成任务:任务ID:504

     

    说明:


        1)是完成任务,所以从ProcessEngine得到的是TaskService。

        2)当执行完这段代码,再以员工的身份去执行查询的时候,会发现这个时候已经没有数据了,因为正在执行的任务中没有数据。

        3)对于执行完的任务,activiti将从act_ru_task表中删除该任务,下一个任务会被插入进来。

        4)以”部门经理”的身份进行查询,可以查到结果。因为流程执行到部门经理审批这个节点了。

        5)再执行办理任务代码,执行完以后以”部门经理”身份进行查询,没有结果。

        6)重复第3和4步直到流程执行完。

     


    查询历史任务


        员工张三的任务已经完成,现在任务到部门经理李四了,如果我们现在仍然查询张三的任务的话,自然是查询不到了,只有查询李四才可以查到,不过我们可以通过流程实例id查询历史任务,查询历史任务可以将已经办理过的任务和现在正在执行的任务都查询出来:

    /**
     * 查询历史任务
     */
    @Test
    public void findHistoryTask(){
    	String processInstanceId="501";
    	List<HistoricTaskInstance> list = processEngine.getHistoryService()//与历史数据(历史表)相关的service
    			.createHistoricTaskInstanceQuery()//创建历史任务实例查询
    			.processInstanceId(processInstanceId)
    //				.taskAssignee(taskAssignee)//指定历史任务的办理人
    			.list();
    	if(list!=null && list.size()>0){
    		for(HistoricTaskInstance hti:list){
    			System.out.println(hti.getId()+"    "+hti.getName()+"    "+hti.getProcessInstanceId()+"   "+hti.getStartTime()+"   "+hti.getEndTime()+"   "+hti.getDurationInMillis());
    			System.out.println("################################");
    		}
    	}	
    
    }

    运行结果:


        504    提交申请   501   Fri Jun 26 09:34:51 CST2015   Fri Jun 26 09:50:50 CST 2015   959867

        ################################

        602    审批【部门经理】   501   Fri Jun 26 09:50:51 CST2015   null   null

        ################################

     


    查询流程是否结束


        我们还可以通过流程实例id查询某个流程现在的状态,是仍然在执行过程中呢,还是流程执行已经结束:

     

    /**
     * 查询流程状态(判断流程正在执行,还是结束)
     */
    @Test
    public void isProcessEnd(){
    	String processInstanceId =  "501";
    	ProcessInstance pi = processEngine.getRuntimeService()//表示正在执行的流程实例和执行对象
    			.createProcessInstanceQuery()//创建流程实例查询
    			.processInstanceId(processInstanceId)//使用流程实例ID查询
    			.singleResult();
    	
    	if(pi==null){
    		System.out.println("流程已经结束");
    	}
    	else{
    		System.out.println("流程没有结束");
    	}
    	
    }
    

    运行结果:


        流程没有结束

     

    三、总结

     

        我们这篇文章主要是流程实例、执行对象、任务以及他们之间的关系进行了学习,同时我们还将启动和查询流程实例、判断流程实例是否执行结束、查看和办理任务以及查询历史任务都进行了介绍。

     

    展开全文
  • 1.什么是任务队列? 2.你需要知道的 Celery需要一个消息通道来发送和接收消息。RabbitMQ和Redis中间人通道是目前支持的特性。但是Celery也支持很多其它正在...如果你是第一次使用Celery或者刚刚从老版本转到Celery3

    1.什么是任务队列?

    任务队列是一个将工作分布到多线程或多台机器上的机制。

    一个任务队列的输入是一个工作单元也被称为任务。专用的工作者进程将会持续监控任务队列并执行它们。

    Celery通过消息进行通信,通常通过一个中间人在客户端和工作者之间协调。客户端初始化一个任务并将它加到任务队列,中间人将其发送到工作者。

    一个Celery系统可以由多个工作者和中间人构成,这为高可用性和横向扩展提供了便利。

    Celery是用python语言实现的,但是可以使用任何语言实现其协议。除了python以外,还有node.js实现的node-celery和一个php实现的客户端。

     node-celery for Node.js, and a PHP client.

    不同语言之间可以相互操作,通过使用webhooks.using webhooks.


    2.你需要知道的

    Celery需要一个消息通道来发送和接收消息。RabbitMQ和Redis中间人通道是目前支持的特性。但是Celery也支持很多其它正在实验中的解决方案,如使用SQLite做本地开发。

    Celery可以运行在一台或多台机器上,甚至可以运行在不同的数据中心上。


    3.开始

    如果你是第一次使用Celery或者刚刚从老版本转到Celery3.0上,你需要阅读我们的开始教程。


    使用Celery的第一步

    Celery包含一系列的任务队列。你无需学习Celery要解决地所有复杂问题就可以很容易地使用它。它是围绕最佳实践设计的,所以你可以扩展和集成其它语言。

    它还提供了一些工具来帮助你在生产环境中更好地使用它。

    通过本教程你将会学习到使用Celery的所有基本知识,包括以下内容:

    a.选择并安装一个消息通道(中间人)

    b.安装Celery并创建第一个任务

    c.开始工作者并执行任务

    d.跟踪任务不同阶段的状态,并监视它们的返回值。


    Celery初看起来有些复杂,但是不用担心---本教程将会让你很快上手。我们将会尽量保持简单,以使你不必困惑于它的复杂特性。

    在学完本教程后你最好浏览文档的剩余部分,比如“下一步”教程,这里将会展示Celery的更多能力。


    选择一个中间人

    Celery需要一个解决方案来发送和接收消息,通常这是通过一个被称为“中间人”的独立服务来实现的。

    有以下几种选择:


    RabbitMQ

    RabiitMQ功能齐全,稳定,耐用而且易于安装。它是生产环境的完美选择。

    更详细地关于RabiitMQ的介绍请关注后续教程:使用RabbitMQ Using RabbitMQ


    如果你是在Ubuntu或者Debian上安装,执行以下命令:

    $ sudo apt-get install rabbitmq-server
    执行完上述命令后,中间人rabbitMQ已经在后台运行起来了。将会有下面的提示信息:

    Starting rabbitmq-server: SUCCESS.

    如果是在其它系统上使用RabbitMQ,也不用担心。下面的网页链接有类似的安装说明,包括如何在Windows上安装和使用:

    http://www.rabbitmq.com/download.html


    Redis

    redis功能也很齐全,但是数据丢失会对程序异常或者断电的情况更加敏感。形影相随详细的介绍请关注后续教程:使用Redis Using Redis



    数据库

    不推荐使用数据库作为消息队列。但是对于一些比较小的装置也足够了。你可以的选择包括:

    使用SQLAlchemy 

    使用Django Database

    如果已经在使用一个Django数据库为例,在开发的过程中使用它作为你的消息中间人将会十分方便,同时你在生产环境中可以使用其它更健壮的系统。


    其它中间人

    除了上面介绍的以外,还有一些实验中的消息通道实现可以选择,包括Amazon SQS,MongoDB和IronMQ.


    安装Celery

    Celery是一个python package Index(PyPI),所以可以通过标准的python工具如pip或easy_install来安装:

    $ pip install celery

    应用程序

    首先你需要一个Celery实例,也可以简称为Celery应用程序或者"app"。

    这个app会作为Celery中所有工作的入口,比如创建任务,管理工作者。它必须能够被其它模块导入。

    下面的教程中将所有的代码放在一个模块中,但是对于更大的工程你可能需要创建更专业的模块划分。

    下面我们创建一个tasks.py:

    from celery import Celery
    
    app = Celery('tasks', broker='amqp://guest@localhost//')
    
    @app.task
    def add(x, y):
        return x + y
    Celery的第一个参数是本模块的名称,这对于自动生成名称是需要的;第二个参数是一个broker关键字参数,用于指定你想使用的中间人的URL,这里以默认配置使用RabiitMQ。关于消息中间人你可以有更多选择,比如对于RabiitMQ使用 amqp://localhost或者对于Redis使用redis://localhost

    然后你定义了一个名为add的任务,并返回x,y之和。


    运行 

    下面通过使用worker参数执行我们的程序

    $ celery -A tasks worker --loglevel=info

    在生产环境中,你可能希望以守护进程的方式运行worker。要实现这种方式,你需要使用对应平台所提供的工具,或者一些像supervisord的工具。

    更详细的介绍请关注后续教程(以守护进程方式运行worker Running the worker as a daemon)。

    要查看完整的可用的命令行选项,请执行:

    $  celery worker --help
    还有一些其它可用的命令,也可以使用help命令:

    $ celery help

    调用任务

    你可以通过使用delay()方法来调用我们的任务。

    这是一个调用apply_async()方法的便捷方法。它能够给我们对任务执行有更多的控制。

    >>> from tasks import add
    >>> add.delay(4, 4)

    这个任务会被先前运行的worker执行,你可以通过控制台的输出来确认。

    调用任务会返回一个AsyncResult实例,可以通过它来查看任务的状态,等待任务执行结束或者获得它的返回值(如果任务执行失败,获取异常信息或者调用栈)。

    但是这些不是默认开启的,你必须配置Celery来使用一个结果后台,下一节将会详细地介绍。


    保存结果

    如果你想保存任务状态轨迹,Celery需要在某处保存或者发送这些状态。有一些内置的结果后台可以使用:SQLAlchemy/Django ORM,Memcached,Redis,AMQP(RabbitMQ),MongoDB,或者你可以自已实现。


    下面的例子使用rpc结果后台,它发送状态作为临时消息。结果后台通过backend关键字参数指定(如果你使用了配置模块,也可以通过task_result_settings来配置)。

    app = Celery('tasks', backend='rpc://', broker='amqp://')

    如果你想使用Redis作为结果后台,但是仍使用RabbitMQ作为中间人(一种十分流行的组合),你可以这样:

    app = Celery('tasks', backend='redis://localhost', broker='amqp://')

    更多关于result backend的教程请关注教程Result Backends。

    现在我们配置了结果后台,我们再次运行我们的任务。这样在你调用了任务之后,将能够获得一个AsyncResult实例。

    >>> result = add.delay(4, 4)

    ready()方法将会返回这个实例,不管任务是正在运行还是已经运行结束。

    >>> result.ready()
    False
    你也可以等待结果完成,但是很少这么做,因为这会把异步调用转换为同步调用。

    >>> result.get(timeout=1)
    8
    如果任务抛出一个异常,get()方法将会再次将其抛出。但是你可以通过指定propagate参数来覆盖这种行为。

    >>> result.get(propagate=False)
    如果任务抛出一个异常,你也可以获得原始的调用栈:

    >>> result.traceback
    
    通过celery.result  查看完整地结果对象说明。


    配置

    Celery,是一个消费者模型,本身不需要过多的操作。它有一个输入和一个输出,你需要将输入连接到一个中间人,如果需要还需要把输出连接到一个结果后台。

    默认的配置对大部分用户已经足够好了,但是你也可以通过微调来使Celery按照你的要求工作。

    通过阅读可用的选项来熟悉可以配置的选项是一个好办法。你可以通过 Configuration and defaults来了解这些选项。

    可以通过configuration模块直接对app进行配置。

    下面是一个配置任务序列化的例子:

    app.conf.task_serializer = 'json'
    你可以通过update方法来一次性地配置多个选项:

    app.conf.update(
        task_serializer='json',
        accept_content=['json'],  # Ignore other content
        result_serializer='json',
        timezone='Europe/Oslo',
        enable_utc=True,
    )
    对于大型工程来说,使用专业的配置模块十分有用。在实际使用中,硬编码任务周期间隔和任务路由选项将会十分麻烦,所以最好将这些集中配置,尤其是提供一个库让用户 控制它们期望的任务行为。你可以想象一下,系统管理可以在系统故障时简单地改变配置。

    你可以通过app.config_from_object()方法告诉Celery实例使用一个配置模块。

    app.config_from_object('celeryconfig')

    这个配置模块通常起名为'celeryconfig,但是你可以使用任何模块名称。

    一个名为'celeryconfig.py'模块必须能够被加载,位于当前目录或者PYTHONPATH。典型的celeryconfig.py像下面这样:

    celeryconfig.py:

    broker_url = 'amqp://'
    result_backend = 'rpc://'
    
    task_serializer = 'json'
    result_serializer = 'json'
    accept_content = ['json']
    timezone = 'Europe/Oslo'
    enable_utc = True
    要确保配置模块没有任何语法错误,且能够正确的工作,你可以通过下面的命令尝试导入它:

    $ python -m celeryconfig
    要查看全部的配置选项说明,可以查看:   Configuration and defaults .

    下面演示了配置文件的强大功能,你可以将一个任务路由到一个特定的队列。

    celeryconfig.py:

    task_routes = {
        'tasks.add': 'low-priority',
    }
    除了配置任务路由你还可以限制任务的频率,10/m代表这个任务在一分钟内最多只能有10个被执行。

    celeryconfig.py:

    task_annotations = {
        'tasks.add': {'rate_limit': '10/m'}
    }

    如果你正在使用RabiitMQ或者Redis作为中间人,你也可以在运行时为任务设置一个新的频率限制

    $ celery -A tasks control rate_limit tasks.add 10/m
    worker@example.com: OK
        new rate limit set successfully
    下面是一些常用的文档链接

    任务路由:Routing Tasks

    注释: task_annotations

    远程控制命令: Monitoring and Management Guide,来监控你的工作者在干些什么


    如果你想了解更多,你可以继续学习“下一步Next Steps ”教程。然后你可以开始学习用户指引User Guide.

    遇到问题

    下面的问题章节列出了使用中的常见问题:Frequently Asked Questions.

    a.如果你正在使用Debian,Ubuntu或者其它基于Debian的系统:

    Debian最近将/dev/shm文件重命名为了/run/shm.

    一种常见的解决方案是创建一个符号链接:

    # ln -s /run/shm /dev/shm

    b.其它

    如果你指定了--pidfile,--logfile,--statedb参数,你必须确保指定的目录对启动工作者的用户有读写权限。


    后台结果不能工作或者任务总是处于挂起状态:

    所有的任务默认是“挂起”状态,所以这个状态最好被称为“unkown”。当一个任务被发送后Celery不会更新任何状态,任何没有历史的任务被认为是pending状态(毕竟你知道task id)。

    1.确保任务没有开启ignore_enabled

    开启这个选项将会强制工作者忽略更新任务状态。

    2.确保task_ignore_result配置是关闭的

    3.确保没有任何老的工作者还在运行

    很容易偶然地运行多个工作者,所以运行新的工作者之前确保先前的工作者已经正常的关闭了。

    老的没有配置result backend的工作者可能劫持任务。

    可以设置--pidfile为绝对路径来避免这种情况的发生。

    4.确保客户端配置了正确的result backend.

    如果由于某些原因,客户端配置使用了不同于工作者的result backend,你可能就获取不到结果,所以通过监视它来确保采用了正确的结果后台.

    >>> result = task.delay()
    >>> print(result.backend)




    展开全文
  • 要进行NFS挂载,第一步是使虚拟机桥接上网,桥接上网下面的小框 不用勾选。下面要将其IP地址和宿主机IP配置在同一网段,破费周折终于成功。 记录下步骤: 一,我最初是参照...

    要进行NFS挂载,第一步是使虚拟机桥接上网,桥接上网下面的小框 不用勾选。下面要将其IP地址和宿主机IP配置在同一网段,破费周折终于成功。

    记录下步骤:

    一,我最初是参照http://hi.baidu.com/%D1%E3%C9%F9%C1%F4/blog/item/b0045efd9c02773608244d01.html这里,进行了以下三个步骤:

    1),# ifconfig eth0 up   (注解:系统装好后默认的网卡是eth0,此命令将这块网卡激活。)

    2),# chkconfig --level 2345 network on (注解:第二步:设置网卡进入系统时启动。想要每次开机就可以自动获取IP地址上网,就要设置网络服务在系统启动时也启动。Linux有一点与windows不同的是很多服务默认是停止的,而且你在某次使用该服务时启动这个服务,但是没设置它为默认启动,则下次进入系统这个服务依然是停止的。下面是设置网络服务在系统启动时也启动的方法。使用chkconfig命令让网络服务在系统启动级别是2345时默认启动。)

    3),为eth0新建一个网卡配置文件。

    命令;  #gedit  /etc/sysconfig/network-scripts/ifcfg-eth0 

    然后在里面将以下内容写上:

    DEVICE=eth0     
    IPADDR=192.168.2.211       (注:IP地址,此IP和宿主机同一网段,但不能相同)
    NETMASK=255.255.255.0    (子网掩码)
    GATEWAY=192.168.2.1           (这个是网关,这里我配置成和主机网关一样就可以了。网上有教程说,虚拟机的网关要配置成宿主机的实际IP地址,这是不需要的经我验证!大家  一定特此注意!


    DNS1=192.168.2.1                  (注意这里要写成DNS1,内容和宿主机一样即可。写成DNS反而不识别了,他奶奶的。。。。。。。。。。。。真操蛋!
    BOOTPROTO=static
    ONBOOT=yes

    保存后,用service network start 或者 service network restart ,提示出错,错误信息如下:

    RTNETLINK answers: File exists

    RTNETLINK answers: File exists

    RTNETLINK answers: File exists

    RTNETLINK answers: File exists

    会出现好几个,这种错误提示!

    参考:http://www.cnblogs.com/shawnloong/archive/2011/11/23/2260757.html这篇文章。这里主要是为什么呢? 原来fedora除了有个network管理网卡信息外,还有一个NetworkManager来管理,两个冲突了。我们要把NetworkManager关闭掉。这一点和ubuntu有点小不同,我记得ubuntu是利用NetworkManager来进行管理的。

    关闭 的方法是:

    #chkconfig --level 0123456 NetworkManager off

    #service NetworkManager stop
    #service network stop
    #service network start

    好了,重新再 service network restart以下 看看能上网不???

    我的好像还是不能上网,又参照http://www.linuxdiyf.com/bbs/viewthread.php?tid=204442&extra=page%3D&page=1这篇文章里,把上面说的第一篇文章里的DNS换成了DNS1,然后要再保存。如果还不能上网,就修改下配置文件里的IP,有可能是IP和其他电脑冲突了。 我的宿主机IP是192.168.2.209,虚拟机Fedora实验到192.168.2.211就可以上网了 哈哈!

    我最终的配置文件内容是:

    DEVICE=eth0
    TYPE=Ethernet
    BOOTPROTO=static
    IPV6INIT=no


    ONBOOT=yes
    #HWADDR=14-DA-E9-E1-91-94(这句话是不需要的http://www.linuxdiyf.com/bbs/viewthread.php?tid=204442&extra=page%3D&page=1文章上说配置成电脑的硬件地址,实际是不需要的!


    USERCTL=yes
    PEERDNS=yes
    NM_CONTROLLED=yes
    IPADDR=192.168.2.211
    DNS1=192.168.2.1   (一定要写成DNS1,写成DNS反而不中,千万注意!我特意进行实验了!!!写成DNS,百度打不开!
    GATEWAY=192.168.2.1    (网关写成和宿主机一样即可,不需要写成宿主机的实际IP
    NETMASK=255.255.255.0





    展开全文
  • java实现简单学生信息管理系统

    万次阅读 多人点赞 2018-11-10 14:53:08
    ** ## java实现简单学生信息管理系统(6) ** 1、首先定义个学生信息主体类 package project; public class Stu_class { String name; String stu_id; String sex; String phone_num; int age; public ...
  • 信息管理与信息系统

    万次阅读 多人点赞 2009-06-26 18:15:00
    什么信息管理与信息系统?信息管理 :是指在整个管理过程中,人们收集、加工和输入、输出的信息的总称。信息管理的过程包括信息收集、信息传输、信息加工和信息储存。信息收集就是对原始信息的获取。信息传输是...
  • 一、安装驱动程序的教程 编译器: ...第一步:在微软官网下载一个JDBC驱动程序。 也可以在这里下载: 链接:https://pan.baidu.com/s/1oIFzh2EKJx7116fNeFk6bw 提取码:ccif 上面的驱动程序就是...
  • 详解第一范式、第二范式、第三范式、BCNF范式

    万次阅读 多人点赞 2019-03-02 16:08:45
    文章目录第一范式定义以及分析:问题研究:第二范式必备知识点函数依赖:码:非主属性 :定义分析:解决办法:问题研究:第三范式:定义:分析:问题研究:BCNF范式分析问题研究小结: 第一范式 定义以及分析: 首先是...
  • 作为信息管理系统的项目乙方,如何在甲方的要求下做好需求调研工作,是项目经理必须考虑的问题。下面就这几年的项目经理经验谈谈几点看法:
  • 学生宿舍信息管理系统

    千次阅读 多人点赞 2020-12-31 15:20:16
    本系统专门针对学校的公寓管理而开发的个功能齐全、操作简单的学生公寓管理系统。适合学校的宿舍管理人员使用。本系统实现以下基本功能:管理员可以对公寓进行全程管理,不仅可以管理学生,还可以管理寝室人员及...
  • 学生信息管理系统(Java+JSP+MySQL)

    万次阅读 多人点赞 2019-01-27 22:34:46
    本篇博客展示的学生信息管理系统(Java+JSP+MySQL)仅包含对学生信息的增删改查操作,前端页面仅略作修饰; 本篇博客以代码展示为主,具体功能实现的详细步骤请返回目录阅读其他章节内容; 本篇博客展示的代码与...
  • 如何看待自己的第一工作

    万次阅读 2012-11-17 10:24:07
     第一步:选择城市。核心城市意味着更多机会、更高眼界、更好薪酬、更多竞争和更高成本。在职业初期优先选择发达三大城市经济圈工作,原因是要把所学尽可能找到印证的舞台和机会。之后,年龄更加成熟,可以去二三线...
  • 学生信息管理系统之用户登录:用户登录流程

    千次阅读 热门讨论 2018-05-03 19:18:16
    第一步:获取本计算机用户名Private Sub Form_Load()重点内容 Dim sBuffer As String '缓冲器 Dim lSize As Long sBuffer = Space$(255) '缓冲器容量255Byte,sBuffer为255个空格字符串 lSize = Len(sBuffer) '...
  • 杨争管理实践日志---客户第一、团队第二、个人第三 作者: 杨争 | 可以转载, 转载时务必以超链接形式标明文章原始出处和作者信息网址: http://blog.csdn.net/yzhz/archive/2009/06/29/4306861.aspx  这里所说的...
  • CDI进阶 CDI事件

    万次阅读 2016-01-11 17:03:27
    其实CDI的事件相当之简单。只需要个注解就够了。 知识点只有两个: 1 @Observes注解 ...我们先写个CDI管理的BEAN。 package com.rschy.cdievent; import javax.enterprise.context.RequestS
  • 工作总结10:毕业这一年的收获

    万次阅读 多人点赞 2017-07-05 22:21:08
    总结去年七月初毕业来到上海,转眼就又是七月了,这一年还是经历了不少事,回头看看,这年中的大多数选择还是比较满意的。今天趁着懒癌没发作,总结一下这一年的收获吧。当前状况毕业一年,上海,创业公司,安卓...
  • 个非常好的项目管理系统--ONES

    千次阅读 多人点赞 2020-09-07 17:59:46
    市面上的项目管理系统像雨后春笋般的发布,而真正好用的并没有几个,要不就是功能不完善,在要不然就是天价。难道真就没有便宜且好用的管理系统了吗。...第一步:新建项目类型 可以创建一般能用到的各种样式
  • 工作流学习——Activiti整体认识二

    万次阅读 多人点赞 2015-06-22 17:47:32
    我们本篇文章主要讲述了activiti的环境准备包含各个软件的版本和安装流程设计器,接下来我们讲解了两种方式来创建activiti的23张表,还夹杂着个数据库连接url的写法,接下来是activiti核心对象ProcessEngine,以及...
  • 学生信息管理系统项目完成总结

    千次阅读 2014-10-28 12:44:09
    学生信息管理系统项目完成总结--菜鸟项目完结后的感悟和心得体会
  • 工作流Activity框架入门(

    万次阅读 多人点赞 2016-06-05 23:02:42
    Activity工作流入门 1. 工作流概念 工作流(Workflow),就是“业务过程的部分或整体在计算机应用环境下的自动化”,它主要解决的是...工作管理系统(Workflow Management System, WfMS)是个软件系统,它完成工作
  • 第一篇 微信商城 开发前的准备工作

    万次阅读 多人点赞 2014-01-30 10:38:46
    随着腾讯微信公众平台号的开放,围绕着微信的各种开发和营销如火如荼。很多商家也开始在微信上做文章,想充分利用微信平台4亿多的粉丝群体来进行各种营销和...作为本系列的第一篇,重点介绍微信平台和开发环境的搭建。
  • 第一步:在AccountModels.cs, 增加一个名为ExtraUserInfo的新类。这个类代表了将在数据库创建的新表。 [Table( " ExtraUserInfo " )] public class ExternalUserInfo { [Key] ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 380,397
精华内容 152,158
关键字:

信息管理工作的第一步是什么