所以,我遇到了一个奇怪的问题,我真的陷入困境。我有一个漫长的过程(加载1000万+记录到salesforce)。当我运行这个过程时,一切顺利,直到结束。
在此过程结束时,我等待salesforce确认所有记录已成功加载。
有时(并非总是,但大部分时间),程序似乎停滞不前。如果我暂停调试器,它不会提取任何代码行,我也无法使用"步骤"功能。虽然它停滞不前,但一条线程的闪烁速度比我能读到的要快。我设法通过屏幕快速拍摄我的桌面来捕获它。
关于如何解决这个问题的任何建议?洞察为什么会发生这种情况?我有点不在我的舒适区。
事实证明,经过很长一段时间后,它终于按预期返回了。似乎线程正在做某种工作,但可能没有得到公平的资源份额?仍然不知道它为什么会发生。也许这与我在循环中进行的 thread.sleep()调用有关?
这基本上是有问题的代码。它来自this resource put out by salesforce。
/**
* Wait for a job to complete by polling the Bulk API.
*
* @param connection
* BulkConnection used to check results.
* @param job
* The job awaiting completion.
* @param batchInfoList
* List of batches for this job.
* @throws AsyncApiException
*/
private void awaitCompletion(BulkConnection connection, JobInfo job,
List<BatchInfo> batchInfoList)
throws AsyncApiException {
long sleepTime = 0L;
Set<String> incomplete = new HashSet<String>();
for (BatchInfo bi : batchInfoList) {
incomplete.add(bi.getId());
}
while (!incomplete.isEmpty()) {
try {
Thread.sleep(sleepTime);
} catch (InterruptedException e) {}
System.out.println("Awaiting results..." + incomplete.size());
sleepTime = 10000L;
BatchInfo[] statusList =
connection.getBatchInfoList(job.getId()).getBatchInfo();
for (BatchInfo b : statusList) {
if (b.getState() == BatchStateEnum.Completed
|| b.getState() == BatchStateEnum.Failed) {
if (incomplete.remove(b.getId())) {
System.out.println("BATCH STATUS:\n" + b);
}
}
}
}
}