@leansdk/leanrc
Version:
LeanRC is a MVC framework for creating graceful applications
221 lines (180 loc) • 8.84 kB
text/coffeescript
# This file is part of LeanRC.
#
# LeanRC is free software: you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# LeanRC is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with LeanRC. If not, see <https://www.gnu.org/licenses/>.
# 1. Некоторая миграция должна создать очередь, чтобы ей потом можно было пользоваться, например Resque.create(<queueName>, <concurrency>)
# адаптер для аранги реализованный в виде миксина для Resque класса спроецирует запрос с использованием /queue
# адаптер для nodejs просто сохранит эти данные в какую нибудь базу данных (чтобы в нужный момент к ним обратиться и заиспользовать)
# 2. В аранго ничего делать в этом пункте не надо, движок базы данных сам будет заниматься менеджментом очередей и будет плодить потоки выполнения. Для nodejs при старте сервера надо проинициализировать Agenda сервис - взять из базы данных сохраненные <queueName> и <concurrency> и задефайнить хендлеры - внутри хендлера из принимаемых данных надо вычленить имя запускаемого скрипта, сделать require(<scriptName>) и заэкзекютить этот скрипт передав в него все данные поступившие в хендлер. (Agenda - должен покрывать функционал аранги по менеджменту очердей.)
# 3. класс Queue будет работать аналогично Record классу - проксировать вызовы методов к Resque классу (чтобы срабатывала нужная платформозависимая логика из миксина)
# 4. для job объектов не будет отдельного класса, потому что у них не будет никаких спец-методов - т.е. они будут чистыми структурами (обычный json объект)
###
```coffee
module.exports = (Module)->
class ApplicationResque extends Module::Resque
Module::ArangoResqueMixin # в этом миксине должны быть реализованы платформозависимые методы, которые будут посылать нативные запросы к реальной базе данных
Module
return ApplicationResque.initialize()
```
```coffee
module.exports = (Module)->
{RESQUE} = Module::
class PrepareModelCommand extends Module::SimpleCommand
Module
execute: Function,
default: ->
#...
.registerProxy Module::ApplicationResque.new RESQUE,
<config key>: <config value>
#...
PrepareModelCommand.initialize()
```
###
module.exports = (Module)->
{
DELAYED_JOBS_QUEUE
AnyT
FuncG, ListG, StructG, MaybeG, UnionG
QueueInterface
ResqueInterface
ConfigurableMixin
Utils: {uuid}
} = Module::
class Resque extends Module::Proxy
ConfigurableMixin
ResqueInterface
Module
tmpJobs: ListG StructG {
queueName: String
scriptName: String
data: AnyT
delay: MaybeG Number
id: String
}
fullQueueName: FuncG(String, String),
default: (queueName)->
unless /\|\>/.test queueName
[ moduleName ] = .split '|>'
queueName = "#{moduleName}|>#{queueName}"
queueName
onRegister: Function,
default: (args...)->
args...
return
onRemove: Function,
default: (args...)->
args...
= []
return
create: FuncG([String, MaybeG Number], QueueInterface),
default: (queueName, concurrency)->
vhNewQueue = yield queueName, concurrency
yield return Module::Queue.new vhNewQueue, @
all: FuncG([], ListG QueueInterface),
default: ->
results = for vhQueue in yield
Module::Queue.new vhQueue, @
yield return results
get: FuncG(String, MaybeG QueueInterface),
default: (queueName)->
vhQueue = yield queueName
if vhQueue?
yield return Module::Queue.new vhQueue, @
else
return
remove: FuncG(String),
default: (queueName)->
yield queueName
yield return
update: FuncG([String, Number], QueueInterface),
default: (queueName, concurrency)->
vhNewQueue = yield queueName, concurrency
yield return Module::Queue.new vhNewQueue, @
delay: FuncG([String, String, AnyT, MaybeG Number], UnionG String, Number),
default: (queueName, scriptName, data, delay)->
if /\|\>/.test [Symbol.for '~multitonKey']
id = uuid.v4()
.push {queueName, scriptName, data, delay, id}
else
queue = yield queueName ? DELAYED_JOBS_QUEUE
id = yield queue.push scriptName, data, delay
yield return id
getDelayed: FuncG([], ListG StructG {
queueName: String
scriptName: String
data: AnyT
delay: MaybeG Number
id: String
}),
default: -> yield return
ensureQueue: FuncG([String, MaybeG Number], StructG name: String, concurrency: Number),
default: ->
throw new Error 'Not implemented specific method'
yield return
getQueue: FuncG(String, MaybeG StructG name: String, concurrency: Number),
default: ->
throw new Error 'Not implemented specific method'
yield return
removeQueue: FuncG(String),
default: ->
throw new Error 'Not implemented specific method'
yield return
allQueues: FuncG([], ListG StructG name: String, concurrency: Number),
default: ->
throw new Error 'Not implemented specific method'
yield return
pushJob: FuncG([String, String, AnyT, MaybeG Number], UnionG String, Number),
default: ->
throw new Error 'Not implemented specific method'
yield return
getJob: FuncG([String, UnionG String, Number], MaybeG Object),
default: ->
throw new Error 'Not implemented specific method'
yield return
deleteJob: FuncG([String, UnionG String, Number], Boolean),
default: ->
throw new Error 'Not implemented specific method'
yield return
abortJob: FuncG([String, UnionG String, Number]),
default: ->
throw new Error 'Not implemented specific method'
yield return
allJobs: FuncG([String, MaybeG String], ListG Object),
default: ->
throw new Error 'Not implemented specific method'
yield return
pendingJobs: FuncG([String, MaybeG String], ListG Object),
default: ->
throw new Error 'Not implemented specific method'
yield return
progressJobs: FuncG([String, MaybeG String], ListG Object),
default: ->
throw new Error 'Not implemented specific method'
yield return
completedJobs: FuncG([String, MaybeG String], ListG Object),
default: ->
throw new Error 'Not implemented specific method'
yield return
failedJobs: FuncG([String, MaybeG String], ListG Object),
default: ->
throw new Error 'Not implemented specific method'
yield return
init: FuncG([MaybeG(String), MaybeG AnyT]),
default: (args...)->
args...
= []
return