windchill 如何创建一个自定义定时任务
1.定义任务执行类
package ext.test.queue;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.Console;
public class TestQueueTaskHandler {
/**
* 测试计划任务执行方法,必须使用static修饰,否则会报错
*/
public static void handle() {
Console.log("Test Task : Start!!!");
Console.log("Test Task : Execution Time = " + DateUtil.now());
Console.log("Test Task : end !!!");
}
}
2.注册队列
package ext.test.queue;
import java.sql.Timestamp;
import java.util.Enumeration;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import wt.fc.PersistenceHelper;
import wt.fc.QueryResult;
import wt.org.OrganizationServicesHelper;
import wt.org.WTPrincipalReference;
import wt.org.WTUser;
import wt.pds.StatementSpec;
import wt.query.QuerySpec;
import wt.query.SearchCondition;
import wt.scheduler.ScheduleItem;
import wt.scheduler.SchedulingHelper;
import wt.util.WTException;
public class TestQueueRegistrar {
private static final Logger logger = LoggerFactory.getLogger(TestQueueRegistrar.class);
private static final String schedule_item_name = "KQ_CreateQueueTest";
private static final String Schedule_queue_name = "KQ_timingQueueTest";
/** 在windchill控制台中调用此方法 */
public static void main(String[] args) throws WTException {
if ("test".equals(args[0])) {
QueryResult queryResult1 = getScheduleItem(schedule_item_name, Schedule_queue_name);
while (queryResult1.hasMoreElements()) {
ScheduleItem scheduleItem = (ScheduleItem) queryResult1.nextElement();
PersistenceHelper.manager.delete(scheduleItem);
}
createScheduleQueue();
}
}
/** 创建计划队列 */
private static void createScheduleQueue() throws WTException {
System.out.println("开始创建计划执行队列... ...");
// 创建计划队列对象
ScheduleItem item = ScheduleItem.newScheduleItem();
// 设置该队列的描述信息
item.setItemName(schedule_item_name);
item.setItemDescription("测试计划队列执行");
// 设置队列的名称,一般以英文命名
item.setQueueName(Schedule_queue_name);
// 设置要执行的类名
item.setTargetClass(TestQueueTaskHandler.class.getName());
// 设置要执行的类方法名
item.setTargetMethod("handle");
item.setToBeRun(-1L);
// 设置开始时间,在这里我设置为队列创建后立即执行
Timestamp timestamp = Timestamp.valueOf("2020-10-24 00:00:00.000"); // 设置2020年10月24号
item.setStartDate(timestamp);
// 设置执行周期,这里设置为每隔5分钟执行一次
item.setPeriodicity(300);
// 设置执行该任务的用户,如果是操作Windchill对象的话会牵扯到权限控制,这里设置为管理员执行
WTUser administrator = getUserFromName();
item.setPrincipalRef(WTPrincipalReference.newWTPrincipalReference(administrator));
// 最后,将计划任务对象添加到队列
item = SchedulingHelper.service.addItem(item, null);
System.out.println("计划执行队列创建完毕... ..." + "'启动时间为'" + item.getStartDate() + "',间隔为'" + item.getPeriodicity() + "'!");
}
/**
* 根据用户名获取 WTUser 对象。
* @return WTUser 用户对象
* @throws WTException 如果找不到指定用户
*/
@SuppressWarnings("deprecation")
private static WTUser getUserFromName() throws WTException {
Enumeration<?> users = OrganizationServicesHelper.manager.findUser(WTUser.NAME, "wcadmin");
if (users.hasMoreElements()) {
return (WTUser) users.nextElement();
}
throw new WTException("系统中不存在用户名为 '" + "wcadmin" + "' 的用户!");
}
/**
* 根据计划任务名称和队列名称获取计划任务对象
* @param schedule_item_name 计划任务名称
* @param Schedule_queue_name 计划队列名称
* @return QueryResult 计划任务对象
*/
private static QueryResult getScheduleItem(String schedule_item_name, String Schedule_queue_name) throws WTException {
QuerySpec queryspec = new QuerySpec(ScheduleItem.class);
queryspec.appendWhere(new SearchCondition(ScheduleItem.class, ScheduleItem.ITEM_NAME, SearchCondition.EQUAL, schedule_item_name), new int[] { 0 });
queryspec.appendAnd();
queryspec.appendWhere(new SearchCondition(ScheduleItem.class, ScheduleItem.QUEUE_NAME, SearchCondition.EQUAL, Schedule_queue_name), new int[] { 0 });
QueryResult queryResult = PersistenceHelper.manager.find((StatementSpec) queryspec);
System.out.println(">>>" + queryspec);
System.out.println(">>>" + queryResult.size());
return queryResult;
}
}
3.控制台执行注册命令
windchill ext.test.queue.TestQueueRegistrar test
4.查看队列效果



浙公网安备 33010602011771号