Listing Jobs
You can use the following methods to get a list of jobs that have been added to the cluster.
Method | Description |
---|---|
ICluster::ListAllJobs | Lists all jobs that have been added to the cluster. |
ICluster::ListJobs | Lists all jobs for a specified user and status. For example, this method can list all failed jobs submitted by Joe. If you do not specify a user, the method returns all jobs with the specified status. |
ICluster::ListJobsOnNode | Lists all jobs that are running on the specified node. |
The following C++ example shows how to call the ListJobs method.
WCHAR *JobStatusStrings[] = { L"NotSubmitted", L"Queued",
L"Running", L"Finished",
L"Failed", L"Canceled"
};
WCHAR *JobPriorityStrings[] = { L"Lowest", L"BelowNormal",
L"Normal", L"AboveNormal",
L"Highest"
};
// List the jobs for the specified user and job status. To list all jobs
// with a specified status, set pUserName to NULL.
void ListJobsForUser(ICluster* pCluster, LPWSTR pUserName, JobStatus QueryJobStatus)
{
HRESULT hr = S_OK;
IClusterEnumerable* pJobCollection = NULL;
IEnumVARIANT* pJobs = NULL;
IJob* pJob = NULL;
VARIANT var;
// Get the list of jobs based on the input.
hr = pCluster->ListJobs(_bstr_t(pUserName), QueryJobStatus, &pJobCollection);
if (FAILED(hr))
{
BSTR bstrMessage;
wprintf(L"pCluster->ListJobs failed.\n");
hr = pCluster->get_ErrorMessage(&bstrMessage);
wprintf(L"%s\n", bstrMessage);
SysFreeString(bstrMessage);
return;
}
// Get the enumerator used to loop through the collection.
hr = pJobCollection->GetEnumerator(&pJobs);
if (SUCCEEDED(hr))
{
VariantInit(&var);
while (hr = pJobs->Next(1, &var, NULL) == S_OK)
{
// The variant contains the IDispatch pointer to the job.
// Query the IDispatch interface for the IJob interface.
var.pdispVal->QueryInterface(IID_IJob, reinterpret_cast<void **> (&pJob));
PrintJobProperties(pJob);
pJob->Release();
pJob = NULL;
VariantClear(&var);
}
pJobs->Release();
}
else
{
wprintf(L"pJobCollection->GetEnumerator failed.\n");
}
pJobCollection->Release();
return;
}
// Print some of the properties of the job.
void PrintJobProperties(IJob* pJob)
{
HRESULT hr = S_OK;
BSTR bstrJobName = NULL;
VARIANT_BOOL fUntilCanceled = VARIANT_FALSE;
JobStatus Status;
JobPriority Priority;
DATE EndDate;
long id = 0;
SYSTEMTIME SystemTime;
WCHAR szDateString[30+1];
WCHAR szTimeString[30+1];
hr = pJob->get_Name(&bstrJobName);
if (FAILED(hr))
{
wprintf(L"pJob->get_Name failed.\n");
goto cleanup;
}
hr = pJob->get_Id(&id);
if (FAILED(hr))
{
wprintf(L"pJob->get_Id failed.\n");
goto cleanup;
}
hr = pJob->get_Status(&Status);
if (FAILED(hr))
{
wprintf(L"pJob->get_Status failed.\n");
goto cleanup;
}
hr = pJob->get_RunUntilCanceled(&fUntilCanceled);
if (FAILED(hr))
{
wprintf(L"pJob->get_RunUntilCanceled failed.\n");
goto cleanup;
}
hr = pJob->get_EndTime(&EndDate);
if (FAILED(hr))
{
wprintf(L"pJob->get_EndTime failed.\n");
goto cleanup;
}
hr = pJob->get_Priority(&Priority);
if (FAILED(hr))
{
wprintf(L"pJob->get_EndTime failed.\n");
goto cleanup;
}
wprintf(L"\nName: %s\n", bstrJobName);
wprintf(L"ID: %ld\n", id);
wprintf(L"Status: %s\n", JobStatusStrings[Status]);
wprintf(L"Priority: %s\n", JobPriorityStrings[Priority]);
wprintf(L"RunUntilCanceled: %s\n", (fUntilCanceled) ? L"TRUE" : L"FALSE");
if (VariantTimeToSystemTime(EndDate, &SystemTime))
{
GetDateFormat(NULL, 0, &SystemTime, NULL, &(szDateString[0]), sizeof(szDateString));
GetTimeFormat(NULL, 0, &SystemTime, NULL, &(szTimeString[0]), sizeof(szTimeString));
wprintf(L"End date: %s %s\n", szDateString, szTimeString);
}
wprintf(L"Extended terms:\n");
PrintExtendedJobTerms(pJob);
cleanup:
SysFreeString(bstrJobName);
}
// Print the extended job terms, if specified.
void PrintExtendedJobTerms(IJob* pJob)
{
HRESULT hr = S_OK;
INameValueCollection* pTermsCollection = NULL;
IEnumVARIANT* pTerms = NULL;
INameValue* pTerm = NULL;
VARIANT var;
BSTR bstrName = NULL;
BSTR bstrValue = NULL;
// Get the collection of extended job terms.
hr = pJob->get_ExtendedJobTerms(&pTermsCollection);
if (FAILED(hr))
{
wprintf(L"pJob->get_ExtendedJobTerms failed.\n");
return;
}
// Get the enumerator used to loop through the collection.
hr = pTermsCollection->GetEnumerator(&pTerms);
if (SUCCEEDED(hr))
{
VariantInit(&var);
while (hr = pTerms->Next(1, &var, NULL) == S_OK)
{
// The variant contains the IDispatch pointer to the term.
// Query the IDispatch interface for the INameValue interface.
var.pdispVal->QueryInterface(IID_INameValue, reinterpret_cast<void **> (&pTerm));
hr = pTerm->get_Name(&bstrName); // Term name
if (SUCCEEDED(hr))
{
wprintf(L"\tName: %s\n", bstrName);
SysFreeString(bstrName);
hr = pTerm->get_Value(&bstrValue); // Term Value
if (SUCCEEDED(hr))
{
wprintf(L"\tValue: %s\n\n", bstrValue);
SysFreeString(bstrName);
}
else
{
wprintf(L"pTerm->get_Value failed.\n");
}
}
else
{
wprintf(L"pTerm->get_Name failed.\n");
}
pTerm->Release();
pTerm = NULL;
VariantClear(&var);
}
pTerms->Release();
}
else
{
wprintf(L"pTermsCollection->GetEnumerator failed.\n");
}
pTermsCollection->Release();
return;
}
The following C# example shows how to call the ListAllJobs method.
// List each job in the cluster.
foreach (IJob job in cluster.ListAllJobs())
{
Console.WriteLine(job.Name);
// Uses the job object to enumerate the tasks in the job.
Console.WriteLine("\tUsing job object to enumerate tasks...");
foreach (ITask task in job)
{
if (string.IsNullOrEmpty(task.Name))
Console.WriteLine("\t" + task.Id);
else
Console.WriteLine("\t" + task.Id);
}
// Uses the Cluster.ListTasks method to enumerate the tasks in the job.
Console.WriteLine("\n\tUsing cluster object to enumerate tasks...");
foreach (ITask task in cluster.ListTasks(job.Id))
{
if (string.IsNullOrEmpty(task.Name))
Console.WriteLine("\t" + task.Id);
else
Console.WriteLine("\t" + task.Id);
}
Console.WriteLine();
}