在windchill中队列分:排程,汇聚,进程
进程:我们通常在需要立即执行的任务,队列一般以业务模块+ProcessQueue结尾,如commonProcessQueue;

排程:我们通常在需要计划性执行某些任务时使用,队列一般以业务名称+ScheduleQueue,如commonScheduleQueue

汇聚:用的比较少,理解为系统本身相关的任务,WfPropagationQueue,DeleteCompletedWorkItemsQueue,WfUserWorkQueue等任务

PS:代码中如果通过队列去调用某个方法,方法一定得是静态方法,参数不能是对象
如:

下面我们介绍一下如何通过代码获取队列

public static ProcessingQueue getQueue(final String queueName) throws WTException {ProcessingQueue processingQueue = QueueHelper.manager.getQueue(queueName);String user = "";try {user = SessionHelper.manager.getPrincipal().getName();SessionHelper.manager.setAdministrator();if (processingQueue == null) {processingQueue = QueueHelper.manager.createQueue(queueName);}if (!processingQueue.isEnabled()) {QueueHelper.manager.enableQueue(processingQueue, true);QueueHelper.manager.startQueue(processingQueue);            }            } finally {if (StringUtils.isNotBlank(user)) {SessionHelper.manager.setPrincipal(user);}}return processingQueue;}

如何添加一个队列条目

public static boolean addEntry(String queueName,String methodName, String className, Class[] argsType, Object[] args) throws RemoteException, InvocationTargetException, WTException{if (!RemoteMethodServer.ServerFlag) {try {Class[] argType = {String.class,String.class,Class[].class,Object[].class };Object[] arg = { methodName,className,argsType,args };return (Boolean)RemoteMethodServer.getDefault().invoke("addEntry",CUReferenceUtil.class.getName(), null,argType,arg);} catch (Exception e) {e.printStackTrace();}} else {String user = "";try {user = SessionHelper.manager.getPrincipal().getName();SessionHelper.manager.setAdministrator();ProcessingQueue queue = getQueue(queueName);QueueEntry entry = queue.addEntry(SessionHelper.manager.getAdministrator(), methodName, className, argsType, args);logger.info(queueName + "添加条目完毕>>>>>>>>>>>>>>>>");if (entry != null) {return true;}} finally {if (StringUtils.isNotBlank(user)) {SessionHelper.manager.setPrincipal(user);}}}return false;}

在实际业务场景中我们会用到队列池,通常是在需要处理大批量业务数据且并发的场景:

如现在我需要做一个导出某个业务流程报表的业务,流程评审对象部件能卷积很多子项,每个子项需要导出一个文件,我们改如何做

 public static void createBOMReportWithWTDocument(Set ha, String ecrNmber, String processid) throws Exception {System.out.println(">>>>createBOMReportWithWTDocument-GSCR流程报表 ecrNmber[" +ecrNmber + "] SBA总数=" + ha.size());int sbaCount = ha.size();if (sbaCount == 0 || StringUtils.isBlank(ecrNmber)) {return;}//查看系统中GSCR队列中等待的条目数int initGscrProcessQueueCount =10;Map<String, Integer> gscrProcessQueuePool = new HashMap<String, Integer>();for (int gscrIndex = 0; gscrIndex <initGscrProcessQueueCount; gscrIndex++) {ProcessingQueue queue = QueueHelper.manager.getQueue("GSCRProcessQueue"+gscrIndex);if(null == queue){queue = GSCRWorkflowUtility.getQueue("GSCRProcessQueue"+gscrIndex);}gscrProcessQueuePool.put(queue.getName(), queue.getWaitingEntryCount());System.out.println("GSCR流程报表导出队列名称 [" +queue.getName() + "] 等待条目总数=" + queue.getWaitingEntryCount());}// 对集合进行排序List<Map.Entry<String, Integer>> allGscrProcessQueue = new ArrayList<Map.Entry<String, Integer>>(gscrProcessQueuePool.entrySet());Collections.sort(allGscrProcessQueue, new Comparator<Map.Entry<String, Integer>>() {public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {return (o1.getValue() - o2.getValue());}});//当前流程总共需要导报表的数据除以报表导出队列总数,计算平均每个队列需要分配数量double average = ext.source.gscr.sap.GSCRWorkflowUtility.round(sbaCount, initGscrProcessQueueCount, 1);// 根据等待条目最少,决定有限将队列条目择优先放在哪一个队列中Class[] argType = { String.class, String.class, String.class };addedEntry(ha, ecrNmber, allGscrProcessQueue, average, argType);}
public static double round(int v1, int v2, int scale) {if (scale < 0) {throw new IllegalArgumentException("此参数错误");}BigDecimal one = new BigDecimal(Double.toString(v1));BigDecimal two = new BigDecimal(Double.toString(v2));return one.divide(two, scale, BigDecimal.ROUND_HALF_UP).doubleValue();}

通过命令行的方式查看队列,创建队列,设置分组等:
在windchill shell中我们可以输入:windchill wt.queue.QueueManager

有时候创建队列会提示已经超过系统最大数量,我们可通过增加如下配置来实现:

1) windchill shell中执行命令设置wt.queue.max.processQueues最大值:
xconfmanager -s wt.queue.max.processQueues=1000 -t /codebase/wt.properties –p

重新设置队列为SEVERE状态就可以重新执行的逻辑:

 /*** 重置队列条目的状态为指定状态* @param entryNumber 条目编号* @param targetState   目标状态,默认为FAILED* @throws Exception*/public static void resetEntryStateToServer(String entryNumber, String targetState) throws Exception{CSCDB cscdb = null;PreparedStatement prep = null;try {cscdb = new CSCDB();Connection connection = cscdb.getConnection();connection.setAutoCommit(false);String sql4RestEntryState = "";if(StringUtils.isBlank(entryNumber)){return;}entryNumber = entryNumber.trim();if(StringUtils.isNotBlank(targetState)){targetState = targetState.trim();sql4RestEntryState = "update wcadmin.queueentry t set t.codec5='SEVERE' where t.entrynumber=?";prep = connection.prepareStatement(sql4RestEntryState);prep.setString(1, targetState.toUpperCase());prep.setString(2, entryNumber);}else{sql4RestEntryState = "update wcadmin.queueentry t set t.codec5='FAILED' where t.entrynumber=?";prep = connection.prepareStatement(sql4RestEntryState);prep.setString(1, entryNumber);}prep.executeUpdate();cscdb.commit();} catch (Exception e) {e.printStackTrace();cscdb.rollback();throw new Exception("Modify queueentry failure");} finally {cscdb.close();}}

移动某个processQueue条目到指定的ProcessQueue

/*** 移动某个processQueue条目到指定的ProcessQueue* @param afterQueueName  指定队列名称* @param beforeQueueName 之前队列名称* @param entryNumber 条目编号* @throws SQLException* @throws Exception* @author wonly.wu 2018-08-06*/public static void moveEntry2TargetQueue(String afterQueueName,String beforeQueueName,String entryNumber) throws SQLException, Exception{String sql4RestEntryQueueName = "";if(StringUtils.isNotBlank(afterQueueName)){afterQueueName = afterQueueName.trim();}if(StringUtils.isNotBlank(entryNumber)){entryNumber = entryNumber.trim();}CSCDB cscdb = null;PreparedStatement prep = null;try {cscdb = new CSCDB();Connection connection = cscdb.getConnection();connection.setAutoCommit(false);if(StringUtils.isBlank(beforeQueueName)){sql4RestEntryQueueName = "update wcadmin.queueentry t set t.ida3a5=(select q.ida2a2 from wcadmin.processingqueue q where q.name = ?) where t.entrynumber=?";prep = connection.prepareStatement(sql4RestEntryQueueName);prep.setString(1, afterQueueName);prep.setString(2, entryNumber);}else{sql4RestEntryQueueName ="update wcadmin.queueentry t set t.ida3a5=(select q.ida2a2 from wcadmin.processingqueue q where q.name = ?) where  t.ida3a5 =  (select q.ida2a2 from wcadmin.processingqueue q where q.name = ?)";prep = connection.prepareStatement(sql4RestEntryQueueName);prep.setString(1, afterQueueName);prep.setString(2, beforeQueueName);}prep.executeUpdate();cscdb.commit();} catch (Exception e) {e.printStackTrace();cscdb.rollback();throw new Exception("Modify queueentry failure");} finally {cscdb.close();}}

Windchill 队列相关相关推荐

  1. 顺序队列相关操作(C语言实现)

    #顺序队列相关操作(C语言实现) #include<stdio.h> #define Size 100 typedef int DataType; typedef struct {Data ...

  2. Linux TCP队列相关参数的总结

    作者:阿里技术保障锋寒 原文:https://yq.aliyun.com/articles/4252 摘要: 本文尝试总结TCP队列缓冲相关的内核参数,从协议栈的角度梳理它们,希望可以更容易的理解和记 ...

  3. Algorithm:C++语言实现之队列相关算法(最短路径条数问题、拓扑排序)

    Algorithm:C++语言实现之队列相关算法(最短路径条数问题.拓扑排序) 目录 队列 1.最短路径条数问题 2.拓扑排序 队列 1.最短路径条数问题

  4. 数据结构——栈与队列相关题目

    数据结构--栈与队列相关题目 232. 用栈实现队列 思路 225. 用队列实现栈 1.两个队列实现栈 2.一个队列实现栈 20. 有效的括号 思路 1047. 删除字符串中的所有相邻重复项 思路 1 ...

  5. System V 消息队列(一)—— 消息队列相关接口函数(msgget / msgctl)

    SystemV方案是在OS内核层面专门为进程间通信设计的一个方案,然后通过系统调用(system call)给用户提供通信接口.SystemV方案包含三种:共享内存.消息队列.信号量. 和System ...

  6. linux队列数据结构,网络设备发送队列相关数据结构及其创建函数 (linux网络子系统学习 第十节 )...

    网络设备使用队列来管理数据帧的输出流量,每个队列可以使用队列策略算法来安排发送帧的优先级,使发送过程更高效.详细的队列策略处理属于流量控制子系统的内容,本人还没来的及研究,这里先不涉及.本章讨论没配置 ...

  7. springboot高级——消息队列相关

    写在前边:本文学习尚硅谷的springboot高级整理笔记. 消息队列是什么,有什么好处? 我们可以把消息队列比作是一个存放消息的容器,当我们需要使用消息的时候可以取出消息供自己使用.消息队列是分布式 ...

  8. POSIX 消息队列相关问题

    一.查看和删除消息队列 要想看到创建的posix消息队列,需要在root用户下执行以下操作: # mkdir /dev/mqueue # mount -t mqueue none /dev/mqueu ...

  9. java 引用队列_Java中管理资源的引用队列相关原理解析

    当对象改变其可达性状态时,对该对象的引用就可能会被置于引用队列(reference queue)中.这些队列被垃圾回收器用来与我们的代码沟通有关对象可达性变化的情况.这些队列是探测可达性变化的最佳方式 ...

最新文章

  1. 【书评:Oracle查询优化改写】第14章 结尾章
  2. 惊!!!CV界的BERT要来了?准确率提高近25%!
  3. Swift 1.1语言第7章 函数和闭包
  4. 编程之美求二进制数中1的个数扩展题
  5. Report20200828螺旋波等离子体推力器HPT模拟放电调试小结
  6. WatchOS系统开发大全(7)-WKInterfaceImage
  7. [Abp 源码分析]ASP.NET Core 集成
  8. linux源码安装apache2,CentOS7编译安装Apache2
  9. 性能php 教程,提高PHP性能效率的几个技巧
  10. Python调用(运行)外部程序参数问题
  11. C语言之枚举的定义以及测试
  12. java gc检测工具_Java自带的性能监测工具之jstat
  13. rbf java_RBF网络
  14. Trace32 加载高通 ramdump
  15. java并发编程-CAS算法
  16. select *和select 字段名
  17. java邮箱的表达式_Java邮箱正则表达式
  18. JS 案例 个人所得税计算器
  19. IDM与其他下载器加速器优缺点介绍
  20. kettle-xml输入

热门文章

  1. stream media(1)
  2. Spark线性代数,绘图工具入门;scala, java下的Breeze线性代数以及数据绘图工具breeze-viz入门
  3. Linux服务器怎样上传下载文件
  4. 办理劳务资质要多少钱?关键看办理方法
  5. 记一个打包出现错误Multiple chunks emit assets to the same filename js/chunk-0.js(chunks chunk-0 and chunk-0)
  6. 微信企业号开发(7)--自定义菜单
  7. Mathjax语法总结
  8. android 开发零起步学习笔记(三):Android权限标签uses-permission的书写位置
  9. 安装win7 缺少所需的CD/DVD驱动器设备驱动程序
  10. 【深度首发】观数科技的头三年:从断奶,走弯路,再到领跑大数据安全丨Xtecher 封面