## Quickstart
This brief tutorial will run you through:
1. creating a new queue
2. adding a job to a queue
3. fetching a job to work on
4. checking the status of a job
5. completing a job
### Start Ocypod and check connectivity
Make sure Redis is running locally, the start the Ocypod server using:
$ ocypod-server
This will start a new server running, listening on port 8023 and connecting
to Redis running on `127.0.0.1:6379`. Ocypod would typically be started using
a configuration file, see the [Configuration](#configuration) section for
for details.
Ocypod uses an HTTP interface, so we'll use [curl](https://curl.haxx.se/)
command for this section, but feel free to use any HTTP client that you prefer.
Now that the server is running, check that it's healthy and able to connect
to Redis:
$ curl localhost:8023/health
{"status":"healthy"}
### Create a new queue
All jobs we create are placed on a queue, so we'll create a new queue by
sending a JSON map containing queue settings to the server.
The following will create a new queue named "demo" with a job
timeout of 10 minutes, and everything else as default:
$ curl -i -H 'content-type: application/json' -XPUT -d '{"timeout": "10m"}' localhost:8023/queue/demo
HTTP/1.1 201 Created
location: /queue/demo
content-length: 0
date: Wed, 05 Dec 2018 15:36:32 GMT
We should now have a queue named "demo", which will time out any jobs that don't
complete in 10 minutes by default (though this can be overidden on a per-job
basis).
Next, verify that the newly created queue exists, and see its full configuration:
$ curl localhost:8023/queue/demo
{"timeout":"10m",
"heartbeat_timeout":"0s",
"expires_after":"5m",
"retries":0,
"retry_delays":[]}
These can be changed at any time by re-running the queue creation command - if the
queue already exists, its settings will be updated, and a 204 response code returned
on success.
For a full list of queue settings, see the [Queue settings](core_concepts.md#queue-settings)
section.
### Adding a job to the queue
In a similar manner to the above, we can add a job to the queue by sending
a JSON definition of the job to the server.
The "input" fields contains any JSON that you want, this is the main job
payload that workers will receive and process. This is also where you'd set
other job configuration, such as number of retries, timeouts, etc. (see the
[job creation API](api#post-queuequeuenamejob) section for more details).
$ curl -i -H 'content-type: application/json' -XPOST -d '{"input": [1,2,3]}' localhost:8023/queue/demo/job
HTTP/1.1 201 Created
content-length: 1
location: /job/1
content-type: application/json
date: Wed, 05 Dec 2018 15:39:31 GMT
1
This creates a new job in the queue, with an auto-generated job ID (1 in this
case). You can use this ID to check the job's status at the job's URL:
$ curl localhost:8023/job/1/status
"queued"
Or you can get the all job-related fields as JSON:
$ curl localhost:8023/job/1
{"id":1,
"queue":"demo",
"status":"queued",
"tags":null,
"created_at":"2018-12-05T15:39:31.841731Z",
"started_at":null,
"ended_at":null,
"last_heartbeat":null,
"input":[1,2,3],
"output":null,
"timeout":"10m",
"heartbeat_timeout":"1m",
"expires_after":"5m",
"retries":3,
"retries_attempted":0,
"retry_delays":null,
"ended":false}
A detailed explanationof these fields can be found in the
[job metadata](#job-metadata) section.
### Start and complete a job
Next, we'll simulate the role of a worker, and ask for a job, update some job
data, then mark the job as completed.
Ask the "demo" queue for a job:
$ curl localhost:8023/queue/demo/job
{"id":1,"input":[1,2,3]}
As you can see, we receive the "input" payload that was added at job creation
time.
Mark the job as complete and write some results:
$ curl -i -XPATCH -H 'content-type: application/json' -d '{"status": "completed", "output": [2,4,6]}' localhost:8023/job/1
HTTP/1.1 204 No Content
date: Wed, 05 Dec 2018 16:24:04 GMT
The `output` field can be updated at any time while a job is running, and is
typically used to store job results, progress information, errors, etc.
You can then check the job's status and get its output (as clients might typically
to in order to track a job's progress):
$ curl -i 'http://localhost:8023/job/61?fields=status,ended_at,output'
{"status": "completed",
"ended_at": "2018-12-05T16:24:08.4385734Z",
"output": [2,4,6]}
Since the job we created has `expires_after` set to `5m`, this job will
be removed from the queue server 5 minutes after its `ended_at` date/time.