khronos 0.0.2 → 0.0.3.pre1
Sign up to get free protection for your applications and to get access to all the features.
- data/khronos.gemspec +2 -0
- data/lib/khronos/scheduler.rb +7 -14
- data/lib/khronos/server/controller.rb +5 -8
- data/lib/khronos/server/em_runner.rb +56 -0
- data/lib/khronos/server/runner.rb +25 -28
- data/lib/khronos/version.rb +1 -1
- metadata +38 -5
data/khronos.gemspec
CHANGED
@@ -22,6 +22,8 @@ Gem::Specification.new do |s|
|
|
22
22
|
s.add_dependency "activesupport", "~> 3.2.8"
|
23
23
|
s.add_dependency "eventmachine", "~> 1.0.0.beta.4"
|
24
24
|
s.add_dependency "em-http-request", "~> 1.0.3"
|
25
|
+
s.add_dependency "rest-client", "~> 1.6.7"
|
26
|
+
s.add_dependency "girl_friday", "~> 0.10.0"
|
25
27
|
|
26
28
|
s.files = `git ls-files`.split("\n")
|
27
29
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
data/lib/khronos/scheduler.rb
CHANGED
@@ -3,24 +3,17 @@ require 'json'
|
|
3
3
|
|
4
4
|
module Khronos
|
5
5
|
class Scheduler
|
6
|
-
module Methods
|
7
|
-
def run(schedule)
|
8
|
-
client = TCPSocket.new( Config.instance.runner['host'], Config.instance.runner['port'] )
|
9
|
-
client.puts( schedule.to_json )
|
10
6
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
7
|
+
def self.run(schedule, runner=nil)
|
8
|
+
schedule.update_attributes(:active => false)
|
9
|
+
schedule.save
|
10
|
+
runner.enqueue(schedule)
|
11
|
+
end
|
16
12
|
|
17
|
-
|
18
|
-
|
19
|
-
end
|
13
|
+
def self.fetch(target_time=Time.now)
|
14
|
+
Storage::Schedule.where(['at <= ?', target_time]).where(:active => true)
|
20
15
|
end
|
21
16
|
|
22
|
-
include Methods
|
23
|
-
extend Methods
|
24
17
|
end
|
25
18
|
end
|
26
19
|
|
@@ -1,11 +1,11 @@
|
|
1
1
|
module Khronos
|
2
2
|
module Server
|
3
3
|
class Controller
|
4
|
-
attr_reader :storage
|
4
|
+
attr_reader :storage
|
5
5
|
|
6
|
-
def initialize
|
6
|
+
def initialize(runner=nil)
|
7
7
|
@storage = Storage.new
|
8
|
-
@
|
8
|
+
@runner = runner
|
9
9
|
end
|
10
10
|
|
11
11
|
def logger=(logger)
|
@@ -15,11 +15,8 @@ module Khronos
|
|
15
15
|
def check_schedule!
|
16
16
|
puts "Check... #{Time.now}"
|
17
17
|
count = 0
|
18
|
-
|
19
|
-
|
20
|
-
schedule.save
|
21
|
-
|
22
|
-
@scheduler.run(schedule)
|
18
|
+
Khronos::Scheduler.fetch(Time.now).each do |schedule|
|
19
|
+
Khronos::Scheduler.run(schedule, @runner)
|
23
20
|
count += 1
|
24
21
|
end
|
25
22
|
puts "Tick. #{count} jobs to run."
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'eventmachine'
|
3
|
+
require 'em-http'
|
4
|
+
|
5
|
+
#
|
6
|
+
# DEPRECATED:
|
7
|
+
# This class was used just for testing purpose.
|
8
|
+
#
|
9
|
+
|
10
|
+
module Khronos
|
11
|
+
module Server
|
12
|
+
|
13
|
+
class Runner < EventMachine::Connection
|
14
|
+
def post_init
|
15
|
+
puts "-- someone connected to the server!"
|
16
|
+
end
|
17
|
+
|
18
|
+
def receive_data json
|
19
|
+
puts "Receive data to run: #{json}"
|
20
|
+
schedule = JSON.parse(json)
|
21
|
+
send_data ">>> you sent: #{schedule.inspect}"
|
22
|
+
|
23
|
+
# Close connection with client immediatelly
|
24
|
+
close_connection
|
25
|
+
|
26
|
+
if (url = schedule['task_url'])
|
27
|
+
http = EventMachine::HttpRequest.new(url).get :redirects => 5
|
28
|
+
http.callback do
|
29
|
+
puts "#{url}\n#{http.response_header.status} - #{http.response.length} bytes\n"
|
30
|
+
puts http.response
|
31
|
+
end
|
32
|
+
|
33
|
+
http.errback do
|
34
|
+
puts "#{url}\n" + http.error
|
35
|
+
end
|
36
|
+
|
37
|
+
enqueue_recurrency!(schedule)
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
|
42
|
+
def enqueue_recurrency!(schedule)
|
43
|
+
url = "http://#{Config.instance.scheduler['host']}"
|
44
|
+
url += ":#{Config.instance.scheduler['port']}" if Config.instance.scheduler['port']
|
45
|
+
url += "/task?id=#{schedule['id']}"
|
46
|
+
EventMachine::HttpRequest.new(url).patch :redirects => 2
|
47
|
+
end
|
48
|
+
|
49
|
+
def unbind
|
50
|
+
puts "-- someone disconnected from the echo server!"
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
end
|
@@ -1,51 +1,48 @@
|
|
1
|
+
require 'rest-client'
|
1
2
|
require 'json'
|
2
|
-
require '
|
3
|
-
require 'em-http'
|
3
|
+
require 'girl_friday'
|
4
4
|
|
5
5
|
module Khronos
|
6
6
|
module Server
|
7
7
|
|
8
|
-
class Runner <
|
9
|
-
|
10
|
-
|
8
|
+
class Runner < GirlFriday::WorkQueue
|
9
|
+
attr_reader :queue
|
10
|
+
|
11
|
+
def initialize(*args)
|
12
|
+
@queue = self
|
13
|
+
super(*args) do |schedule|
|
14
|
+
self.process(schedule)
|
15
|
+
end
|
11
16
|
end
|
12
17
|
|
13
|
-
def
|
14
|
-
|
15
|
-
|
16
|
-
send_data ">>> you sent: #{schedule.inspect}"
|
18
|
+
def enqueue(schedule)
|
19
|
+
@queue.push(schedule.to_json)
|
20
|
+
end
|
17
21
|
|
18
|
-
|
19
|
-
|
22
|
+
def process(json)
|
23
|
+
schedule = JSON.parse(json)
|
24
|
+
puts "Process => #{schedule.inspect}"
|
20
25
|
|
21
26
|
if (url = schedule['task_url'])
|
22
|
-
|
23
|
-
|
24
|
-
puts "
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
http.errback do
|
29
|
-
puts "#{url}\n" + http.error
|
27
|
+
begin
|
28
|
+
response = RestClient.get(url)
|
29
|
+
puts "Callback: success. response length: #{response.length.inspect}"
|
30
|
+
rescue Exception => e
|
31
|
+
puts "Callback: error. (#{e.inspect})"
|
30
32
|
end
|
31
|
-
|
32
|
-
enqueue_recurrency!(schedule)
|
33
|
+
calculate_recurrency!(schedule)
|
33
34
|
end
|
34
|
-
|
35
35
|
end
|
36
36
|
|
37
|
-
def
|
37
|
+
def calculate_recurrency!(schedule)
|
38
38
|
url = "http://#{Config.instance.scheduler['host']}"
|
39
39
|
url += ":#{Config.instance.scheduler['port']}" if Config.instance.scheduler['port']
|
40
40
|
url += "/task?id=#{schedule['id']}"
|
41
|
-
|
42
|
-
end
|
43
|
-
|
44
|
-
def unbind
|
45
|
-
puts "-- someone disconnected from the echo server!"
|
41
|
+
RestClient.patch(url)
|
46
42
|
end
|
47
43
|
|
48
44
|
end
|
49
45
|
|
50
46
|
end
|
51
47
|
end
|
48
|
+
|
data/lib/khronos/version.rb
CHANGED
metadata
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: khronos
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.0.3.pre1
|
5
|
+
prerelease: 6
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Endel Dreyer
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-09-
|
12
|
+
date: 2012-09-10 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: sinatra
|
@@ -139,6 +139,38 @@ dependencies:
|
|
139
139
|
- - ~>
|
140
140
|
- !ruby/object:Gem::Version
|
141
141
|
version: 1.0.3
|
142
|
+
- !ruby/object:Gem::Dependency
|
143
|
+
name: rest-client
|
144
|
+
requirement: !ruby/object:Gem::Requirement
|
145
|
+
none: false
|
146
|
+
requirements:
|
147
|
+
- - ~>
|
148
|
+
- !ruby/object:Gem::Version
|
149
|
+
version: 1.6.7
|
150
|
+
type: :runtime
|
151
|
+
prerelease: false
|
152
|
+
version_requirements: !ruby/object:Gem::Requirement
|
153
|
+
none: false
|
154
|
+
requirements:
|
155
|
+
- - ~>
|
156
|
+
- !ruby/object:Gem::Version
|
157
|
+
version: 1.6.7
|
158
|
+
- !ruby/object:Gem::Dependency
|
159
|
+
name: girl_friday
|
160
|
+
requirement: !ruby/object:Gem::Requirement
|
161
|
+
none: false
|
162
|
+
requirements:
|
163
|
+
- - ~>
|
164
|
+
- !ruby/object:Gem::Version
|
165
|
+
version: 0.10.0
|
166
|
+
type: :runtime
|
167
|
+
prerelease: false
|
168
|
+
version_requirements: !ruby/object:Gem::Requirement
|
169
|
+
none: false
|
170
|
+
requirements:
|
171
|
+
- - ~>
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: 0.10.0
|
142
174
|
description: Ruby HTTP Job Scheduler Interface. An advanced Cron replacement for the
|
143
175
|
cloud.
|
144
176
|
email:
|
@@ -164,6 +196,7 @@ files:
|
|
164
196
|
- lib/khronos/scheduler.rb
|
165
197
|
- lib/khronos/server.rb
|
166
198
|
- lib/khronos/server/controller.rb
|
199
|
+
- lib/khronos/server/em_runner.rb
|
167
200
|
- lib/khronos/server/runner.rb
|
168
201
|
- lib/khronos/server/scheduler.rb
|
169
202
|
- lib/khronos/storage.rb
|
@@ -209,9 +242,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
209
242
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
210
243
|
none: false
|
211
244
|
requirements:
|
212
|
-
- - ! '
|
245
|
+
- - ! '>'
|
213
246
|
- !ruby/object:Gem::Version
|
214
|
-
version:
|
247
|
+
version: 1.3.1
|
215
248
|
requirements: []
|
216
249
|
rubyforge_project:
|
217
250
|
rubygems_version: 1.8.24
|