📄 entitysyncservices.java
字号:
}
}
//LocalDispatcher dispatcher = dctx.getDispatcher();
String entitySyncId = (String) context.get("entitySyncId");
// incoming lists will already be sorted by lastUpdatedStamp (or lastCreatedStamp)
List valuesToCreate = (List) context.get("valuesToCreate");
List valuesToStore = (List) context.get("valuesToStore");
List keysToRemove = (List) context.get("keysToRemove");
try {
long toCreateInserted = 0;
long toCreateUpdated = 0;
long toCreateNotUpdated = 0;
long toStoreInserted = 0;
long toStoreUpdated = 0;
long toStoreNotUpdated = 0;
long toRemoveDeleted = 0;
long toRemoveAlreadyDeleted = 0;
// create all values in the valuesToCreate List; if the value already exists update it, or if exists and was updated more recently than this one dont update it
Iterator valueToCreateIter = valuesToCreate.iterator();
while (valueToCreateIter.hasNext()) {
GenericValue valueToCreate = (GenericValue) valueToCreateIter.next();
// to Create check if exists (find by pk), if not insert; if exists check lastUpdatedStamp: if null or before the candidate value insert, otherwise don't insert
// NOTE: use the delegator from this DispatchContext rather than the one named in the GenericValue
// maintain the original timestamps when doing storage of synced data, by default with will update the timestamps to now
valueToCreate.setIsFromEntitySync(true);
GenericValue existingValue = delegator.findByPrimaryKey(valueToCreate.getPrimaryKey());
if (existingValue == null) {
delegator.create(valueToCreate);
toCreateInserted++;
} else {
// if the existing value has a stamp field that is AFTER the stamp on the valueToCreate, don't update it
if (existingValue.get(ModelEntity.STAMP_FIELD) != null && existingValue.getTimestamp(ModelEntity.STAMP_FIELD).after(valueToCreate.getTimestamp(ModelEntity.STAMP_FIELD))) {
toCreateNotUpdated++;
} else {
delegator.store(valueToCreate);
toCreateUpdated++;
}
}
}
// iterate through to store list and store each
Iterator valueToStoreIter = valuesToStore.iterator();
while (valueToStoreIter.hasNext()) {
GenericValue valueToStore = (GenericValue) valueToStoreIter.next();
// to store check if exists (find by pk), if not insert; if exists check lastUpdatedStamp: if null or before the candidate value insert, otherwise don't insert
// maintain the original timestamps when doing storage of synced data, by default with will update the timestamps to now
valueToStore.setIsFromEntitySync(true);
GenericValue existingValue = delegator.findByPrimaryKey(valueToStore.getPrimaryKey());
if (existingValue == null) {
delegator.create(valueToStore);
toStoreInserted++;
} else {
// if the existing value has a stamp field that is AFTER the stamp on the valueToStore, don't update it
if (existingValue.get(ModelEntity.STAMP_FIELD) != null && existingValue.getTimestamp(ModelEntity.STAMP_FIELD).after(valueToStore.getTimestamp(ModelEntity.STAMP_FIELD))) {
toStoreNotUpdated++;
} else {
delegator.store(valueToStore);
toStoreUpdated++;
}
}
}
// iterate through to remove list and remove each
Iterator keyToRemoveIter = keysToRemove.iterator();
while (keyToRemoveIter.hasNext()) {
GenericValue entitySyncRemove = (GenericValue) keyToRemoveIter.next();
// pull the PK from the EntitySyncRemove in the primaryKeyRemoved field, de-XML-serialize it and check to see if it exists, if so remove and count, if not just count already removed
String primaryKeyRemoved = entitySyncRemove.getString("primaryKeyRemoved");
GenericEntity pkToRemove = null;
try {
pkToRemove = (GenericEntity) XmlSerializer.deserialize(primaryKeyRemoved, delegator);
} catch (IOException e) {
String errorMsg = "Error deserializing GenericPK to remove in Entity Sync Data for entitySyncId [" + entitySyncId + "] and entitySyncRemoveId [" + entitySyncRemove.getString("entitySyncRemoveId") + "]: " + e.toString();
Debug.logError(e, errorMsg, module);
return ServiceUtil.returnError(errorMsg);
} catch (SAXException e) {
String errorMsg = "Error deserializing GenericPK to remove in Entity Sync Data for entitySyncId [" + entitySyncId + "] and entitySyncRemoveId [" + entitySyncRemove.getString("entitySyncRemoveId") + "]: " + e.toString();
Debug.logError(e, errorMsg, module);
return ServiceUtil.returnError(errorMsg);
} catch (ParserConfigurationException e) {
String errorMsg = "Error deserializing GenericPK to remove in Entity Sync Data for entitySyncId [" + entitySyncId + "] and entitySyncRemoveId [" + entitySyncRemove.getString("entitySyncRemoveId") + "]: " + e.toString();
Debug.logError(e, errorMsg, module);
return ServiceUtil.returnError(errorMsg);
} catch (SerializeException e) {
String errorMsg = "Error deserializing GenericPK to remove in Entity Sync Data for entitySyncId [" + entitySyncId + "] and entitySyncRemoveId [" + entitySyncRemove.getString("entitySyncRemoveId") + "]: " + e.toString();
Debug.logError(e, errorMsg, module);
return ServiceUtil.returnError(errorMsg);
}
// always do a removeByAnd, if it was a removeByAnd great, if it was a removeByPrimaryKey, this will also work and save us a query
pkToRemove.setIsFromEntitySync(true);
int numRemByAnd = delegator.removeByAnd(pkToRemove.getEntityName(), pkToRemove);
if (numRemByAnd == 0) {
toRemoveAlreadyDeleted++;
} else {
toRemoveDeleted++;
}
}
Map result = ServiceUtil.returnSuccess();
result.put("toCreateInserted", new Long(toCreateInserted));
result.put("toCreateUpdated", new Long(toCreateUpdated));
result.put("toCreateNotUpdated", new Long(toCreateNotUpdated));
result.put("toStoreInserted", new Long(toStoreInserted));
result.put("toStoreUpdated", new Long(toStoreUpdated));
result.put("toStoreNotUpdated", new Long(toStoreNotUpdated));
result.put("toRemoveDeleted", new Long(toRemoveDeleted));
result.put("toRemoveAlreadyDeleted", new Long(toRemoveAlreadyDeleted));
return result;
} catch (GenericEntityException e) {
String errorMsg = "Error saving Entity Sync Data for entitySyncId [" + entitySyncId + "]: " + e.toString();
Debug.logError(e, errorMsg, module);
return ServiceUtil.returnError(errorMsg);
}
}
/**
* Clean EntitySyncRemove Info
*@param dctx The DispatchContext that this service is operating in
*@param context Map containing the input parameters
*@return Map with the result of the service, the output parameters
*/
public static Map cleanSyncRemoveInfo(DispatchContext dctx, Map context) {
Debug.logInfo("Running cleanSyncRemoveInfo", module);
GenericDelegator delegator = dctx.getDelegator();
try {
// find the largest keepRemoveInfoHours value on an EntitySyncRemove and kill everything before that, if none found default to 10 days (240 hours)
double keepRemoveInfoHours = 24;
List entitySyncRemoveList = delegator.findAll("EntitySync");
Iterator entitySyncRemoveIter = entitySyncRemoveList.iterator();
while (entitySyncRemoveIter.hasNext()) {
GenericValue entitySyncRemove = (GenericValue) entitySyncRemoveIter.next();
Double curKrih = entitySyncRemove.getDouble("keepRemoveInfoHours");
if (curKrih != null) {
double curKrihVal = curKrih.doubleValue();
if (curKrihVal > keepRemoveInfoHours) {
keepRemoveInfoHours = curKrihVal;
}
}
}
int keepSeconds = (int) Math.floor(keepRemoveInfoHours * 60);
Calendar nowCal = Calendar.getInstance();
nowCal.setTimeInMillis(System.currentTimeMillis());
nowCal.add(Calendar.SECOND, -keepSeconds);
Timestamp keepAfterStamp = new Timestamp(nowCal.getTimeInMillis());
EntityListIterator eli = delegator.findListIteratorByCondition("EntitySyncRemove", new EntityExpr(ModelEntity.STAMP_TX_FIELD, EntityOperator.LESS_THAN, keepAfterStamp), null, UtilMisc.toList(ModelEntity.STAMP_TX_FIELD));
GenericValue entitySyncRemove = null;
int numRemoved = 0;
List valuesToRemove = new LinkedList();
while ((entitySyncRemove = (GenericValue) eli.next()) != null) {
valuesToRemove.add(entitySyncRemove.getPrimaryKey());
numRemoved++;
// do 1000 at a time to avoid possible problems with removing values while iterating over a cursor
if (numRemoved > 1000) {
eli.close();
delegator.removeAll(valuesToRemove);
eli = delegator.findListIteratorByCondition("EntitySyncRemove", new EntityExpr(ModelEntity.STAMP_TX_FIELD, EntityOperator.LESS_THAN, keepAfterStamp), null, UtilMisc.toList(ModelEntity.STAMP_TX_FIELD));
}
}
eli.close();
return ServiceUtil.returnSuccess();
} catch (GenericEntityException e) {
String errorMsg = "Error cleaning out EntitySyncRemove info: " + e.toString();
Debug.logError(e, errorMsg, module);
return ServiceUtil.returnError(errorMsg);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -