{"id":32173504,"url":"https://github.com/activesphere/exq-scheduler","last_synced_at":"2026-02-21T15:05:43.502Z","repository":{"id":48094384,"uuid":"118608698","full_name":"activesphere/exq-scheduler","owner":"activesphere","description":"Job scheduler for Exq","archived":false,"fork":false,"pushed_at":"2025-08-24T03:53:25.000Z","size":343,"stargazers_count":33,"open_issues_count":0,"forks_count":11,"subscribers_count":9,"default_branch":"master","last_synced_at":"2025-12-25T04:10:03.873Z","etag":null,"topics":["elixir","exq","scheduler","sidekiq"],"latest_commit_sha":null,"homepage":"","language":"Elixir","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/activesphere.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2018-01-23T12:39:30.000Z","updated_at":"2025-09-08T20:44:56.000Z","dependencies_parsed_at":"2024-11-13T16:41:38.738Z","dependency_job_id":"16c1f710-75f4-4550-bf49-6874a1fcb174","html_url":"https://github.com/activesphere/exq-scheduler","commit_stats":null,"previous_names":[],"tags_count":18,"template":false,"template_full_name":null,"purl":"pkg:github/activesphere/exq-scheduler","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/activesphere%2Fexq-scheduler","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/activesphere%2Fexq-scheduler/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/activesphere%2Fexq-scheduler/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/activesphere%2Fexq-scheduler/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/activesphere","download_url":"https://codeload.github.com/activesphere/exq-scheduler/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/activesphere%2Fexq-scheduler/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29684076,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-21T14:31:22.911Z","status":"ssl_error","status_checked_at":"2026-02-21T14:31:22.570Z","response_time":107,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["elixir","exq","scheduler","sidekiq"],"created_at":"2025-10-21T18:56:37.653Z","updated_at":"2026-02-21T15:05:43.496Z","avatar_url":"https://github.com/activesphere.png","language":"Elixir","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Exq Scheduler\n\n[![CI](https://github.com/activesphere/exq-scheduler/actions/workflows/ci.yml/badge.svg)](https://github.com/activesphere/exq-scheduler/actions/workflows/ci.yml)\n[![Hex.pm](https://img.shields.io/hexpm/v/exq_scheduler.svg)](https://hex.pm/packages/exq_scheduler)\n\nExq Scheduler is a [cron](https://en.wikipedia.org/wiki/Cron) like job scheduler for\n[Exq](https://github.com/akira/exq), it's also compatible with Sidekiq\nand Resque.\n\n## Installation\n\n```\ndefp deps do\n  [{:exq_scheduler, \"~\u003e x.x.x\"}]\nend\n```\n\n## Overview\n\nExq Scheduler pushes jobs into the queue at intervals specified by the\nschedule configuration. It is designed to run on more than one machine\nfor redundancy without causing duplicate jobs to be scheduled.\n\n## Configuration\n\nBy default Exq Scheduler will read the configuration from application environment.\n\n### Storage\n\nExq Scheduler uses redis to store internal state of the scheduler.\nIt uses `\"#{exq_namespace}:sidekiq-scheduler\"` for storing scheduler internal metadata.\n\n```elixir\nconfig :exq_scheduler, :storage,\n  exq_namespace: \"exq\" # exq redis namespace\n```\n### Redis Client\n\nExq Scheduler will start a Redis Client under it's supervisor\ntree. The `name` used in the [child_spec](https://hexdocs.pm/elixir/Supervisor.html#module-child_spec-1) and config should be the\nsame.\n\n```elixir\nconfig :exq_scheduler, :redis,\n  name: ExqScheduler.Redis.Client,\n  child_spec: {Redix, [host: \"127.0.0.1\", port: 6379, name: ExqScheduler.Redis.Client]}\n```\n\nNOTE: The child\\_spec API provided by Redix library has changed over\ntime. Refer [Redix.child\\_spec](https://hexdocs.pm/redix/Redix.html#child_spec/1) documentation of the specific\nversion you use.\n\n### Schedules\n\n```elixir\nconfig :exq_scheduler, :schedules,\n  signup_report: %{\n    description: \"Send the list of newly signed up users to admin\",\n    cron: \"0 * * * *\",\n    class: \"SignUpReportWorker\",\n    include_metadata: true,\n    args: [],\n    queue: \"default\"\n  },\n  login_report: %{\n    cron: \"0 * * * *\",\n    class: \"LoginReportWorker\"\n  }\n```\n\n* `cron`: \u003ckbd\u003erequired\u003c/kbd\u003e Refer\n  [cron](https://en.wikipedia.org/wiki/Cron) documentation for\n  syntax. Time zone of a single schedule can be changed by specifying\n  the time zone at the end. Example `0 * * * * Asia/Kolkata`.\n\n* `class`: \u003ckbd\u003erequired\u003c/kbd\u003e Name of the worker class.\n\n* `queue`: Name of the worker queue. Defaults to `\"default\"`.\n\n* `args`: List of values that should be passed to `perform` method in\n  worker. Defaults to `[]`.\n\n* `retry`: Number of times Exq should retry the job if it fails. If set to true, Exq will use `max_retries` instead. Defaults to `true`.\n\n* `enabled`: Schedule is enabled if set to true. Defaults to\n  `true`. Note: if this config value is set, on restart it will\n  override the any previous value set via Sidekiq web UI. Don't use\n  this option if you want to enable/disable via Sidekiq web UI.\n\n* `include_metadata`: If set to true, the schedule time in unix time format (example\n  `{\"scheduled_at\"=\u003e1527750039.080837}`) will be passed as an\n  extra argument to `perform` method in worker. Defaults to `nil`.\n\n* `description`: a text that will be shown in sidekiq web\n\n### Misc\n\nScheduling each and every job at the exact time might not be possible\nevery time. The node might get restarted, the process might get\ndescheduled by the OS etc. To solve this exq scheduler by default\nschedules any missed jobs in the last 3 hour. This interval can be\nconfigured by changing `missed_jobs_window` value. Note: this config\nvalue should be more than 3 hour to handle daylight saving properly\n\n```elixir\nconfig :exq_scheduler,\n  missed_jobs_window: 3 * 60 * 60 * 1000,\n  time_zone: \"Asia/Kolkata\"\n```\n\n* `missed_jobs_window`: Missed jobs interval in milliseconds. Defaults to\n  `3 * 60 * 60 * 1000`\n\n* `time_zone`: Default time zone for all schedules. Defaults to system\n  time zone.\n\nThe scheduler will start by default when the app is started, to\ndisable set `start_on_application` to false.\n\n```elixir\nconfig :exq_scheduler,\n  start_on_application: false\n```\n\n## Web\n\nExq Scheduler is compatible with\n[sidekiq-scheduler](https://github.com/moove-it/sidekiq-scheduler#sidekiq-web-integration)\nweb UI. Make sure the `exq_namespace` value and the namespace in\nsidekiq are same.\n\n## Example\n\nA Sample Mix project along with sidekiq web UI is avaialbe at\n[demo](https://github.com/activesphere/exq-scheduler/tree/master/demo)\ndirectory to demonstrate the configuration.  Sidekiq web interface\nrequires Ruby to be installed.\n\nTo install dependencies\n\n```\n\u003e cd demo\n\u003e mix deps.get\n\u003e cd sidekiq-ui\n\u003e bundle install\n```\n\nTo start it\n\n```\n\u003e cd demo\n\u003e ./start_demo.sh\n```\n\n## Running tests\n\n1. Install sidekiq (requires ruby 2.5.1 and bundler 1.16.1)\n\n        $ (cd sidekiq \u0026\u0026 gem install bundler:1.16.1 \u0026\u0026 bundle install)\n\n1. Setup services\n\n        $ docker-compose up\n\n1. Install dependencies\n\n        $ mix deps.get\n\n1. Run tests\n\n        $ mix test\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Factivesphere%2Fexq-scheduler","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Factivesphere%2Fexq-scheduler","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Factivesphere%2Fexq-scheduler/lists"}