Windchill 隊列相關

在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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章