windchill交流第五篇:创建计划执行队列执行计划任务

所有文章全部原创,均经过测试,如有不对,欢迎留言指正。
本文只描述如何创建队列,由于我本身就是做开发的,这篇文章也是写给开发人员看的,所以直接从代码入手可能更直观点。
可以通过计划任务队列去有规律有间隔的执行一些任务,和定时器类似。
请按照以下步骤进行:
第一步,编写创建队列对象的代码,详细说明参见代码:
编写两个类com.queue.CreateQueue 和 com.queue.TestQueue,CreateQueue 里编写创建队列的代码,TestQueue里编写计划任务队列执行时所调用的类和方法。
CreateQueue.java文件如下:
Java代码 
1. 
2./**project windchillTools**/ 
3. 
4.package com.queue;  
5. 
6.import java.sql.Timestamp;  
7.import java.util.Date;  
8.import java.util.Enumeration;  
9. 
10.import wt.org.OrganizationServicesHelper;  
11.import wt.org.WTPrincipalReference;  
12.import wt.org.WTUser;  
13.import wt.scheduler.ScheduleItem;  
14.import wt.scheduler.SchedulingHelper;  
15.import wt.util.WTException;  
16. 
17./** 
18. * <p>Description:  </p> 
19. * @author: ZhongBinpeng 
20. * @time: Oct 29, 2010 10:56:35 PM 
21. * @version 1.0 
22. */ 
23. 
24.public class CreateQueue {  
25.      
26.    public static void main(String args[]) throws WTException{  
27.        createScheduleQueue();  
28.    }  
29.    /** 
30.     * 创建计划执行队列,只需要执行一次即可,以后当windchill服务启动则按照设定的时间定时执行任务 
31.     * 11:25:38 PM 
32.     * @throws WTException  
33.     */ 
34.    public static void createScheduleQueue() throws WTException{  
35.        System.out.println("开始创建计划执行队列... ...");  
36.        //创建计划队列对象  
37.        ScheduleItem si = ScheduleItem.newScheduleItem();  
38.        //设置该队列的描述信息  
39.        si.setItemDescription("测试计划执行队列");  
40.        //设置队列的名称,一般以英文命名  
41.        si.setQueueName("TestScheduleItem");  
42.        //设置要执行的类和方法  
43.        //类名  
44.        si.setTargetClass(TestQueue.class.getName());  
45.        //方法名  
46.        si.setTargetMethod("testQueue");  
47.        si.setToBeRun(-1l);  
48.        //设置开始时间,在这里我设置为队列创建后立即执行  
49.        Date today = new Date();  
50.        Timestamp timestamp = new Timestamp(today.getYear(), today.getMonth(),today.getDate(),  
51.                00, 00, 0, 0); //这四个参数依次为小时,分,秒,毫秒  
52.        si.setStartDate(timestamp);  
53.        //设置执行周期,这里设置为每隔10秒执行一次  
54.        si.setPeriodicity(10);  
55.        //设置执行该任务的用户,如果是操作Windchill对象的话会牵扯到权限控制,这里设置为管理员执行  
56.        WTUser administrator = getUserFromName("Administrator");  
57.        WTPrincipalReference p = null;  
58.        si.setPrincipalRef(WTPrincipalReference.newWTPrincipalReference(administrator));  
59.        //最后,将计划任务对象添加到队列  
60.        si = SchedulingHelper.service.addItem(si, null);  
61.                  System.out.println("计划执行队列创建完毕... ..." + "'启动时间为'" + si.getStartDate() + "',间隔为'" + si.getPeriodicity() + "'!");  }  
62.      
63.      
64.    /** 
65.     * 根据用户名得到用户 
66.     * @param name 用户名 
67.     * @throws WTException  
68.     * return  WTUser 
69.     */ 
70.    public static WTUser getUserFromName(String name) throws WTException {  
71.        Enumeration enumUser = OrganizationServicesHelper.manager.findUser(WTUser.NAME, name);  
72.        WTUser user = null;  
73.        if (enumUser.hasMoreElements())  
74.            user = (WTUser) enumUser.nextElement();  
75. 
76.        if (user == null) {  
77.            enumUser = OrganizationServicesHelper.manager.findUser(WTUser.FULL_NAME, name);  
78.            if (enumUser.hasMoreElements())  
79.                user = (WTUser) enumUser.nextElement();  
80.        }  
81. 
82.        if (user == null) {  
83.            throw new WTException("系统中不存在用户名为'" + name + "'的用户!");  
84.        }  
85. 
86.        return user;  
87.    }  
88. 
89.} 

/**project windchillTools**/

package com.queue;

import java.sql.Timestamp;
import java.util.Date;
import java.util.Enumeration;

import wt.org.OrganizationServicesHelper;
import wt.org.WTPrincipalReference;
import wt.org.WTUser;
import wt.scheduler.ScheduleItem;
import wt.scheduler.SchedulingHelper;
import wt.util.WTException;

/**
* <p>Description:  </p>
* @author: ZhongBinpeng
* @time: Oct 29, 2010 10:56:35 PM
* @version 1.0
*/

public class CreateQueue {

public static void main(String args[]) throws WTException{
createScheduleQueue();
}
/**
* 创建计划执行队列,只需要执行一次即可,以后当windchill服务启动则按照设定的时间定时执行任务
* 11:25:38 PM
* @throws WTException
*/
public static void createScheduleQueue() throws WTException{
System.out.println("开始创建计划执行队列... ...");
//创建计划队列对象
ScheduleItem si = ScheduleItem.newScheduleItem();
//设置该队列的描述信息
si.setItemDescription("测试计划执行队列");
//设置队列的名称,一般以英文命名
si.setQueueName("TestScheduleItem");
//设置要执行的类和方法
//类名
si.setTargetClass(TestQueue.class.getName());
//方法名
si.setTargetMethod("testQueue");
si.setToBeRun(-1l);
//设置开始时间,在这里我设置为队列创建后立即执行
        Date today = new Date();
        Timestamp timestamp = new Timestamp(today.getYear(), today.getMonth(),today.getDate(),
                00, 00, 0, 0); //这四个参数依次为小时,分,秒,毫秒
si.setStartDate(timestamp);
//设置执行周期,这里设置为每隔10秒执行一次
si.setPeriodicity(10);
//设置执行该任务的用户,如果是操作Windchill对象的话会牵扯到权限控制,这里设置为管理员执行
WTUser administrator = getUserFromName("Administrator");
WTPrincipalReference p = null;
si.setPrincipalRef(WTPrincipalReference.newWTPrincipalReference(administrator));
//最后,将计划任务对象添加到队列
si = SchedulingHelper.service.addItem(si, null);
                  System.out.println("计划执行队列创建完毕... ..." + "'启动时间为'" + si.getStartDate() + "',间隔为'" + si.getPeriodicity() + "'!"); }


    /**
     * 根据用户名得到用户
     * @param name 用户名
     * @throws WTException
     * return  WTUser
     */
    public static WTUser getUserFromName(String name) throws WTException {
        Enumeration enumUser = OrganizationServicesHelper.manager.findUser(WTUser.NAME, name);
        WTUser user = null;
        if (enumUser.hasMoreElements())
            user = (WTUser) enumUser.nextElement();

        if (user == null) {
            enumUser = OrganizationServicesHelper.manager.findUser(WTUser.FULL_NAME, name);
            if (enumUser.hasMoreElements())
                user = (WTUser) enumUser.nextElement();
        }

        if (user == null) {
            throw new WTException("系统中不存在用户名为'" + name + "'的用户!");
        }

        return user;
    }

}

TestQueue .java文件如下:

Java代码 
1./**project windchillTools**/ 
2. 
3.package com.queue;  
4. 
5.import java.text.SimpleDateFormat;  
6.import java.util.Date;  
7.import java.util.TimeZone;  
8. 
9.import wt.admin.AdministrativeDomainHelper;  
10.import wt.method.MethodContext;  
11.import wt.session.SessionAuthenticator;  
12. 
13./** 
14. * <p>Description:  </p> 
15. * @author: Zhong 
16. * @time: Oct 29, 2010 11:29:46 PM 
17. * @version 1.0 
18. */ 
19. 
20.public class TestQueue {  
21.      
22.    /** 
23.     * 计划队列执行时调用的方法 
24.     * 11:49:00 PM 
25.     */ 
26.    public static void testQueue(){  
27.        TimeZone zone = TimeZone.getTimeZone("GMT+8:00");  
28.        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");  
29.        sdf.setTimeZone(zone);  
30.        String currentTime = sdf.format( new Date());  
31.        System.out.println("测试计划执行队列,当前时间:" + currentTime );  
32.        //在这里编写处理业务相关的代码,如果操作Windchill持久化对象时出现"找不到活动方法的上下文"错误时,可增加以下代码进行处理  
33.        MethodContext mc = MethodContext.getContext(Thread.currentThread());  
34.        if (mc == null)  
35.            mc = new MethodContext(null, null);  
36.        if (mc.getAuthentication() == null) {  
37.            SessionAuthenticator sa = new SessionAuthenticator();  
38.            mc.setAuthentication(sa.setUserName(AdministrativeDomainHelper.ADMINISTRATOR_NAME));  
39.        }  
40.    }  
41.} 
/**project windchillTools**/

package com.queue;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;

import wt.admin.AdministrativeDomainHelper;
import wt.method.MethodContext;
import wt.session.SessionAuthenticator;

/**
* <p>Description:  </p>
* @author: Zhong
* @time: Oct 29, 2010 11:29:46 PM
* @version 1.0
*/

public class TestQueue {

/**
* 计划队列执行时调用的方法
* 11:49:00 PM
*/
public static void testQueue(){
TimeZone zone = TimeZone.getTimeZone("GMT+8:00");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
sdf.setTimeZone(zone);
String currentTime = sdf.format( new Date());
System.out.println("测试计划执行队列,当前时间:" + currentTime );
//在这里编写处理业务相关的代码,如果操作Windchill持久化对象时出现"找不到活动方法的上下文"错误时,可增加以下代码进行处理
MethodContext mc = MethodContext.getContext(Thread.currentThread());
if (mc == null)
mc = new MethodContext(null, null);
if (mc.getAuthentication() == null) {
SessionAuthenticator sa = new SessionAuthenticator();
mc.setAuthentication(sa.setUserName(AdministrativeDomainHelper.ADMINISTRATOR_NAME));
}
}
}


第二步,启动windchill服务,shell中执行以下命令运行CreateQueue的main方法

Ruby代码 
1.java com.queue.CreateQueue 
java com.queue.CreateQueue
弹出授权请求,输入管理员的用户名和密码,因为其他用户是没有权限创建队列的。

观察shell和methodServer中的输出信息,发现并未出错,同时,正在以10秒的间隔时间执行TestQueue类里的TestQueue()方法。
打开站点-实用程序-队列管理器,发现已存在名为TestScheduleItem的队列。
shell中的输出信息

methodServer中的输出信息

队列管理器

至此,计划执行任务队列创建完毕。
PS:
本文只是简单的描述了如何去创建一个队列对象。如果想写的更全面些,以下代码可能会有用处:
1,通过ScheduleItem对象的ITEM_NAME和QUEUE_NAME查询一个ScheduleItem对象

Java代码 
1./** 
2. * 通过ScheduleItem对象的ITEM_NAME和QUEUE_NAME查询一个ScheduleItem对象 
3. * 12:25:41 AM 
4. * @param schedule_item_name 
5. * @param Schedule_queque_name 
6. * @return 
7. * @throws WTException 
8. */ 
9.public static ScheduleItem getScheduleItemFabu(String schedule_item_name,String Schedule_queque_name) throws WTException {  
10.    ScheduleItem scheduleItem = null;  
11.    QuerySpec queryspec = new QuerySpec(ScheduleItem.class);  
12.    queryspec.appendWhere(new SearchCondition(ScheduleItem.class, ScheduleItem.ITEM_NAME, SearchCondition.EQUAL,  
13.            schedule_item_name));  
14.    queryspec.appendAnd();  
15.    queryspec.appendWhere(new SearchCondition(ScheduleItem.class, ScheduleItem.QUEUE_NAME, SearchCondition.EQUAL,  
16.            Schedule_queque_name));  
17.    queryspec.appendOrderBy(ScheduleItem.class, ScheduleItem.START_DATE, true);  
18. 
19.    QueryResult queryResult = PersistenceHelper.manager.find(queryspec);  
20.    while (queryResult.hasMoreElements()) {  
21.        scheduleItem = (ScheduleItem) queryResult.nextElement();  
22.    }  
23. 
24.    return scheduleItem;  
25.} 
    /**
     * 通过ScheduleItem对象的ITEM_NAME和QUEUE_NAME查询一个ScheduleItem对象
     * 12:25:41 AM
     * @param schedule_item_name
     * @param Schedule_queque_name
     * @return
     * @throws WTException
     */
    public static ScheduleItem getScheduleItemFabu(String schedule_item_name,String Schedule_queque_name) throws WTException {
        ScheduleItem scheduleItem = null;
        QuerySpec queryspec = new QuerySpec(ScheduleItem.class);
        queryspec.appendWhere(new SearchCondition(ScheduleItem.class, ScheduleItem.ITEM_NAME, SearchCondition.EQUAL,
        schedule_item_name));
        queryspec.appendAnd();
        queryspec.appendWhere(new SearchCondition(ScheduleItem.class, ScheduleItem.QUEUE_NAME, SearchCondition.EQUAL,
        Schedule_queque_name));
        queryspec.appendOrderBy(ScheduleItem.class, ScheduleItem.START_DATE, true);

        QueryResult queryResult = PersistenceHelper.manager.find(queryspec);
        while (queryResult.hasMoreElements()) {
            scheduleItem = (ScheduleItem) queryResult.nextElement();
        }

        return scheduleItem;
    }

2,修改已存在的队列对象的相关属性
在获取ScheduleItem对象后,可修改其相关属性,下面是一些示例:

Java代码 
1.ScheduleItem  si= getScheduleItemFabu("a","b");  
2.si.setStartDate(timestamp);  
3.si.setItemDescription("修改队列描述");  
4.si.setPeriodicity(60);  
5.si.setToBeRun(-1l);  
6.//保存修改后的队列对象  
7.si=SchedulingHelper.service.modifyItem(si); 
ScheduleItem  si= getScheduleItemFabu("a","b");
si.setStartDate(timestamp);
si.setItemDescription("修改队列描述");
si.setPeriodicity(60);
si.setToBeRun(-1l);
//保存修改后的队列对象
si=SchedulingHelper.service.modifyItem(si);

猜你喜欢

转载自52145632.iteye.com/blog/1092785