- Development - Code examples and Walkthroughs
- New Features - new functionality and areas of the SharePoint 2010 product
- Hints and Tips - tricks and "didn't know that .." information about the new build, and my experience with it once it becomes available.
Friday, 28 August 2009
SharePoint 2010 - Hints, Tips and New Features - Watch this Space!
Monday, 17 August 2009
SharePoint Timer Jobs and Multiple Servers
Timer jobs are wonderfully robust creatures. They effectively replace the "Windows Scheduled Task" for SharePoint servers, allowing you to run .Net code on a scheduled or "one off" basis.
However, there can be some confusion about running Timer Jobs on multiple servers, so this should clear it up a bit.
- By default Timer Jobs will only execute on the server that they are called from (typically the Central Administration server)
- Through code you can specify a specific box (SPServer) to run your Timer Job on.
-
It is possible to run a Timer Job on every server on the farm (although this can be dangerous!)
The crux of all this is based on the SPJobDefinition constructor (http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.administration.spjobdefinition.spjobdefinition.aspx).
The constructor includes a parameter for an SPServer object, which allows you to specify which server the timer job will run on.
Example Code 1 – Add Job to single Server:
The code below is for a Web Application scoped which will register a job definition on a single server. As Web Application scoped features are activated from Central Administration, it will use the current SPServer (i.e. the Central Admin server).
This is useful for code which modified content in the database, as you only want it to execute a single time.
public override void FeatureActivated(SPFeatureReceiverProperties properties)
{
SPWebApplication webApp = properties.Feature.Parent as SPWebApplication;
SPJobDefinition job = new SPJobDefinition("CustomJobDef", webApp);
}
Example Code 2 – Add Job to All Servers:
The code below is for a Web Application scoped which will register a job definition on all web front end servers in the farm.
This is useful for code which modifies files or server settings, as you need it to execute separately for each server.
public override void FeatureActivated(SPFeatureReceiverProperties properties)
{
SPWebApplication webApp = properties.Feature.Parent as SPWebApplication;
foreach (SPServer server in SPFarm.Local.Servers)
{
if (server.Role == SPServerRole.WebFrontEnd)
{
SPJobDefinition job = new SPJobDefinition("CustomJobDef", webApp, server, SPJobLockType.None);
}
}
}
Hope this helps! Enjoy!
Tuesday, 4 August 2009
Turning off Audience Targeting on Page Libraries - Operation is not valid due to the current state of the object
public static void SetTargeting(SPList list, bool enabled)
{
if (list == null)
throw new SPException("List was not found.");
SPField targetingField = GetTargetingField(list);
if (enabled && (targetingField == null))
{
string createFieldAsXml = CreateFieldAsXml();
list.Fields.AddFieldAsXml(createFieldAsXml);
list.Update();
}
else if (!enabled && (targetingField != null))
{
// make sure the field can be deleted!
targetingField.AllowDeletion = true;
targetingField.Sealed = false;
targetingField.Update();list.Fields.Delete(targetingField.InternalName);
list.Update();
}
}