Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
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();
}