Module: Faktory

Defined in:
lib/faktory.rb,
lib/faktory/cli.rb,
lib/faktory/job.rb,
lib/faktory/util.rb,
lib/faktory/fetch.rb,
lib/faktory/rails.rb,
lib/faktory/client.rb,
lib/faktory/logging.rb,
lib/faktory/manager.rb,
lib/faktory/testing.rb,
lib/faktory/version.rb,
lib/faktory/launcher.rb,
lib/faktory/processor.rb,
lib/faktory/connection.rb,
lib/faktory/job_logger.rb,
lib/faktory/middleware/chain.rb,
lib/faktory/exception_handler.rb

Defined Under Namespace

Modules: ExceptionHandler, Job, Logging, Middleware, Queues, Testing, Util Classes: CLI, Client, CommandError, Connection, EmptyQueueError, Fetcher, JobLogger, Launcher, Manager, ParseError, Processor, Rails, Shutdown, UnitOfWork

Constant Summary collapse

NAME =
'Faktory'.freeze
LICENSE =
'See LICENSE and the LGPL-3.0 for licensing details.'
DEFAULTS =
{
  queues: ['default'],
  concurrency: 10,
  require: '.',
  environment: 'development',
  # As of 2017, Heroku's process timeout is 30 seconds.
  # After 30 seconds, processes are KILLed so assume 25
  # seconds to gracefully shutdown and 5 seconds to hard
  # shutdown.
  timeout: 25,
  error_handlers: [],
  lifecycle_events: {
    startup: [],
    quiet: [],
    shutdown: [],
  },
  reloader: proc { |&block| block.call },
}
DEFAULT_JOB_OPTIONS =
{
  'retry' => 25,
  'queue' => 'default'
}
VERSION =
"0.8.1"

Class Method Summary collapse

Class Method Details

.client_middleware {|@client_chain| ... } ⇒ Object

Yields:

  • (@client_chain)


89
90
91
92
93
# File 'lib/faktory.rb', line 89

def self.client_middleware
  @client_chain ||= Middleware::Chain.new
  yield @client_chain if block_given?
  @client_chain
end

.configure_client {|_self| ... } ⇒ Object

Configuration for Faktory client, use like:

Faktory.configure_client do |config|
  config.faktory = { :size => 1, :url => 'myhost:7419' }
end

Yields:

  • (_self)

Yield Parameters:

  • _self (Faktory)

    the object that the method was called on



66
67
68
# File 'lib/faktory.rb', line 66

def self.configure_client
  yield self unless worker?
end

.configure_worker {|_self| ... } ⇒ Object

Configuration for Faktory executor, use like:

Faktory.configure_worker do |config|
  config.worker_middleware do |chain|
    chain.add MyServerHook
  end
end

Yields:

  • (_self)

Yield Parameters:

  • _self (Faktory)

    the object that the method was called on



56
57
58
# File 'lib/faktory.rb', line 56

def self.configure_worker
  yield self if worker?
end

.default_job_optionsObject



105
106
107
# File 'lib/faktory.rb', line 105

def self.default_job_options
  defined?(@default_job_options) ? @default_job_options : DEFAULT_JOB_OPTIONS
end

.default_job_options=(hash) ⇒ Object



101
102
103
104
# File 'lib/faktory.rb', line 101

def self.default_job_options=(hash)
  # stringify
  @default_job_options = default_job_options.merge(Hash[hash.map{|k, v| [k.to_s, v]}])
end

.dump_json(object) ⇒ Object



112
113
114
# File 'lib/faktory.rb', line 112

def self.dump_json(object)
  JSON.generate(object)
end

.error_handlersObject

Register a proc to handle any error which occurs within the Faktory process.

Faktory.configure_worker do |config|
  config.error_handlers << proc {|ex,ctx_hash| MyErrorService.notify(ex, ctx_hash) }
end

The default error handler logs errors to Faktory.logger.



139
140
141
# File 'lib/faktory.rb', line 139

def self.error_handlers
  self.options[:error_handlers]
end

.faktory=(hash) ⇒ Object



85
86
87
# File 'lib/faktory.rb', line 85

def self.faktory=(hash)
  @pool = Faktory::Connection.create(hash)
end

.load_json(string) ⇒ Object



109
110
111
# File 'lib/faktory.rb', line 109

def self.load_json(string)
  JSON.parse(string)
end

.loggerObject



116
117
118
# File 'lib/faktory.rb', line 116

def self.logger
  Faktory::Logging.logger
end

.logger=(log) ⇒ Object



119
120
121
# File 'lib/faktory.rb', line 119

def self.logger=(log)
  Faktory::Logging.logger = log
end

.on(event, &block) ⇒ Object

Register a block to run at a point in the Faktory lifecycle. :startup, :quiet or :shutdown are valid events.

Faktory.configure_worker do |config|
  config.on(:shutdown) do
    puts "Goodbye cruel world!"
  end
end

Raises:

  • (ArgumentError)


151
152
153
154
155
# File 'lib/faktory.rb', line 151

def self.on(event, &block)
  raise ArgumentError, "Symbols only please: #{event}" unless event.is_a?(Symbol)
  raise ArgumentError, "Invalid event name: #{event}" unless options[:lifecycle_events].key?(event)
  options[:lifecycle_events][event] << block
end

.optionsObject



41
42
43
# File 'lib/faktory.rb', line 41

def self.options
  @options ||= DEFAULTS.dup
end

.options=(opts) ⇒ Object



44
45
46
# File 'lib/faktory.rb', line 44

def self.options=(opts)
  @options = opts
end

.serverObject

Raises:

  • (ArgumentError)


74
75
76
77
78
79
# File 'lib/faktory.rb', line 74

def self.server
  raise ArgumentError, "requires a block" unless block_given?
  server_pool.with do |conn|
    yield conn
  end
end

.server_poolObject



81
82
83
# File 'lib/faktory.rb', line 81

def self.server_pool
  @pool ||= Faktory::Connection.create
end

.worker?Boolean

Returns:

  • (Boolean)


70
71
72
# File 'lib/faktory.rb', line 70

def self.worker?
  defined?(Faktory::CLI)
end

.worker_middleware {|@worker_chain| ... } ⇒ Object

Yields:

  • (@worker_chain)


95
96
97
98
99
# File 'lib/faktory.rb', line 95

def self.worker_middleware
  @worker_chain ||= Middleware::Chain.new
  yield @worker_chain if block_given?
  @worker_chain
end

.💃🕺(io = $stdout) ⇒ Object



123
124
125
126
127
128
129
130
# File 'lib/faktory.rb', line 123

def self.💃🕺(io = $stdout)
  colors = (31..37).to_a
  sz = colors.size
  "DANCE MODE ACTIVATED".chars.each_with_index do |chr, idx|
    io.print("\e[#{colors[rand(sz)]};1m#{chr}")
  end
  io.print("\e[0m\n")
end