在windchill中隊列分:排程,匯聚,進程
進程:我們通常在需要立即執行的任務,隊列一般以業務模塊+ProcessQueue結尾,如commonProcessQueue;
排程:我們通常在需要計劃性執行某些任務時使用,隊列一般以業務名稱+ScheduleQueue,如commonScheduleQueue
匯聚:用的比較少,理解爲系統本身相關的任務,WfPropagationQueue,DeleteCompletedWorkItemsQueue,WfUserWorkQueue等任務
下面我們介紹一下如何通過代碼獲取隊列
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