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.查看队列效果

image
image

posted @ 2025-11-28 15:45  Wzzzz~  阅读(4)  评论(0)    收藏  举报