karait 0.0.2 → 0.0.3
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/VERSION +1 -1
- data/karait.gemspec +1 -1
- data/lib/message.rb +0 -14
- data/lib/queue.rb +61 -7
- data/test/test_message.rb +0 -32
- data/test/test_queue.rb +23 -0
- metadata +3 -3
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.3
|
data/karait.gemspec
CHANGED
data/lib/message.rb
CHANGED
@@ -15,7 +15,6 @@ module Karait
|
|
15
15
|
@source = raw_message
|
16
16
|
@queue_collection = queue_collection
|
17
17
|
@variables_to_serialize = {}
|
18
|
-
set_expired
|
19
18
|
add_accessors raw_message
|
20
19
|
end
|
21
20
|
|
@@ -50,19 +49,6 @@ module Karait
|
|
50
49
|
|
51
50
|
private
|
52
51
|
|
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
|
-
|
66
52
|
def add_accessors(hash)
|
67
53
|
hash.each do |k, v|
|
68
54
|
if not Message::BLACKLIST.has_key? k
|
data/lib/queue.rb
CHANGED
@@ -22,7 +22,9 @@ module Karait
|
|
22
22
|
message_dict[:_meta] = {
|
23
23
|
:expire => opts.fetch(:expire, -1.0),
|
24
24
|
:timestamp => Time.now().to_f,
|
25
|
-
:expired => false
|
25
|
+
:expired => false,
|
26
|
+
:visibility_timeout => -1.0,
|
27
|
+
:accessed => 0.0
|
26
28
|
}
|
27
29
|
|
28
30
|
message_dict[:_meta][:routing_key] = opts.fetch(:routing_key) if opts[:routing_key]
|
@@ -45,13 +47,14 @@ module Karait
|
|
45
47
|
}
|
46
48
|
end
|
47
49
|
|
48
|
-
@
|
50
|
+
@database.eval(generate_find_with_timeouts_code({
|
51
|
+
'conditions' => conditions,
|
52
|
+
'limit' => opts.fetch(:messages_read, Queue::MESSAGES_READ),
|
53
|
+
'collection' => @queue,
|
54
|
+
'visibilityTimeout' => opts.fetch(:visibility_timeout, -1.0)
|
55
|
+
})).each do |raw_message|
|
49
56
|
message = Karait::Message.new(raw_message=raw_message, queue_collection=@queue_collection)
|
50
|
-
|
51
|
-
message.delete()
|
52
|
-
else
|
53
|
-
messages << message
|
54
|
-
end
|
57
|
+
messages << message
|
55
58
|
end
|
56
59
|
|
57
60
|
return messages
|
@@ -119,5 +122,56 @@ module Karait
|
|
119
122
|
)
|
120
123
|
end
|
121
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
|
122
176
|
end
|
123
177
|
end
|
data/test/test_message.rb
CHANGED
@@ -78,38 +78,6 @@ class TestMessage < Test::Unit::TestCase
|
|
78
78
|
message.delete()
|
79
79
|
assert_equal 0, collection.find({'_meta.expired' => false}).count
|
80
80
|
end
|
81
|
-
|
82
|
-
should "set expired to true if current time minus timestamp is greater than expire" do
|
83
|
-
raw_message = {
|
84
|
-
'routing_key' => 'foobar',
|
85
|
-
'apple' => 3,
|
86
|
-
'banana' => 5,
|
87
|
-
'_meta' => {
|
88
|
-
'timestamp' => 0,
|
89
|
-
'expire' => 10,
|
90
|
-
'expired' => false
|
91
|
-
}
|
92
|
-
}
|
93
|
-
|
94
|
-
message = Karait::Message.new(raw_message=raw_message)
|
95
|
-
assert_equal true, message.expired?
|
96
|
-
end
|
97
|
-
|
98
|
-
should "not set expired to true if expire is -1.0" do
|
99
|
-
raw_message = {
|
100
|
-
'routing_key' => 'foobar',
|
101
|
-
'apple' => 3,
|
102
|
-
'banana' => 5,
|
103
|
-
'_meta' => {
|
104
|
-
'timestamp' => 0,
|
105
|
-
'expire' => -1.0,
|
106
|
-
'expired' => false
|
107
|
-
}
|
108
|
-
}
|
109
|
-
|
110
|
-
message = Karait::Message.new(raw_message=raw_message)
|
111
|
-
assert_equal false, message.expired?
|
112
|
-
end
|
113
81
|
|
114
82
|
should "allow a get method to be called to retrieve keys that conflict with class variables, e.g., send" do
|
115
83
|
message = Karait::Message.new(
|
data/test/test_queue.rb
CHANGED
@@ -194,6 +194,11 @@ class TestQueue < Test::Unit::TestCase
|
|
194
194
|
sleep(0.2)
|
195
195
|
messages = queue.read()
|
196
196
|
assert_equal 0, messages.count
|
197
|
+
|
198
|
+
# Make sure the meta._expired key is actually set.
|
199
|
+
collection = Mongo::Connection.new()['karait_test']['queue_test']
|
200
|
+
raw_message = collection.find_one
|
201
|
+
assert_equal true, raw_message['_meta']['expired']
|
197
202
|
end
|
198
203
|
|
199
204
|
|
@@ -211,4 +216,22 @@ class TestQueue < Test::Unit::TestCase
|
|
211
216
|
messages = queue.read()
|
212
217
|
assert_equal 0, messages.count
|
213
218
|
end
|
219
|
+
|
220
|
+
should "not see message in queue again until visibility timeout has passed" do
|
221
|
+
queue = Karait::Queue.new(
|
222
|
+
:database => 'karait_test',
|
223
|
+
:queue => 'queue_test'
|
224
|
+
)
|
225
|
+
|
226
|
+
queue.write Karait::Message.new({'foo' => 1})
|
227
|
+
queue.write Karait::Message.new({:foo => 2})
|
228
|
+
queue.write Karait::Message.new({'foo' => 3})
|
229
|
+
messages = queue.read(:visibility_timeout => 0.05)
|
230
|
+
assert_equal 3, messages.count
|
231
|
+
messages = queue.read(:visibility_timeout => 0.05)
|
232
|
+
assert_equal 0, messages.count
|
233
|
+
sleep(0.1)
|
234
|
+
messages = queue.read(:visibility_timeout => 0.05)
|
235
|
+
assert_equal 3, messages.count
|
236
|
+
end
|
214
237
|
end
|
metadata
CHANGED