Core libraries and tools part for pro architecture. It's a submodule - use from this perspective http://git.maniak.pro/madmaniak/pro
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
55 lines
1.0 KiB
55 lines
1.0 KiB
require 'concurrent'
|
|
|
|
require 'oj'
|
|
Oj.default_options = { symbol_keys: true, mode: :compat }
|
|
|
|
require 'semantic_logger'
|
|
SemanticLogger.add_appender('development.log')
|
|
SemanticLogger.default_level = :trace
|
|
|
|
class Service
|
|
|
|
SERVICE_POOL = Concurrent::CachedThreadPool.new
|
|
include SemanticLogger::Loggable
|
|
|
|
def run(job)
|
|
SERVICE_POOL.post do
|
|
begin
|
|
perform(prepare(job))
|
|
logger.trace "#{job}: OK"
|
|
rescue => reason
|
|
logger.error "#{job}: #{reason}"
|
|
end
|
|
end
|
|
end
|
|
|
|
private
|
|
|
|
def prepare(message)
|
|
Oj.load message
|
|
end
|
|
|
|
def prepare_send(message)
|
|
Oj.dump message
|
|
end
|
|
|
|
def perform(data)
|
|
end
|
|
|
|
def send(data)
|
|
$dis.with do |dis|
|
|
dis.que :addjob,
|
|
:send, prepare_send(data), 60,
|
|
:replicate, 1, :retry, 0, :ttl, 2
|
|
end
|
|
end
|
|
|
|
def reply(data, payload)
|
|
send payload.merge(sid: data[:sid], r: data[:r])
|
|
end
|
|
|
|
def broadcast(data, payload = nil)
|
|
send (payload || data).merge(sid: data[:sid], broadcast: true).reject{ |k| k == :r }
|
|
end
|
|
|
|
end
|
|
|