karait 0.0.3 → 0.0.4
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.
- data/.gitignore +1 -0
- data/VERSION +1 -1
- data/karait.gemspec +2 -2
- data/lib/message.rb +14 -0
- data/lib/queue.rb +61 -67
- data/test/test_queue.rb +4 -4
- metadata +4 -4
data/.gitignore
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.4
|
data/karait.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{karait}
|
8
|
-
s.version = "0.0.
|
8
|
+
s.version = "0.0.4"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["bcoe"]
|
12
|
-
s.date = %q{2011-
|
12
|
+
s.date = %q{2011-09-01}
|
13
13
|
s.description = %q{A ridiculously simple cross-language queuing system, built on top of MongoDB.}
|
14
14
|
s.email = %q{bencoe@gmail.com}
|
15
15
|
s.extra_rdoc_files = [
|
data/lib/message.rb
CHANGED
@@ -15,6 +15,7 @@ module Karait
|
|
15
15
|
@source = raw_message
|
16
16
|
@queue_collection = queue_collection
|
17
17
|
@variables_to_serialize = {}
|
18
|
+
set_expired
|
18
19
|
add_accessors raw_message
|
19
20
|
end
|
20
21
|
|
@@ -49,6 +50,19 @@ module Karait
|
|
49
50
|
|
50
51
|
private
|
51
52
|
|
53
|
+
def set_expired
|
54
|
+
@expired = false
|
55
|
+
|
56
|
+
current_time = Time.now().to_f
|
57
|
+
meta = @source.fetch('_meta', {})
|
58
|
+
|
59
|
+
return if meta.fetch('expire', -1.0) == -1.0
|
60
|
+
|
61
|
+
if current_time - meta.fetch('timestamp', 0.0) > meta.fetch('expire', -1.0)
|
62
|
+
@expired = true
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
52
66
|
def add_accessors(hash)
|
53
67
|
hash.each do |k, v|
|
54
68
|
if not Message::BLACKLIST.has_key? k
|
data/lib/queue.rb
CHANGED
@@ -6,6 +6,7 @@ module Karait
|
|
6
6
|
include Karait
|
7
7
|
|
8
8
|
MESSAGES_READ = 10
|
9
|
+
NO_OBJECT_FOUND_ERROR = 'No matching object found'
|
9
10
|
|
10
11
|
def initialize(opts={})
|
11
12
|
set_instance_variables opts
|
@@ -23,8 +24,7 @@ module Karait
|
|
23
24
|
:expire => opts.fetch(:expire, -1.0),
|
24
25
|
:timestamp => Time.now().to_f,
|
25
26
|
:expired => false,
|
26
|
-
:
|
27
|
-
:accessed => 0.0
|
27
|
+
:visible_after => -1.0
|
28
28
|
}
|
29
29
|
|
30
30
|
message_dict[:_meta][:routing_key] = opts.fetch(:routing_key) if opts[:routing_key]
|
@@ -33,28 +33,72 @@ module Karait
|
|
33
33
|
end
|
34
34
|
|
35
35
|
def read(opts={})
|
36
|
+
opts = {
|
37
|
+
:messages_read => 10,
|
38
|
+
:visibility_timeout => -1.0,
|
39
|
+
:routing_key => nil
|
40
|
+
}.update(opts)
|
41
|
+
|
42
|
+
current_time = Time.new.to_f
|
36
43
|
messages = []
|
37
44
|
|
38
|
-
|
39
|
-
'_meta.expired' => false
|
45
|
+
query = {
|
46
|
+
'_meta.expired' => false,
|
47
|
+
'_meta.visible_after' => {
|
48
|
+
'$lt' => current_time
|
49
|
+
}
|
40
50
|
}
|
41
|
-
|
42
|
-
|
43
|
-
conditions['_meta.routing_key'] = opts[:routing_key]
|
51
|
+
if opts[:routing_key] != nil
|
52
|
+
query['_meta.routing_key'] = opts[:routing_key]
|
44
53
|
else
|
45
|
-
|
54
|
+
query['_meta.routing_key'] = {
|
46
55
|
'$exists' => false
|
47
56
|
}
|
48
57
|
end
|
49
58
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
'
|
54
|
-
|
55
|
-
|
59
|
+
update = false
|
60
|
+
if opts[:visibility_timeout] != -1.0
|
61
|
+
update = {
|
62
|
+
'$set' => {
|
63
|
+
'_meta.visible_after' => current_time + opts[:visibility_timeout]
|
64
|
+
}
|
65
|
+
}
|
66
|
+
end
|
67
|
+
|
68
|
+
raw_messages = []
|
69
|
+
|
70
|
+
if update
|
71
|
+
(0..opts[:messages_read]).each do
|
72
|
+
begin
|
73
|
+
|
74
|
+
raw_message = @queue_collection.find_and_modify(:query => query, :update => update)
|
75
|
+
|
76
|
+
if raw_message:
|
77
|
+
raw_messages << raw_message
|
78
|
+
else
|
79
|
+
break
|
80
|
+
end
|
81
|
+
|
82
|
+
rescue Mongo::OperationFailure => operation_failure
|
83
|
+
if not operation_failure.to_s.match(Queue::NO_OBJECT_FOUND_ERROR)
|
84
|
+
raise operation_failure
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
end
|
89
|
+
else
|
90
|
+
@queue_collection.find(query).limit(opts[:messages_read]).each do |raw_message|
|
91
|
+
raw_messages << raw_message
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
raw_messages.each do |raw_message|
|
56
96
|
message = Karait::Message.new(raw_message=raw_message, queue_collection=@queue_collection)
|
57
|
-
|
97
|
+
if message.expired?
|
98
|
+
message.delete()
|
99
|
+
else
|
100
|
+
messages << message
|
101
|
+
end
|
58
102
|
end
|
59
103
|
|
60
104
|
return messages
|
@@ -111,6 +155,8 @@ module Karait
|
|
111
155
|
@queue_collection = @database[@queue]
|
112
156
|
@queue_collection.create_index('_id')
|
113
157
|
@queue_collection.create_index('_meta.routing_key')
|
158
|
+
@queue_collection.create_index('_meta.expired')
|
159
|
+
@queue_collection.create_index('_meta.visible_after')
|
114
160
|
end
|
115
161
|
|
116
162
|
def create_capped_collection
|
@@ -121,57 +167,5 @@ module Karait
|
|
121
167
|
:max => @queue_size
|
122
168
|
)
|
123
169
|
end
|
124
|
-
|
125
|
-
def generate_find_with_timeouts_code(variable_scope)
|
126
|
-
BSON::Code.new("
|
127
|
-
function() {
|
128
|
-
var results = [];
|
129
|
-
var currentTime = parseFloat(new Date().getTime()) / 1000.0;
|
130
|
-
|
131
|
-
function hiddenByVisibilityTimeout(result) {
|
132
|
-
if ( (currentTime - result._meta.accessed) < (result._meta.visibility_timeout) ) {
|
133
|
-
return true;
|
134
|
-
}
|
135
|
-
return false;
|
136
|
-
}
|
137
|
-
|
138
|
-
function expire(result) {
|
139
|
-
if (result._meta.expire <= 0.0) {
|
140
|
-
return false;
|
141
|
-
} else if ( (currentTime - result._meta.timestamp) > result._meta.expire ) {
|
142
|
-
db[collection].update({_id: result._id}, {$set: {'_meta.expired': true}})
|
143
|
-
return true;
|
144
|
-
}
|
145
|
-
}
|
146
|
-
|
147
|
-
(function fetchResults() {
|
148
|
-
var cursor = db[collection].find(conditions).limit(limit);
|
149
|
-
var accessedIds = [];
|
150
|
-
cursor.forEach(function(result) {
|
151
|
-
if (!expire(result) && !hiddenByVisibilityTimeout(result)) {
|
152
|
-
results.push(result);
|
153
|
-
accessedIds.push(result._id);
|
154
|
-
}
|
155
|
-
});
|
156
|
-
if (visibilityTimeout != -1.0) {
|
157
|
-
db[collection].update({_id: {$in: accessedIds}},
|
158
|
-
{
|
159
|
-
$set: {
|
160
|
-
'_meta.accessed': currentTime,
|
161
|
-
'_meta.visibility_timeout': visibilityTimeout
|
162
|
-
}
|
163
|
-
},
|
164
|
-
false,
|
165
|
-
true
|
166
|
-
);
|
167
|
-
}
|
168
|
-
})();
|
169
|
-
|
170
|
-
return results;
|
171
|
-
}
|
172
|
-
",
|
173
|
-
variable_scope
|
174
|
-
)
|
175
|
-
end
|
176
170
|
end
|
177
171
|
end
|
data/test/test_queue.rb
CHANGED
@@ -226,12 +226,12 @@ class TestQueue < Test::Unit::TestCase
|
|
226
226
|
queue.write Karait::Message.new({'foo' => 1})
|
227
227
|
queue.write Karait::Message.new({:foo => 2})
|
228
228
|
queue.write Karait::Message.new({'foo' => 3})
|
229
|
-
messages = queue.read(:visibility_timeout => 0.
|
229
|
+
messages = queue.read(:visibility_timeout => 0.4)
|
230
230
|
assert_equal 3, messages.count
|
231
|
-
messages = queue.read(:visibility_timeout => 0.
|
231
|
+
messages = queue.read(:visibility_timeout => 0.4)
|
232
232
|
assert_equal 0, messages.count
|
233
|
-
sleep(0.
|
234
|
-
messages = queue.read(:visibility_timeout => 0.
|
233
|
+
sleep(0.5)
|
234
|
+
messages = queue.read(:visibility_timeout => 0.4)
|
235
235
|
assert_equal 3, messages.count
|
236
236
|
end
|
237
237
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: karait
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 23
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 4
|
10
|
+
version: 0.0.4
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- bcoe
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-
|
18
|
+
date: 2011-09-01 00:00:00 -04:00
|
19
19
|
default_executable:
|
20
20
|
dependencies: []
|
21
21
|
|