Writing a timer service is easy ans there are many examples available. However, while following the instructions I encountered several problems deploying the job to a single web application.
I followed the basic instructions (set the feature scope to WebApplication and the 'Assembly Deployment Target' to GlobalAssemblyCache) but the timer job was being activated across all web applications.
Here is how I resolved it:
1. Set the project property 'Include Assembly In Package' to false. This removes the 'Assembly Deployment Target' option.
2. Add the output assembly as an 'Additional Assembly' in the 'Advanced' section of the package manifest.
3. Change the 'Activate on Default' in the feature properties to false.
The feature will be deployed to the Web Application, but not activated. Use PowerShell to activate it.