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 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")
@@ -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
- while !(client.closed?) && (message = client.gets)
12
- puts message.inspect
13
- client.close
14
- end
15
- end
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
- def fetch(target_time=Time.now)
18
- Storage::Schedule.where(['at <= ?', target_time]).where(:active => true)
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, :scheduler
4
+ attr_reader :storage
5
5
 
6
- def initialize
6
+ def initialize(runner=nil)
7
7
  @storage = Storage.new
8
- @scheduler = Khronos::Scheduler.new
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
- @scheduler.fetch(Time.now).each do |schedule|
19
- schedule.update_attributes(:active => false)
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 'eventmachine'
3
- require 'em-http'
3
+ require 'girl_friday'
4
4
 
5
5
  module Khronos
6
6
  module Server
7
7
 
8
- class Runner < EventMachine::Connection
9
- def post_init
10
- puts "-- someone connected to the server!"
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 receive_data json
14
- puts "Receive data to run: #{json}"
15
- schedule = JSON.parse(json)
16
- send_data ">>> you sent: #{schedule.inspect}"
18
+ def enqueue(schedule)
19
+ @queue.push(schedule.to_json)
20
+ end
17
21
 
18
- # Close connection with client immediatelly
19
- close_connection
22
+ def process(json)
23
+ schedule = JSON.parse(json)
24
+ puts "Process => #{schedule.inspect}"
20
25
 
21
26
  if (url = schedule['task_url'])
22
- http = EventMachine::HttpRequest.new(url).get :redirects => 5
23
- http.callback do
24
- puts "#{url}\n#{http.response_header.status} - #{http.response.length} bytes\n"
25
- puts http.response
26
- end
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 enqueue_recurrency!(schedule)
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
- EventMachine::HttpRequest.new(url).patch :redirects => 2
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
+
@@ -1,3 +1,3 @@
1
1
  module Khronos
2
- VERSION = '0.0.2'
2
+ VERSION = '0.0.3.pre1'
3
3
  end
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.2
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-09 00:00:00.000000000 Z
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: '0'
247
+ version: 1.3.1
215
248
  requirements: []
216
249
  rubyforge_project:
217
250
  rubygems_version: 1.8.24