[ https://issues.apache.org/jira/browse/OFBIZ-9233?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15964360#comment-15964360 ]
Jacques Le Roux commented on OFBIZ-9233: ---------------------------------------- Hi Jinghai, I began to review and decided to apply on trunk for easier review and test, but stumbled upon an issue. This hunk, and only this one, does not apply {code} @@ -371,163 +372,165 @@ } public static Map<String, Object> purgeOldJobs(DispatchContext dctx, Map<String, ? extends Object> context) { - Locale locale = (Locale)context.get("locale"); + Locale locale = (Locale)context.get("locale"); Debug.logWarning("purgeOldJobs service invoked. This service is obsolete - the Job Scheduler will purge old jobs automatically.", module); String sendPool = null; - Calendar cal = Calendar.getInstance(); try { - sendPool = ServiceConfigUtil.getServiceEngine().getThreadPool().getSendToPool(); - int daysToKeep = ServiceConfigUtil.getServiceEngine().getThreadPool().getPurgeJobDays(); - cal.add(Calendar.DAY_OF_YEAR, -daysToKeep); - } catch (GenericConfigException e) { - Debug.logWarning(e, "Exception thrown while getting service configuration: ", module); - return returnError(UtilProperties.getMessage(ServiceUtil.resource, "ServiceExceptionThrownWhileGettingServiceConfiguration", UtilMisc.toMap("errorString", e), locale)); - } - Delegator delegator = dctx.getDelegator(); + for (ServiceEngine engine : ServiceConfigUtil.getServiceConfig().getServiceEngines()) { + Calendar cal = Calendar.getInstance(); + sendPool = engine.getThreadPool().getSendToPool(); + int daysToKeep = engine.getThreadPool().getPurgeJobDays(); + cal.add(Calendar.DAY_OF_YEAR, -daysToKeep); + Delegator delegator = dctx.getDelegator(); - Timestamp purgeTime = new Timestamp(cal.getTimeInMillis()); + Timestamp purgeTime = new Timestamp(cal.getTimeInMillis()); - // create the conditions to query - EntityCondition pool = EntityCondition.makeCondition("poolId", sendPool); + // create the conditions to query + EntityCondition pool = EntityCondition.makeCondition("poolId", sendPool); - List<EntityExpr> finExp = UtilMisc.toList(EntityCondition.makeCondition("finishDateTime", EntityOperator.NOT_EQUAL, null)); - finExp.add(EntityCondition.makeCondition("finishDateTime", EntityOperator.LESS_THAN, purgeTime)); + List<EntityExpr> finExp = UtilMisc.toList(EntityCondition.makeCondition("finishDateTime", EntityOperator.NOT_EQUAL, null)); + finExp.add(EntityCondition.makeCondition("finishDateTime", EntityOperator.LESS_THAN, purgeTime)); - List<EntityExpr> canExp = UtilMisc.toList(EntityCondition.makeCondition("cancelDateTime", EntityOperator.NOT_EQUAL, null)); - canExp.add(EntityCondition.makeCondition("cancelDateTime", EntityOperator.LESS_THAN, purgeTime)); + List<EntityExpr> canExp = UtilMisc.toList(EntityCondition.makeCondition("cancelDateTime", EntityOperator.NOT_EQUAL, null)); + canExp.add(EntityCondition.makeCondition("cancelDateTime", EntityOperator.LESS_THAN, purgeTime)); - EntityCondition cancelled = EntityCondition.makeCondition(canExp); - EntityCondition finished = EntityCondition.makeCondition(finExp); + EntityCondition cancelled = EntityCondition.makeCondition(canExp); + EntityCondition finished = EntityCondition.makeCondition(finExp); - EntityCondition doneCond = EntityCondition.makeCondition(UtilMisc.toList(cancelled, finished), EntityOperator.OR); + EntityCondition doneCond = EntityCondition.makeCondition(UtilMisc.toList(cancelled, finished), EntityOperator.OR); - // always suspend the current transaction; use the one internally - Transaction parent = null; - try { - if (TransactionUtil.getStatus() != TransactionUtil.STATUS_NO_TRANSACTION) { - parent = TransactionUtil.suspend(); - } - - // lookup the jobs - looping 1000 at a time to avoid problems with cursors - // also, using unique transaction to delete as many as possible even with errors - boolean noMoreResults = false; - boolean beganTx1 = false; - while (!noMoreResults) { - // current list of records - List<GenericValue> curList = null; + // always suspend the current transaction; use the one internally + Transaction parent = null; try { - // begin this transaction - beganTx1 = TransactionUtil.begin(); + if (TransactionUtil.getStatus() != TransactionUtil.STATUS_NO_TRANSACTION) { + parent = TransactionUtil.suspend(); + } - EntityListIterator foundJobs = null; - try { - foundJobs = EntityQuery.use(delegator) - .select("jobId") - .from("JobSandbox") - .where(EntityCondition.makeCondition(UtilMisc.toList(doneCond, pool))) - .cursorScrollInsensitive() - .maxRows(1000) - .queryIterator(); - curList = foundJobs.getPartialList(1, 1000); - } finally { - if (foundJobs != null) { - foundJobs.close(); - } - } - } catch (GenericEntityException e) { - Debug.logError(e, "Cannot obtain job data from datasource", module); - try { - TransactionUtil.rollback(beganTx1, e.getMessage(), e); - } catch (GenericTransactionException e1) { - Debug.logWarning(e1, module); - } - return ServiceUtil.returnError(e.getMessage()); - } finally { - try { - TransactionUtil.commit(beganTx1); - } catch (GenericTransactionException e) { - Debug.logWarning(e, module); - } - } - // remove each from the list in its own transaction - if (UtilValidate.isNotEmpty(curList)) { - for (GenericValue job: curList) { - String jobId = job.getString("jobId"); - boolean beganTx2 = false; + // lookup the jobs - looping 1000 at a time to avoid problems with cursors + // also, using unique transaction to delete as many as possible even with errors + boolean noMoreResults = false; + boolean beganTx1 = false; + while (!noMoreResults) { + // current list of records + List<GenericValue> curList = null; try { - beganTx2 = TransactionUtil.begin(); - job.remove(); + // begin this transaction + beganTx1 = TransactionUtil.begin(); + + EntityListIterator foundJobs = null; + try { + foundJobs = EntityQuery.use(delegator) + .select("jobId") + .from("JobSandbox") + .where(EntityCondition.makeCondition(UtilMisc.toList(doneCond, pool))) + .cursorScrollInsensitive() + .maxRows(1000) + .queryIterator(); + curList = foundJobs.getPartialList(1, 1000); + } finally { + if (foundJobs != null) { + foundJobs.close(); + } + } } catch (GenericEntityException e) { - Debug.logInfo("Cannot remove job data for ID: " + jobId, module); + Debug.logError(e, "Cannot obtain job data from datasource", module); try { - TransactionUtil.rollback(beganTx2, e.getMessage(), e); + TransactionUtil.rollback(beganTx1, e.getMessage(), e); } catch (GenericTransactionException e1) { Debug.logWarning(e1, module); } + return ServiceUtil.returnError(e.getMessage()); } finally { try { - TransactionUtil.commit(beganTx2); + TransactionUtil.commit(beganTx1); } catch (GenericTransactionException e) { Debug.logWarning(e, module); } } + // remove each from the list in its own transaction + if (UtilValidate.isNotEmpty(curList)) { + for (GenericValue job: curList) { + String jobId = job.getString("jobId"); + boolean beganTx2 = false; + try { + beganTx2 = TransactionUtil.begin(); + job.remove(); + } catch (GenericEntityException e) { + Debug.logInfo("Cannot remove job data for ID: " + jobId, module); + try { + TransactionUtil.rollback(beganTx2, e.getMessage(), e); + } catch (GenericTransactionException e1) { + Debug.logWarning(e1, module); + } + } finally { + try { + TransactionUtil.commit(beganTx2); + } catch (GenericTransactionException e) { + Debug.logWarning(e, module); + } + } + } + } else { + noMoreResults = true; + } } - } else { - noMoreResults = true; - } - } - // Now JobSandbox data is cleaned up. Now process Runtime data and remove the whole data in single shot that is of no need. - boolean beganTx3 = false; - GenericValue runtimeData = null; - EntityListIterator runTimeDataIt = null; - List<GenericValue> runtimeDataToDelete = new LinkedList<GenericValue>(); - long jobsandBoxCount = 0; - try { - // begin this transaction - beganTx3 = TransactionUtil.begin(); + // Now JobSandbox data is cleaned up. Now process Runtime data and remove the whole data in single shot that is of no need. + boolean beganTx3 = false; + GenericValue runtimeData = null; + EntityListIterator runTimeDataIt = null; + List<GenericValue> runtimeDataToDelete = new LinkedList<GenericValue>(); + long jobsandBoxCount = 0; + try { + // begin this transaction + beganTx3 = TransactionUtil.begin(); - runTimeDataIt = EntityQuery.use(delegator).select("runtimeDataId").from("RuntimeData").queryIterator(); - try { - while ((runtimeData = runTimeDataIt.next()) != null) { - EntityCondition whereCondition = EntityCondition.makeCondition(UtilMisc.toList(EntityCondition.makeCondition("runtimeDataId", EntityOperator.NOT_EQUAL, null), - EntityCondition.makeCondition("runtimeDataId", EntityOperator.EQUALS, runtimeData.getString("runtimeDataId"))), EntityOperator.AND); - jobsandBoxCount = EntityQuery.use(delegator).from("JobSandbox").where(whereCondition).queryCount(); - if (BigDecimal.ZERO.compareTo(BigDecimal.valueOf(jobsandBoxCount)) == 0) { - runtimeDataToDelete.add(runtimeData); + runTimeDataIt = EntityQuery.use(delegator).select("runtimeDataId").from("RuntimeData").queryIterator(); + try { + while ((runtimeData = runTimeDataIt.next()) != null) { + EntityCondition whereCondition = EntityCondition.makeCondition(UtilMisc.toList(EntityCondition.makeCondition("runtimeDataId", EntityOperator.NOT_EQUAL, null), + EntityCondition.makeCondition("runtimeDataId", EntityOperator.EQUALS, runtimeData.getString("runtimeDataId"))), EntityOperator.AND); + jobsandBoxCount = EntityQuery.use(delegator).from("JobSandbox").where(whereCondition).queryCount(); + if (BigDecimal.ZERO.compareTo(BigDecimal.valueOf(jobsandBoxCount)) == 0) { + runtimeDataToDelete.add(runtimeData); + } + } + } finally { + runTimeDataIt.close(); } + // Now we are ready to delete runtimeData, we can safely delete complete list that we have recently fetched i.e runtimeDataToDelete. + delegator.removeAll(runtimeDataToDelete); + } catch (GenericEntityException e) { + Debug.logError(e, "Cannot obtain runtime data from datasource", module); + try { + TransactionUtil.rollback(beganTx3, e.getMessage(), e); + } catch (GenericTransactionException e1) { + Debug.logWarning(e1, module); + } + return ServiceUtil.returnError(e.getMessage()); + } finally { + try { + TransactionUtil.commit(beganTx3); + } catch (GenericTransactionException e) { + Debug.logWarning(e, module); + } } + } catch (GenericTransactionException e) { + Debug.logError(e, "Unable to suspend transaction; cannot purge jobs!", module); + return ServiceUtil.returnError(e.getMessage()); } finally { - runTimeDataIt.close(); + if (parent != null) { + try { + TransactionUtil.resume(parent); + } catch (GenericTransactionException e) { + Debug.logWarning(e, module); + } + } } - // Now we are ready to delete runtimeData, we can safely delete complete list that we have recently fetched i.e runtimeDataToDelete. - delegator.removeAll(runtimeDataToDelete); - } catch (GenericEntityException e) { - Debug.logError(e, "Cannot obtain runtime data from datasource", module); - try { - TransactionUtil.rollback(beganTx3, e.getMessage(), e); - } catch (GenericTransactionException e1) { - Debug.logWarning(e1, module); - } - return ServiceUtil.returnError(e.getMessage()); - } finally { - try { - TransactionUtil.commit(beganTx3); - } catch (GenericTransactionException e) { - Debug.logWarning(e, module); - } } - } catch (GenericTransactionException e) { - Debug.logError(e, "Unable to suspend transaction; cannot purge jobs!", module); - return ServiceUtil.returnError(e.getMessage()); - } finally { - if (parent != null) { - try { - TransactionUtil.resume(parent); - } catch (GenericTransactionException e) { - Debug.logWarning(e, module); - } - } + } catch (GenericConfigException e) { + Debug.logWarning(e, "Exception thrown while getting service configuration: ", module); + return returnError(UtilProperties.getMessage(ServiceUtil.resource, "ServiceExceptionThrownWhileGettingServiceConfiguration", UtilMisc.toMap("errorString", e), locale)); } return ServiceUtil.returnSuccess(); {code} This file did not change since September 2016, please recreate the patch against the trunk HEAD, thanks. > Enable a service to run by a specific service engine > ---------------------------------------------------- > > Key: OFBIZ-9233 > URL: https://issues.apache.org/jira/browse/OFBIZ-9233 > Project: OFBiz > Issue Type: Improvement > Components: framework > Affects Versions: Trunk > Reporter: Shi Jinghai > Assignee: Shi Jinghai > Priority: Minor > Fix For: Trunk > > Attachments: OFBIZ-9233-20170301.patch, > OFBIZ-9233-MultiServiceEnginesEnv.png > > > Currently, all of the services of OFBiz are run by the 'default' service > engine. > In a project, we have to make a service run by different service engines > rather than the 'default' one, i.e. order services run by 'order' service > engine and 'orderpool', shipment services run by 'shipment' service engine > and 'shipmentpool'. -- This message was sent by Atlassian JIRA (v6.3.15#6346)