calloutd 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. data/bin/calloutd +4 -0
  2. data/lib/calloutd.rb +230 -0
  3. metadata +109 -0
data/bin/calloutd ADDED
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'calloutd'
4
+ launch_calloutd
data/lib/calloutd.rb ADDED
@@ -0,0 +1,230 @@
1
+ # calloutd
2
+ # Aysnchronized call implementation
3
+ # Author: Jackie.ju@gmail.com
4
+ #
5
+
6
+ require 'rubygems'
7
+ require 'launch_job'
8
+ require 'rubyutility'
9
+ require 'json'
10
+ =begin
11
+ class Callouts
12
+ def add(obj, method, delay=0, p=nil)
13
+ @s = "" if !@s
14
+ @s+= gen_callout_string(obj, method, delay, p)+"\n"
15
+ end
16
+
17
+ def save
18
+ dir = "#{g_FILEROOT}/globaldata/q"
19
+ fname="#{dir}/#{Time.now.to_f}.callout"
20
+ save_to_file(@s, fname) if @s && @s != ""
21
+
22
+ end
23
+
24
+ end
25
+ =end
26
+ def err(m)
27
+ p "err!:#{m}"
28
+ print m.backtrace.join("\n")
29
+ end
30
+ class CallOut
31
+ @@callout_fs_root = "."
32
+ class << self
33
+ def fs_root
34
+ return @@callout_fs_root if @@callout_fs_root
35
+ return "."
36
+ end
37
+ def set_fs_root(dir)
38
+ @@callout_fs_root = dir
39
+ end
40
+ def gen_callout_string(obj, method, delay=0, p=nil)
41
+ oid = ""
42
+ if obj !=nil
43
+ if obj.class == String
44
+ oid = obj
45
+ else
46
+ oid = obj.obj_id
47
+ end
48
+ end
49
+ s = "#{oid}|:|#{method.to_s}|:|#{delay}|:|#{p.to_json}"
50
+ p s
51
+ return s
52
+ end
53
+
54
+ def callout(obj, method, delay=0, *p)
55
+ s = gen_callout_string(obj, method, delay, p)
56
+ fname="#{fs_root}/#{Time.now.to_f}.callout"
57
+ save_to_file(s, fname)
58
+ dir = get_dir(fname)
59
+
60
+ p "save callout to #{fname}"
61
+ end
62
+
63
+
64
+
65
+ def pick_callouts(&block)
66
+ # p "===>pick_callouts"
67
+ dir = "#{fs_root}/*.callout"
68
+ files = Dir[dir].sort_by{|c|
69
+ File.stat(c).ctime #sort by change time
70
+ }
71
+
72
+ return if !files or files.size < 1
73
+
74
+ files.each{|fname|
75
+ # fname = nil
76
+ # if files.size > 0
77
+ # fname = files.first
78
+ # end
79
+ # p "===>pick_callouts1:#{fname}"
80
+ # p files.first
81
+ # p File.stat(files.first).ctime
82
+ #p files.last # newset
83
+ #File.stat(files.last).ctime
84
+
85
+ return if !fname
86
+ pure_fname = fname.split("/").last
87
+ f_tm = pure_fname.gsub(".callout", "").to_f
88
+ p "tm:#{f_tm}"
89
+ begin
90
+ p "fname:#{fname}"
91
+ if FileTest::exists?(fname)
92
+
93
+ data = nil
94
+ open(fname, "r+") {|f|
95
+ str = f.read
96
+ if str
97
+ ar = str.split("|:|")
98
+
99
+ data = {
100
+ :tm=>f_tm,
101
+ :oid=>ar[0],
102
+ :method=>ar[1],
103
+ :delay=>ar[2].to_i,
104
+
105
+ }
106
+ if ar[3]
107
+ data[:p] = JSON.parse(ar[3])
108
+ end
109
+ end
110
+
111
+ # TODO maybe need reserve error callouts
112
+ if data ==nil || data[:method] == nil
113
+ p "delete callout file #{fname}"
114
+ File.delete(fname)
115
+ next
116
+ end
117
+
118
+ if data
119
+ p "done21"
120
+ r = yield(data)
121
+ p "done22"
122
+ if r== true
123
+ p "delete callout file #{fname}"
124
+
125
+ File.delete(fname)
126
+ end
127
+ else
128
+ p "delete callout file #{fname}"
129
+
130
+ File.delete(fname)
131
+ end
132
+
133
+ # File.delete(fname)
134
+ break
135
+
136
+
137
+ }
138
+ end
139
+ rescue Exception=>e
140
+ err(e)
141
+ p e.inspect
142
+ File.delete(fname)
143
+
144
+ end
145
+ }
146
+ end
147
+
148
+
149
+
150
+ # to be overrite
151
+ def get_obj(oid)
152
+ end
153
+ end
154
+
155
+ end
156
+ def calloutd
157
+ CallOut.pick_callouts(){|data|
158
+ p data.inspect
159
+ if data[:method]
160
+ if data[:delay] && Time.now.to_f - data[:tm] < data[:delay]
161
+ next false
162
+ end
163
+ # p "oid=>#{data[:oid]}"
164
+ if (data[:oid] && data[:oid] !="")
165
+ n = CallOut.get_obj(data[:oid])
166
+ if n && n.respond_to?(data[:method])
167
+ begin
168
+ if p
169
+ n.send(data[:method])
170
+ else
171
+ n.send(data[:method], *data[:p])
172
+
173
+ end
174
+ rescue Exception=>e
175
+ err(e)
176
+ end
177
+ next true
178
+ end
179
+ else
180
+ begin
181
+ if p
182
+ Object.send(data[:method])
183
+ else
184
+ Object.send(data[:method], *data[:p])
185
+
186
+ end
187
+
188
+ rescue Exception=>e
189
+ err(e)
190
+ end
191
+ next true
192
+ end
193
+ end
194
+ next true
195
+ }
196
+
197
+
198
+
199
+ end
200
+ def launch_calloutd
201
+ launch_job("calloutd", 0.01)
202
+ end
203
+
204
+ =begin
205
+ # test
206
+ class CallOut
207
+ def self.get_obj(oid)
208
+ p "get_obj"
209
+ return nil
210
+ end
211
+ end
212
+ def testcallout1()
213
+ p "===>testcallout1"
214
+ end
215
+ def testcallout(p1, p2)
216
+ p "===>#{p1}===>#{p2}"
217
+ end
218
+ # launch_calloutd
219
+ # sleep(3)
220
+ CallOut.callout(nil, :testcallout1, 3)
221
+ # CallOut.callout(nil, :testcallout, 0, 1111, 2222)
222
+ calloutd
223
+ sleep(1)
224
+ calloutd
225
+ sleep(1)
226
+ calloutd
227
+ sleep(1)
228
+ calloutd
229
+ sleep(1)
230
+ =end
metadata ADDED
@@ -0,0 +1,109 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: calloutd
3
+ version: !ruby/object:Gem::Version
4
+ hash: 29
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 1
10
+ version: 0.0.1
11
+ platform: ruby
12
+ authors:
13
+ - Ju Weihua (Jackie Ju)
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2016-01-05 00:00:00 +08:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: launch_job
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ hash: 3
30
+ segments:
31
+ - 0
32
+ version: "0"
33
+ type: :runtime
34
+ version_requirements: *id001
35
+ - !ruby/object:Gem::Dependency
36
+ name: rubyutility
37
+ prerelease: false
38
+ requirement: &id002 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ hash: 3
44
+ segments:
45
+ - 0
46
+ version: "0"
47
+ type: :runtime
48
+ version_requirements: *id002
49
+ - !ruby/object:Gem::Dependency
50
+ name: json
51
+ prerelease: false
52
+ requirement: &id003 !ruby/object:Gem::Requirement
53
+ none: false
54
+ requirements:
55
+ - - ">="
56
+ - !ruby/object:Gem::Version
57
+ hash: 3
58
+ segments:
59
+ - 0
60
+ version: "0"
61
+ type: :runtime
62
+ version_requirements: *id003
63
+ description: Aynchronized call !
64
+ email: jackie.ju@gmail.com
65
+ executables:
66
+ - calloutd
67
+ extensions: []
68
+
69
+ extra_rdoc_files: []
70
+
71
+ files:
72
+ - lib/calloutd.rb
73
+ - bin/calloutd
74
+ has_rdoc: true
75
+ homepage: http://rubygems.org/gems/calloutd
76
+ licenses:
77
+ - MIT
78
+ post_install_message:
79
+ rdoc_options: []
80
+
81
+ require_paths:
82
+ - lib
83
+ required_ruby_version: !ruby/object:Gem::Requirement
84
+ none: false
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ hash: 3
89
+ segments:
90
+ - 0
91
+ version: "0"
92
+ required_rubygems_version: !ruby/object:Gem::Requirement
93
+ none: false
94
+ requirements:
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ hash: 3
98
+ segments:
99
+ - 0
100
+ version: "0"
101
+ requirements: []
102
+
103
+ rubyforge_project:
104
+ rubygems_version: 1.3.7
105
+ signing_key:
106
+ specification_version: 3
107
+ summary: Aynchronized call !
108
+ test_files: []
109
+