redis_message_capsule 0.8.2 → 0.8.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/README.md +11 -7
- data/lib/redis_message_capsule.rb +7 -5
- data/lib/redis_message_capsule/version.rb +1 -1
- metadata +17 -29
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 0215b76d96a1d432d94d3cf26f4efccd5e1f2735
|
4
|
+
data.tar.gz: 72bb72a589d99c58fe15994f3b61956b5dc98b89
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 76449cdfb3c0cbd3774a728c296c4c34930809bdb9f4fa7904f69c2e37b968fc7f350e3fad7c349e6f818593c1a90c0c8c3d59fc2f5029346f328cc6010435de
|
7
|
+
data.tar.gz: 3fe6e4c83ed511ee70a45784f07703e27da442e4ade0fc19f1d616534bb1bbb9d8d0fe110bfff70a83646c140b7d67e69a704e1b7a73273fb9b2f2ef55ab2318
|
data/README.md
CHANGED
@@ -18,6 +18,8 @@ Send messages between node or rails apps asynchronously (via redis).
|
|
18
18
|
## Usage
|
19
19
|
The purpose of RedisMessageCapsule is to enable separate apps to communicate with each other asynchronously.
|
20
20
|
|
21
|
+
The ruby implementation listens for messages in a separate thread, and node listens in a separate Fiber.
|
22
|
+
|
21
23
|
### Make sure redis is running:
|
22
24
|
The code below defaults to using redis running on localhost
|
23
25
|
|
@@ -29,7 +31,7 @@ Both windows can be ruby, can be node, or one can be ruby and one can be node.
|
|
29
31
|
|
30
32
|
$ node
|
31
33
|
require('redis_message_capsule')
|
32
|
-
redisurl = 'redis://127.0.0.1:6379/'
|
34
|
+
redisurl = 'redis://127.0.0.1:6379/'
|
33
35
|
capsule = RedisMessageCapsule.capsule(redisurl)
|
34
36
|
cat = capsule.channel('cat')
|
35
37
|
cat.send('meow')
|
@@ -39,9 +41,10 @@ Both windows can be ruby, can be node, or one can be ruby and one can be node.
|
|
39
41
|
|
40
42
|
$ irb
|
41
43
|
require('redis_message_capsule')
|
42
|
-
redisurl = 'redis://127.0.0.1:6379/'
|
44
|
+
redisurl = 'redis://127.0.0.1:6379/'
|
43
45
|
capsule = RedisMessageCapsule.capsule(redisurl)
|
44
46
|
cat = capsule.channel('cat')
|
47
|
+
cat.clear # clear existing messages from this channel
|
45
48
|
cat.send('meow')
|
46
49
|
cat.send('meow')
|
47
50
|
|
@@ -50,7 +53,7 @@ Both windows can be ruby, can be node, or one can be ruby and one can be node.
|
|
50
53
|
|
51
54
|
$ node
|
52
55
|
require('redis_message_capsule')
|
53
|
-
redisurl = 'redis://127.0.0.1:6379/'
|
56
|
+
redisurl = 'redis://127.0.0.1:6379/'
|
54
57
|
capsule = RedisMessageCapsule.capsule(redisurl)
|
55
58
|
cat = capsule.channel('cat')
|
56
59
|
cat.register(function(err, message){ console.log(message) })
|
@@ -59,10 +62,11 @@ Both windows can be ruby, can be node, or one can be ruby and one can be node.
|
|
59
62
|
|
60
63
|
$ irb
|
61
64
|
require('redis_message_capsule')
|
62
|
-
redisurl = 'redis://127.0.0.1:6379/'
|
65
|
+
redisurl = 'redis://127.0.0.1:6379/'
|
63
66
|
capsule = RedisMessageCapsule.capsule(redisurl)
|
64
67
|
cat = capsule.channel('cat')
|
65
68
|
cat.register { |msg| puts msg }
|
69
|
+
For Rails apps, listeners can be registered in an initializer.
|
66
70
|
|
67
71
|
### To Send More Messages From Window 1
|
68
72
|
**in node**:
|
@@ -88,8 +92,8 @@ This module sends messages in a queue rather than a typical pub/sub model: messa
|
|
88
92
|
|
89
93
|
### Multiple Listeners on a Channel Will Round Robin
|
90
94
|
* If multiple apps are listening on the same channel, only one will actually receive the message and pass it on to its registered handlers for processing.
|
91
|
-
* Listeners run in their own thread (in ruby) or fiber(in node)
|
92
|
-
* When a message comes in, only the app that was waiting the longest will receive it.
|
95
|
+
* Listeners run in their own thread (in ruby) or fiber (in node). They will block themselves when waiting for a message, so the main event loop can continue.
|
96
|
+
* When a message comes in, only the app that was waiting the longest will receive it (the message will be forwarded to all handlers registered in that app).
|
93
97
|
|
94
98
|
## Environment
|
95
99
|
In order for 2 apps to send messages to each other, they must bind a capsule to the same redis DB and select the same db number.
|
@@ -114,7 +118,7 @@ In node use one of the following to set your environment
|
|
114
118
|
Alternatively, you can specify exactly what you want when materializing a capsule:
|
115
119
|
|
116
120
|
RedisMessageCapsule = require('redis_message_capsule')
|
117
|
-
redisurl = process.env.REDIS_URL || process.env.REDISTOGO_URL || 'redis://127.0.0.1:6379/'
|
121
|
+
redisurl = process.env.REDIS_URL || process.env.REDISTOGO_URL || 'redis://127.0.0.1:6379/'
|
118
122
|
redisdb = 5
|
119
123
|
capsule = RedisMessageCapsule.capsule(redisurl, redisdb)
|
120
124
|
|
@@ -32,7 +32,7 @@ module RedisMessageCapsule
|
|
32
32
|
def self.capsules() @capsules ||= {} end
|
33
33
|
def self.make_capsule_key(url, db_num) "#{url}.#{db_num}" end
|
34
34
|
def self.materialize_capsule(redis_url=nil, db_number=-1)
|
35
|
-
url = redis_url || config.redis_url
|
35
|
+
url = redis_url || config.redis_url
|
36
36
|
redis_uri = URI.parse(url) rescue nil
|
37
37
|
return nil if redis_uri.nil?
|
38
38
|
|
@@ -99,12 +99,13 @@ class RedisMessageCapsule::Capsule::Channel
|
|
99
99
|
@listener = nil
|
100
100
|
end
|
101
101
|
|
102
|
+
def clear
|
103
|
+
redis_client.del channel_name
|
104
|
+
end
|
105
|
+
|
102
106
|
def send (message)
|
103
107
|
payload = { 'data' => message }
|
104
108
|
redis_client.rpush channel_name, payload.to_json
|
105
|
-
rescue Exception => e
|
106
|
-
puts e.message
|
107
|
-
puts e.backtrace
|
108
109
|
ensure
|
109
110
|
self # chainability
|
110
111
|
end
|
@@ -155,7 +156,7 @@ class RedisMessageCapsule::Capsule::Channel::Listener
|
|
155
156
|
@listener_thread ||= Thread.new do
|
156
157
|
|
157
158
|
blocking_redis_client = RedisMessageCapsule.materialize_redis_client @redis_uri, @db_number
|
158
|
-
# This redis connection will block when popping, so it is created inside of its own thread
|
159
|
+
# This redis connection will block when popping, so it is created inside of its own thread
|
159
160
|
|
160
161
|
Thread.current[:name] = :RedisMessageCapsule
|
161
162
|
Thread.current[:chanel] = @channel_name
|
@@ -175,6 +176,7 @@ class RedisMessageCapsule::Capsule::Channel::Listener
|
|
175
176
|
end
|
176
177
|
rescue Exception => e
|
177
178
|
Thread.current[:listening] = false # stop listening
|
179
|
+
raise e
|
178
180
|
end
|
179
181
|
end # while
|
180
182
|
end # Thread.new
|
metadata
CHANGED
@@ -1,94 +1,83 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: redis_message_capsule
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.8.
|
5
|
-
prerelease:
|
4
|
+
version: 0.8.3
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Arbind
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2013-09-05 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: redis
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
|
-
- -
|
17
|
+
- - '>='
|
20
18
|
- !ruby/object:Gem::Version
|
21
19
|
version: '0'
|
22
20
|
type: :runtime
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
|
-
- -
|
24
|
+
- - '>='
|
28
25
|
- !ruby/object:Gem::Version
|
29
26
|
version: '0'
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
28
|
name: json
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
30
|
requirements:
|
35
|
-
- -
|
31
|
+
- - '>='
|
36
32
|
- !ruby/object:Gem::Version
|
37
33
|
version: '0'
|
38
34
|
type: :runtime
|
39
35
|
prerelease: false
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
37
|
requirements:
|
43
|
-
- -
|
38
|
+
- - '>='
|
44
39
|
- !ruby/object:Gem::Version
|
45
40
|
version: '0'
|
46
41
|
- !ruby/object:Gem::Dependency
|
47
42
|
name: rake
|
48
43
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
44
|
requirements:
|
51
|
-
- -
|
45
|
+
- - '>='
|
52
46
|
- !ruby/object:Gem::Version
|
53
47
|
version: '0'
|
54
48
|
type: :development
|
55
49
|
prerelease: false
|
56
50
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
51
|
requirements:
|
59
|
-
- -
|
52
|
+
- - '>='
|
60
53
|
- !ruby/object:Gem::Version
|
61
54
|
version: '0'
|
62
55
|
- !ruby/object:Gem::Dependency
|
63
56
|
name: rspec
|
64
57
|
requirement: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
58
|
requirements:
|
67
|
-
- -
|
59
|
+
- - '>='
|
68
60
|
- !ruby/object:Gem::Version
|
69
61
|
version: '0'
|
70
62
|
type: :development
|
71
63
|
prerelease: false
|
72
64
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
65
|
requirements:
|
75
|
-
- -
|
66
|
+
- - '>='
|
76
67
|
- !ruby/object:Gem::Version
|
77
68
|
version: '0'
|
78
69
|
- !ruby/object:Gem::Dependency
|
79
70
|
name: simplecov
|
80
71
|
requirement: !ruby/object:Gem::Requirement
|
81
|
-
none: false
|
82
72
|
requirements:
|
83
|
-
- -
|
73
|
+
- - '>='
|
84
74
|
- !ruby/object:Gem::Version
|
85
75
|
version: '0'
|
86
76
|
type: :development
|
87
77
|
prerelease: false
|
88
78
|
version_requirements: !ruby/object:Gem::Requirement
|
89
|
-
none: false
|
90
79
|
requirements:
|
91
|
-
- -
|
80
|
+
- - '>='
|
92
81
|
- !ruby/object:Gem::Version
|
93
82
|
version: '0'
|
94
83
|
description: Send messages between node or rails apps asynchronously (via redis).
|
@@ -109,27 +98,26 @@ files:
|
|
109
98
|
- spec/spec_helper.rb
|
110
99
|
homepage: https://github.com/arbind/redis_message_capsule-gem
|
111
100
|
licenses: []
|
101
|
+
metadata: {}
|
112
102
|
post_install_message:
|
113
103
|
rdoc_options: []
|
114
104
|
require_paths:
|
115
105
|
- lib
|
116
106
|
required_ruby_version: !ruby/object:Gem::Requirement
|
117
|
-
none: false
|
118
107
|
requirements:
|
119
|
-
- -
|
108
|
+
- - '>='
|
120
109
|
- !ruby/object:Gem::Version
|
121
110
|
version: '0'
|
122
111
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
123
|
-
none: false
|
124
112
|
requirements:
|
125
|
-
- -
|
113
|
+
- - '>='
|
126
114
|
- !ruby/object:Gem::Version
|
127
115
|
version: '0'
|
128
116
|
requirements: []
|
129
117
|
rubyforge_project:
|
130
|
-
rubygems_version:
|
118
|
+
rubygems_version: 2.0.5
|
131
119
|
signing_key:
|
132
|
-
specification_version:
|
120
|
+
specification_version: 4
|
133
121
|
summary: See the README file for code demonstrations
|
134
122
|
test_files:
|
135
123
|
- spec/spec_helper.rb
|