Writing a Jobs Driver
Last updated
Was this helpful?
Last updated
Was this helpful?
JOBS drivers are mini-plugins that are connected to the main JOBS plugin and initialized by it.
While initializing, JOBS plugin searches for the registered drivers by the Constructor
interface. Constructor and Driver (will be described below) interfaces are declared in the .
Constructor interface:
Driver interface:
So every driver should implement the Constructor
interface to be found by the JOBS plugin. Let's have at the methods included in the Constructor
interface:
Name() string
: This method should return a user-friendly name for the driver. It'll be used later in the pipelines <pipeline_name>.driver
option. It is an important option. The name here and name in the pipeline options should match.
DriverFromConfig(configKey string, queue Queue, pipeline Pipeline) (Driver, error)
: Returns Driver implementation declared via configuration. RoadRunner in turn provide a configuration key (like: jobs.pipelines.pipeline-name.driver-name.config
), queue implementation where to push the messages and pipeline with the all information about the pipeline. Later we will have a look on how to use it.
DriverFromPipeline(pipe Pipeline, queue Queue) (Driver, error)
: Returns Driver implementation declared via RPC jobs.Declare
call. It doesn't have a configuration, but all info and configuration options are stored in the pipeline method argument.
To create a driver for jobs, you need to create a plugin instance:
This is a simple representation of the RR plugin. It is called driver because it is attached to another controlling plugin as a pluggable extender, aka: a driver. Keep in mind the plugin's name.
JOBS plugin will send the following data to the Constructor
interface methods:
If declared via configuration (.rr.yaml
) - configKey
, you may use that key to unmarshal the configuration section related solely to this driver. If the driver was declared via jobs.Declare
RPC method, all configuration options would be stored in the jobs.Pipeline
interface.
jobs.Queue
: Priority-Queue, used to push the messages and later process by the PHP workers.
All other things like logger, Configurer
plugin which will be used to get the values from the .rr.yaml
configuration you may pass if you need them from the driver's root (e.g.: p.log
).
Now, let's see the simplified Driver
implementation:
Here you need to remember the following things:
FromConfig
and FromPipeline
methods are used to initialize the driver, but not to start the message consumption.
JOBS
plugin will automatically call the Run
method is your pipelines would be in the jobs.consume
array.
For the pipelines, declared via jobs.Declare
RPC call, method jobs.Resume
should be called instead.
Job interface also includes the pq.Item
interface to satisfy a minimal priority queue requirement. You may add this (pq.Item
) interface to any interface and benefit from the RoadRunner's priority queue. So, our driver's Push
method would be updated as follows:
Configuration for your Jobs
driver:
On the Initialization step, JOBS plugin searches for the JOBS drivers and saves them into a hashmap with by its name provided by the Name() string
method. It is not possible to have two drivers with the same name. Drives here are things which are declared in the jobs.pipelines
configuration. For the pipelines declared via configuration, RoadRunner saves them as well with their name. Pipelines can also be declared with RPC method. If it is required, you may use Configurer
plugin to unmarshal global driver configuration, such a connection string for example.
All code from the tutorial is here:
To push the job into priority queue, you need to slightly transform it to add Ack
, Nack
, etc. methods to it. All interfaces are here , but let's have a look at the Job
interface.
fromJob
method needed to simply transform jobs.Message
into the Job
. See . The rest is to implement a driver specific Ack
, Nack
, etc. methods.
Examples of existing drivers: , , , , , ,