redis_message_capsule 0.8.2 → 0.8.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.
- 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
|