message_channel 1.0.1 → 1.1.0
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 +4 -4
- data/README.adoc +24 -24
- data/README.ja.adoc +24 -24
- data/lib/message_channel.rb +0 -1
- data/lib/message_channel/base.rb +1 -9
- data/lib/message_channel/druby.rb +16 -5
- data/lib/message_channel/mqtt.rb +16 -5
- data/lib/message_channel/observer.rb +16 -5
- data/lib/message_channel/redis.rb +16 -5
- data/lib/message_channel/version.rb +1 -1
- data/message_channel.gemspec +1 -2
- data/sample/all_1.rb +0 -7
- data/sample/sample.txt +0 -8
- data/sample/sample_4.rb +31 -0
- metadata +4 -19
- data/.travis.yml +0 -6
- data/lib/message_channel/mongodb.rb +0 -133
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e8dc94c4562b42f2714eda4846834fc1751a8d023aa0e2279e384e1084c37f82
|
4
|
+
data.tar.gz: e339c8ce08b1e8ba82a93e746808c5b5251bffa6ee794d3ad6d61ed51bca08bd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 78ba1bb8386cea8cb9e2909f49c6745d9f9710d3b37c8a9870faa83fe09d177af62e963b915457d77a12ce08a5aba3c98a3085ff1c360829fe32d9eabad41518
|
7
|
+
data.tar.gz: bd995e964b92d39ff297953ec4d7eedf6ddabc45b5c1f3b1f7533c3704b6dab53a4e79a5fe94f2304c4ac9e2d7334275d3cdee8f4c8e158f2a4ac94a848cbfd8
|
data/README.adoc
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
= MessageChannel
|
2
2
|
|
3
|
-
Yet another observer pattern library via Observable, DRb, MQTT, Redis
|
3
|
+
Yet another observer pattern library via Observable, DRb, MQTT, Redis.
|
4
4
|
|
5
5
|
== Features
|
6
6
|
|
7
7
|
* Thread based observer pattern library.
|
8
|
-
* Implemented as a wrapper for Obserbable, DRb, MQTT, Redis
|
8
|
+
* Implemented as a wrapper for Obserbable, DRb, MQTT, Redis.
|
9
9
|
* Observer can communicate without using sockets.
|
10
10
|
* DRb can communicate between processes without using an external server.
|
11
|
-
* MQTT
|
11
|
+
* MQTT and Redis can create apps that can communicate in other languages.
|
12
12
|
* Distribute topic as a character string and data as a JSON-encoded character string.
|
13
13
|
|
14
14
|
== Installation
|
@@ -89,7 +89,7 @@ sleep
|
|
89
89
|
|
90
90
|
[source,ruby]
|
91
91
|
----
|
92
|
-
MessageChannel.new( uri = nil, type: nil, host: nil, port: nil, db: nil
|
92
|
+
MessageChannel.new( uri = nil, type: nil, host: nil, port: nil, db: nil )
|
93
93
|
----
|
94
94
|
|
95
95
|
* Result:
|
@@ -101,18 +101,14 @@ MessageChannel.new( uri = nil, type: nil, host: nil, port: nil, db: nil, size: n
|
|
101
101
|
*** "druby://127.0.0.1:8787"
|
102
102
|
*** "mqtt://127.0.0.1:1883"
|
103
103
|
*** "redis://127.0.0.1:6379/0"
|
104
|
-
*** "mongodb://127.0.0.1:27017/test?size=4000&name=_event_queue"
|
105
104
|
** type: Channel type. (default: "observer")
|
106
105
|
*** "observer"
|
107
106
|
*** "druby"
|
108
107
|
*** "mqtt"
|
109
108
|
*** "redis"
|
110
|
-
*** "mongodb"
|
111
109
|
** host: Service host. (default: nil)
|
112
110
|
** port: Service port. (default: nil)
|
113
|
-
** db: Database
|
114
|
-
** size: Queue Size. (default: 4000)
|
115
|
-
** name: Queue Name. (default: "_event_queue")
|
111
|
+
** db: Database. (default: nil)
|
116
112
|
|
117
113
|
=== Notify through the channel.
|
118
114
|
|
@@ -122,7 +118,6 @@ MessageChannel::Observer#notify( topic, **items )
|
|
122
118
|
MessageChannel::Druby#notify( topic, **items )
|
123
119
|
MessageChannel::Mqtt#notify( topic, **items )
|
124
120
|
MessageChannel::Redis#notify( topic, **items )
|
125
|
-
MessageChannel::Mongodb#notify( topic, **items )
|
126
121
|
----
|
127
122
|
|
128
123
|
* Result:
|
@@ -136,26 +131,32 @@ MessageChannel::Mongodb#notify( topic, **items )
|
|
136
131
|
|
137
132
|
[source,ruby]
|
138
133
|
----
|
139
|
-
MessageChannel::Observer#listen( *patterns, &block )
|
140
|
-
MessageChannel::Druby#listen( *patterns, &block )
|
141
|
-
MessageChannel::Mqtt#listen( *patterns, &block )
|
142
|
-
MessageChannel::Redis#listen( *patterns, &block )
|
143
|
-
MessageChannel::Mongodb#listen( *patterns, &block )
|
134
|
+
MessageChannel::Observer#listen( *patterns, timeout: nil, &block )
|
135
|
+
MessageChannel::Druby#listen( *patterns, timeout: nil, &block )
|
136
|
+
MessageChannel::Mqtt#listen( *patterns, timeout: nil, &block )
|
137
|
+
MessageChannel::Redis#listen( *patterns, timeout: nil, &block )
|
144
138
|
----
|
145
139
|
|
146
|
-
*
|
147
|
-
**
|
140
|
+
* with block: (async)
|
141
|
+
** Result:
|
148
142
|
*** nil.
|
149
|
-
|
143
|
+
|
144
|
+
** Parameter:
|
145
|
+
*** patterns: mask patterns.
|
146
|
+
|
147
|
+
* without block: (await)
|
148
|
+
** Result:
|
149
|
+
return nil if timeout.
|
150
150
|
*** topic: a notified topic.
|
151
151
|
*** items: notified items.
|
152
152
|
|
153
|
-
|
154
|
-
|
153
|
+
** Parameter:
|
154
|
+
*** patterns: mask patterns.
|
155
|
+
*** timeout: nil or wait second.
|
155
156
|
|
156
|
-
|
157
|
-
|
158
|
-
|
157
|
+
** Block Parameter:
|
158
|
+
*** topic: a notified topic.
|
159
|
+
*** items: notified items.
|
159
160
|
|
160
161
|
=== Unlisten to notification.
|
161
162
|
|
@@ -165,7 +166,6 @@ MessageChannel::Observer#unlisten( *patterns )
|
|
165
166
|
MessageChannel::Druby#unlisten( *patterns )
|
166
167
|
MessageChannel::Mqtt#unlisten( *patterns )
|
167
168
|
MessageChannel::Redis#unlisten( *patterns )
|
168
|
-
MessageChannel::Mongodb#unlisten( *patterns )
|
169
169
|
----
|
170
170
|
|
171
171
|
* Result:
|
data/README.ja.adoc
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
= MessageChannel
|
2
2
|
|
3
|
-
オブザーバパターンライブラリのひとつ. Observable, DRb, MQTT, Redis
|
3
|
+
オブザーバパターンライブラリのひとつ. Observable, DRb, MQTT, Redis を用いる.
|
4
4
|
|
5
5
|
== 特徴
|
6
6
|
|
7
7
|
* スレッドベースのオブザーバパターンライブラリ.
|
8
|
-
* Obserbable, DRb, MQTT, Redis
|
8
|
+
* Obserbable, DRb, MQTT, Redis のラッパーとして実装.
|
9
9
|
* Observer はソケットを使わずに通信できる.
|
10
10
|
* DRb は外部サーバを使わずにプロセス間通信できる.
|
11
|
-
* MQTT
|
11
|
+
* MQTT と Redis は通信できるアプリを他言語でも作成できる.
|
12
12
|
* トピックは文字列として、データは JSON 化した文字列として配信する.
|
13
13
|
|
14
14
|
== 導入
|
@@ -89,7 +89,7 @@ sleep
|
|
89
89
|
|
90
90
|
[source,ruby]
|
91
91
|
----
|
92
|
-
MessageChannel.new( uri = nil, type: nil, host: nil, port: nil, db: nil
|
92
|
+
MessageChannel.new( uri = nil, type: nil, host: nil, port: nil, db: nil )
|
93
93
|
----
|
94
94
|
|
95
95
|
* Result:
|
@@ -101,18 +101,14 @@ MessageChannel.new( uri = nil, type: nil, host: nil, port: nil, db: nil, size: n
|
|
101
101
|
*** "druby://127.0.0.1:8787"
|
102
102
|
*** "mqtt://127.0.0.1:1883"
|
103
103
|
*** "redis://127.0.0.1:6379/0"
|
104
|
-
*** "mongodb://127.0.0.1:27017/test?size=4000&name=_event_queue"
|
105
104
|
** type: Channel type. (default: "observer")
|
106
105
|
*** "observer"
|
107
106
|
*** "druby"
|
108
107
|
*** "mqtt"
|
109
108
|
*** "redis"
|
110
|
-
*** "mongodb"
|
111
109
|
** host: サービスホスト. (default: nil)
|
112
110
|
** port: サービスポート. (default: nil)
|
113
|
-
** db:
|
114
|
-
** size: キューサイズ. (default: 4000)
|
115
|
-
** name: キュー名. (default: "_event_queue")
|
111
|
+
** db: データベース. (default: nil)
|
116
112
|
|
117
113
|
=== チャネル経由で通知.
|
118
114
|
|
@@ -122,7 +118,6 @@ MessageChannel::Observer#notify( topic, **items )
|
|
122
118
|
MessageChannel::Druby#notify( topic, **items )
|
123
119
|
MessageChannel::Mqtt#notify( topic, **items )
|
124
120
|
MessageChannel::Redis#notify( topic, **items )
|
125
|
-
MessageChannel::Mongodb#notify( topic, **items )
|
126
121
|
----
|
127
122
|
|
128
123
|
* Result:
|
@@ -136,26 +131,32 @@ MessageChannel::Mongodb#notify( topic, **items )
|
|
136
131
|
|
137
132
|
[source,ruby]
|
138
133
|
----
|
139
|
-
MessageChannel::Observer#listen( *patterns, &block )
|
140
|
-
MessageChannel::Druby#listen( *patterns, &block )
|
141
|
-
MessageChannel::Mqtt#listen( *patterns, &block )
|
142
|
-
MessageChannel::Redis#listen( *patterns, &block )
|
143
|
-
MessageChannel::Mongodb#listen( *patterns, &block )
|
134
|
+
MessageChannel::Observer#listen( *patterns, timeout: nil, &block )
|
135
|
+
MessageChannel::Druby#listen( *patterns, timeout: nil, &block )
|
136
|
+
MessageChannel::Mqtt#listen( *patterns, timeout: nil, &block )
|
137
|
+
MessageChannel::Redis#listen( *patterns, timeout: nil, &block )
|
144
138
|
----
|
145
139
|
|
146
|
-
*
|
147
|
-
**
|
140
|
+
* ブロック引数あり: (非同期)
|
141
|
+
** Result:
|
148
142
|
*** nil.
|
149
|
-
|
143
|
+
|
144
|
+
** Parameter:
|
145
|
+
*** patterns: マスクパターンの配列.
|
146
|
+
|
147
|
+
* ブロック引数なし: (待機)
|
148
|
+
** Result:
|
149
|
+
タイムアウトなら nil を返す.
|
150
150
|
*** topic: 通知トピック.
|
151
151
|
*** items: 通知アイテム.
|
152
152
|
|
153
|
-
|
154
|
-
|
153
|
+
** Parameter:
|
154
|
+
*** patterns: マスクパターンの配列.
|
155
|
+
*** timeout: nil または待機秒数.
|
155
156
|
|
156
|
-
|
157
|
-
|
158
|
-
|
157
|
+
** Block Parameter:
|
158
|
+
*** topic: 通知トピック.
|
159
|
+
*** items: 通知アイテム.
|
159
160
|
|
160
161
|
=== 通知待機を解除.
|
161
162
|
|
@@ -165,7 +166,6 @@ MessageChannel::Observer#unlisten( *patterns )
|
|
165
166
|
MessageChannel::Druby#unlisten( *patterns )
|
166
167
|
MessageChannel::Mqtt#unlisten( *patterns )
|
167
168
|
MessageChannel::Redis#unlisten( *patterns )
|
168
|
-
MessageChannel::Mongodb#unlisten( *patterns )
|
169
169
|
----
|
170
170
|
|
171
171
|
* Result:
|
data/lib/message_channel.rb
CHANGED
data/lib/message_channel/base.rb
CHANGED
@@ -6,9 +6,8 @@ module MessageChannel
|
|
6
6
|
# "druby://127.0.0.1:8787"
|
7
7
|
# "mqtt://127.0.0.1:1883"
|
8
8
|
# "redis://127.0.0.1:6379/0"
|
9
|
-
# "mongodb://127.0.0.1:27017/test?size=4000&name=_event_queue"
|
10
9
|
|
11
|
-
def new( uri = nil, type: nil, host: nil, port: nil, db: nil
|
10
|
+
def new( uri = nil, type: nil, host: nil, port: nil, db: nil )
|
12
11
|
if uri
|
13
12
|
uris = URI.parse( uri )
|
14
13
|
if uris.scheme.nil? && uris.host.nil? && uris.port.nil? && uris.path
|
@@ -20,8 +19,6 @@ module MessageChannel
|
|
20
19
|
port = uris.port || port
|
21
20
|
params = uris.path.gsub(/^\//, "").split('/')
|
22
21
|
query = Hash[ URI::decode_www_form(uris.query) ] rescue {}
|
23
|
-
size = query[:size] || size
|
24
|
-
name = query[:name] || name
|
25
22
|
end
|
26
23
|
else
|
27
24
|
parans = []
|
@@ -39,11 +36,6 @@ module MessageChannel
|
|
39
36
|
when "redis"
|
40
37
|
options[:db] = params.shift || db
|
41
38
|
MessageChannel::Redis.new( **options )
|
42
|
-
when "mongodb"
|
43
|
-
options[:db] = params.shift || db
|
44
|
-
options[:size] = size
|
45
|
-
options[:name] = name
|
46
|
-
MessageChannel::Mongodb.new( **options )
|
47
39
|
end
|
48
40
|
end
|
49
41
|
|
@@ -1,5 +1,6 @@
|
|
1
1
|
require "drb/drb"
|
2
2
|
require "json"
|
3
|
+
require "timeout"
|
3
4
|
|
4
5
|
module MessageChannel
|
5
6
|
|
@@ -155,17 +156,27 @@ module MessageChannel
|
|
155
156
|
end
|
156
157
|
end
|
157
158
|
|
158
|
-
def listen( *patterns, &block )
|
159
|
-
if
|
160
|
-
listen_once( *patterns )
|
161
|
-
else
|
159
|
+
def listen( *patterns, timeout: nil, &block )
|
160
|
+
if block_given?
|
162
161
|
listen_each( *patterns ) do |topic, items|
|
163
162
|
block.call( topic, items )
|
164
163
|
end
|
164
|
+
return nil
|
165
|
+
end
|
166
|
+
if timeout.nil? || ( timeout.is_a?( Numeric ) && timeout >= 0 )
|
167
|
+
begin
|
168
|
+
Timeout.timeout( timeout ) do
|
169
|
+
listen_once( *patterns )
|
170
|
+
end
|
171
|
+
rescue Timeout::Error
|
172
|
+
return nil
|
173
|
+
end
|
174
|
+
else
|
175
|
+
raise ArgumentError, "timeout: %s" % timeout
|
165
176
|
end
|
166
177
|
end
|
167
178
|
|
168
|
-
def unlisten(
|
179
|
+
def unlisten( *patterns )
|
169
180
|
patterns.each do |pattern|
|
170
181
|
@agent.unlisten( pattern )
|
171
182
|
@threads.delete( pattern )
|
data/lib/message_channel/mqtt.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require "mqtt"
|
2
2
|
require "json"
|
3
|
+
require "timeout"
|
3
4
|
|
4
5
|
module MessageChannel
|
5
6
|
class Mqtt
|
@@ -53,17 +54,27 @@ module MessageChannel
|
|
53
54
|
end
|
54
55
|
end
|
55
56
|
|
56
|
-
def listen( *patterns, &block )
|
57
|
-
if
|
58
|
-
listen_once( *patterns )
|
59
|
-
else
|
57
|
+
def listen( *patterns, timeout: nil, &block )
|
58
|
+
if block_given?
|
60
59
|
listen_each( *patterns ) do |topic, items|
|
61
60
|
block.call( topic, items )
|
62
61
|
end
|
62
|
+
return nil
|
63
|
+
end
|
64
|
+
if timeout.nil? || ( timeout.is_a?( Numeric ) && timeout >= 0 )
|
65
|
+
begin
|
66
|
+
Timeout.timeout( timeout ) do
|
67
|
+
listen_once( *patterns )
|
68
|
+
end
|
69
|
+
rescue Timeout::Error
|
70
|
+
return nil
|
71
|
+
end
|
72
|
+
else
|
73
|
+
raise ArgumentError, "timeout: %s" % timeout
|
63
74
|
end
|
64
75
|
end
|
65
76
|
|
66
|
-
def unlisten(
|
77
|
+
def unlisten( *patterns )
|
67
78
|
patterns.each do |pattern|
|
68
79
|
@threads[pattern].kill rescue nil
|
69
80
|
@threads.delete( pattern ) rescue nil
|
@@ -1,5 +1,6 @@
|
|
1
1
|
require "observer"
|
2
2
|
require "json"
|
3
|
+
require "timeout"
|
3
4
|
|
4
5
|
module MessageChannel
|
5
6
|
|
@@ -54,17 +55,27 @@ module MessageChannel
|
|
54
55
|
end
|
55
56
|
end
|
56
57
|
|
57
|
-
def listen( *patterns, &block )
|
58
|
-
if
|
59
|
-
listen_once( *patterns )
|
60
|
-
else
|
58
|
+
def listen( *patterns, timeout: nil, &block )
|
59
|
+
if block_given?
|
61
60
|
listen_each( *patterns ) do |topic, items|
|
62
61
|
block.call( topic, items )
|
63
62
|
end
|
63
|
+
return nil
|
64
|
+
end
|
65
|
+
if timeout.nil? || ( timeout.is_a?( Numeric ) && timeout >= 0 )
|
66
|
+
begin
|
67
|
+
Timeout.timeout( timeout ) do
|
68
|
+
listen_once( *patterns )
|
69
|
+
end
|
70
|
+
rescue Timeout::Error
|
71
|
+
return nil
|
72
|
+
end
|
73
|
+
else
|
74
|
+
raise ArgumentError, "timeout: %s" % timeout
|
64
75
|
end
|
65
76
|
end
|
66
77
|
|
67
|
-
def unlisten(
|
78
|
+
def unlisten( *patterns )
|
68
79
|
patterns.each do |pattern|
|
69
80
|
if ( action = @asyncs[pattern] )
|
70
81
|
@asyncs.delete( pattern )
|
@@ -1,5 +1,6 @@
|
|
1
1
|
require "redis"
|
2
2
|
require "json"
|
3
|
+
require "timeout"
|
3
4
|
|
4
5
|
module MessageChannel
|
5
6
|
class Redis
|
@@ -62,17 +63,27 @@ module MessageChannel
|
|
62
63
|
end
|
63
64
|
end
|
64
65
|
|
65
|
-
def listen( *patterns, &block )
|
66
|
-
if
|
67
|
-
listen_once( *patterns )
|
68
|
-
else
|
66
|
+
def listen( *patterns, timeout: nil, &block )
|
67
|
+
if block_given?
|
69
68
|
listen_each( *patterns ) do |topic, items|
|
70
69
|
block.call( topic, items )
|
71
70
|
end
|
71
|
+
return nil
|
72
|
+
end
|
73
|
+
if timeout.nil? || ( timeout.is_a?( Numeric ) && timeout >= 0 )
|
74
|
+
begin
|
75
|
+
Timeout.timeout( timeout ) do
|
76
|
+
listen_once( *patterns )
|
77
|
+
end
|
78
|
+
rescue Timeout::Error
|
79
|
+
return nil
|
80
|
+
end
|
81
|
+
else
|
82
|
+
raise ArgumentError, "timeout: %s" % timeout
|
72
83
|
end
|
73
84
|
end
|
74
85
|
|
75
|
-
def unlisten(
|
86
|
+
def unlisten( *patterns )
|
76
87
|
patterns.each do |pattern|
|
77
88
|
@threads[pattern].kill rescue nil
|
78
89
|
@threads.delete( pattern ) rescue nil
|
data/message_channel.gemspec
CHANGED
@@ -7,7 +7,7 @@ Gem::Specification.new do |spec|
|
|
7
7
|
spec.email = ["arima.yasuhiro@gmail.com"]
|
8
8
|
|
9
9
|
spec.summary = %q{ Wrapper library for publish/subscribe pattern. }
|
10
|
-
spec.description = %q{ Yet another observer pattern wrapper library via Observable, DRb, MQTT, Redis
|
10
|
+
spec.description = %q{ Yet another observer pattern wrapper library via Observable, DRb, MQTT, Redis. }
|
11
11
|
spec.homepage = "https://github.com/arimay/message_channel"
|
12
12
|
spec.license = "MIT"
|
13
13
|
|
@@ -23,7 +23,6 @@ Gem::Specification.new do |spec|
|
|
23
23
|
spec.add_development_dependency "mqtt"
|
24
24
|
spec.add_development_dependency "redis"
|
25
25
|
spec.add_development_dependency "msgpack"
|
26
|
-
spec.add_development_dependency "mongo"
|
27
26
|
|
28
27
|
spec.add_development_dependency "rake"
|
29
28
|
spec.add_development_dependency "rspec"
|
data/sample/all_1.rb
CHANGED
@@ -4,7 +4,6 @@ ObserverChannel = MessageChannel.new( "observer" )
|
|
4
4
|
DrubyChannel = MessageChannel.new( "druby" )
|
5
5
|
MqttChannel = MessageChannel.new( "mqtt" )
|
6
6
|
RedisChannel = MessageChannel.new( "redis" )
|
7
|
-
MongodbChannel = MessageChannel.new( "mongodb" )
|
8
7
|
|
9
8
|
Signal.trap( :INT ) do
|
10
9
|
exit
|
@@ -30,11 +29,6 @@ RedisChannel.listen( mask4 ) do |topic, items|
|
|
30
29
|
p [:redis___, mask4, topic, items]
|
31
30
|
end
|
32
31
|
|
33
|
-
mask5 = "mongodb_/*"
|
34
|
-
MongodbChannel.listen( mask5 ) do |topic, items|
|
35
|
-
p [:mongodb_, mask5, topic, items]
|
36
|
-
end
|
37
|
-
|
38
32
|
i = 0
|
39
33
|
while true
|
40
34
|
sleep 1
|
@@ -44,5 +38,4 @@ while true
|
|
44
38
|
DrubyChannel.notify "druby___/#{i}", at: now
|
45
39
|
MqttChannel.notify "mqtt____/#{i}", at: now
|
46
40
|
RedisChannel.notify "redis___/#{i}", at: now
|
47
|
-
MongodbChannel.notify "mongodb_/#{i}", at: now
|
48
41
|
end
|
data/sample/sample.txt
CHANGED
@@ -21,11 +21,3 @@ URI defailt params for message_channel.
|
|
21
21
|
"redis://127.0.0.1:6379"
|
22
22
|
"redis://127.0.0.1:6379/1"
|
23
23
|
|
24
|
-
"mongodb"
|
25
|
-
"mongodb://127.0.0.1"
|
26
|
-
"mongodb://127.0.0.1:27017"
|
27
|
-
"mongodb://127.0.0.1:27017/test"
|
28
|
-
"mongodb://127.0.0.1:27017/test?size=8000"
|
29
|
-
"mongodb://127.0.0.1:27017/test?name=_event_queue"
|
30
|
-
"mongodb://127.0.0.1:27017/test?size=8000&name=_event_queue"
|
31
|
-
|
data/sample/sample_4.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
require "message_channel"
|
2
|
+
|
3
|
+
p uri = ARGV.shift
|
4
|
+
p Channel = MessageChannel.new( uri )
|
5
|
+
|
6
|
+
Signal.trap( :INT ) do
|
7
|
+
exit
|
8
|
+
end
|
9
|
+
|
10
|
+
Channel.listen( "hello", "world" ) do |topic, items|
|
11
|
+
p [:async, topic, items]
|
12
|
+
end
|
13
|
+
|
14
|
+
Thread.start do
|
15
|
+
while true
|
16
|
+
topic, items = Channel.listen( "hello", "world", timeout: rand )
|
17
|
+
p [:await, topic, items]
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
Thread.start do
|
22
|
+
while true
|
23
|
+
Channel.notify( "hello", at: Time.now.to_s )
|
24
|
+
sleep 1
|
25
|
+
Channel.notify( "world", at: Time.now.to_s )
|
26
|
+
sleep 1
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
sleep
|
31
|
+
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: message_channel
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- arimay
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-03-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: mqtt
|
@@ -52,20 +52,6 @@ dependencies:
|
|
52
52
|
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
name: mongo
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - ">="
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: '0'
|
62
|
-
type: :development
|
63
|
-
prerelease: false
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - ">="
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: '0'
|
69
55
|
- !ruby/object:Gem::Dependency
|
70
56
|
name: rake
|
71
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -95,7 +81,7 @@ dependencies:
|
|
95
81
|
- !ruby/object:Gem::Version
|
96
82
|
version: '0'
|
97
83
|
description: " Yet another observer pattern wrapper library via Observable, DRb, MQTT,
|
98
|
-
Redis
|
84
|
+
Redis. "
|
99
85
|
email:
|
100
86
|
- arima.yasuhiro@gmail.com
|
101
87
|
executables: []
|
@@ -105,7 +91,6 @@ files:
|
|
105
91
|
- ".gitignore"
|
106
92
|
- ".rspec"
|
107
93
|
- ".rubocop.yml"
|
108
|
-
- ".travis.yml"
|
109
94
|
- Gemfile
|
110
95
|
- README.adoc
|
111
96
|
- README.ja.adoc
|
@@ -115,7 +100,6 @@ files:
|
|
115
100
|
- lib/message_channel.rb
|
116
101
|
- lib/message_channel/base.rb
|
117
102
|
- lib/message_channel/druby.rb
|
118
|
-
- lib/message_channel/mongodb.rb
|
119
103
|
- lib/message_channel/mqtt.rb
|
120
104
|
- lib/message_channel/observer.rb
|
121
105
|
- lib/message_channel/redis.rb
|
@@ -126,6 +110,7 @@ files:
|
|
126
110
|
- sample/sample_1.rb
|
127
111
|
- sample/sample_2.rb
|
128
112
|
- sample/sample_3.rb
|
113
|
+
- sample/sample_4.rb
|
129
114
|
homepage: https://github.com/arimay/message_channel
|
130
115
|
licenses:
|
131
116
|
- MIT
|
data/.travis.yml
DELETED
@@ -1,133 +0,0 @@
|
|
1
|
-
require "mongo"
|
2
|
-
require "json"
|
3
|
-
|
4
|
-
::Mongo::Logger.logger.level = Logger::ERROR
|
5
|
-
|
6
|
-
module MessageChannel
|
7
|
-
class Mongodb
|
8
|
-
SIZE = 8000
|
9
|
-
NAME = "_event_queue"
|
10
|
-
|
11
|
-
def initialize( host: nil, port: nil, db: nil, size: nil, name: nil )
|
12
|
-
@host = host || "127.0.0.1"
|
13
|
-
@port = ( port || 27017 ).to_i
|
14
|
-
@db = db || "test"
|
15
|
-
@size = ( size || SIZE ).to_i
|
16
|
-
@name = name || NAME
|
17
|
-
|
18
|
-
@url = "mongodb://#{ @host }:#{ @port }/#{ @db }"
|
19
|
-
@client = ::Mongo::Client.new( @url )
|
20
|
-
|
21
|
-
@threads = {}
|
22
|
-
@mutex = Mutex.new
|
23
|
-
|
24
|
-
@event_queue = get_event_queue
|
25
|
-
end
|
26
|
-
|
27
|
-
def get_event_queue
|
28
|
-
event_queue = @mutex.synchronize do
|
29
|
-
if @client.database.collection_names.include?( @name )
|
30
|
-
event_queue = @client[ @name ]
|
31
|
-
else
|
32
|
-
event_queue = @client[ @name, capped: true, size: @size ]
|
33
|
-
event_queue.create
|
34
|
-
now = Time.now
|
35
|
-
doc = {
|
36
|
-
topic: "reset",
|
37
|
-
at: now.strftime("%Y%m%d.%H%M%S.%6L"),
|
38
|
-
}
|
39
|
-
event_queue.insert_one( doc )
|
40
|
-
event_queue
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
def get_event_tail( event_queue )
|
46
|
-
filter = {}
|
47
|
-
if ( enum = event_queue.find( {}, { sort: { "$natural" => -1 } } ).to_enum )
|
48
|
-
if ( doc = enum.next rescue nil )
|
49
|
-
filter = { "_id"=>{ "$gt"=>doc["_id"] } }
|
50
|
-
end
|
51
|
-
end
|
52
|
-
event_tail = event_queue.find( filter, { cursor_type: :tailable_await } ).to_enum
|
53
|
-
end
|
54
|
-
|
55
|
-
def listen_once( *patterns )
|
56
|
-
queue = Queue.new
|
57
|
-
threads = {}
|
58
|
-
patterns.each do |pattern|
|
59
|
-
threads[pattern] = ::Thread.start( pattern ) do |pttrn|
|
60
|
-
event_queue = get_event_queue
|
61
|
-
event_tail = get_event_tail( event_queue )
|
62
|
-
begin
|
63
|
-
while ( doc = event_tail.next )
|
64
|
-
items = JSON.parse( doc.to_json, symbolize_names: true )
|
65
|
-
topic = items[:topic]
|
66
|
-
if File.fnmatch( pttrn, topic, File::FNM_PATHNAME )
|
67
|
-
items.delete( :_id )
|
68
|
-
items.delete( :topic )
|
69
|
-
queue.push [topic, items]
|
70
|
-
end
|
71
|
-
end
|
72
|
-
rescue => e
|
73
|
-
nil
|
74
|
-
end
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
topic, items = queue.pop
|
79
|
-
patterns.each do |pattern|
|
80
|
-
threads[pattern].kill rescue nil
|
81
|
-
threads.delete( pattern ) rescue nil
|
82
|
-
end
|
83
|
-
[topic, items]
|
84
|
-
end
|
85
|
-
|
86
|
-
def listen_each( *patterns, &block )
|
87
|
-
patterns.each do |pattern|
|
88
|
-
@threads[pattern] = ::Thread.start( pattern ) do |pttrn|
|
89
|
-
begin
|
90
|
-
event_queue = get_event_queue
|
91
|
-
event_tail = get_event_tail( event_queue )
|
92
|
-
while ( doc = event_tail.next )
|
93
|
-
items = JSON.parse( doc.to_json, symbolize_names: true )
|
94
|
-
topic = items[:topic]
|
95
|
-
if File.fnmatch( pttrn, topic, File::FNM_PATHNAME )
|
96
|
-
items.delete( :_id )
|
97
|
-
items.delete( :topic )
|
98
|
-
block.call( topic, items )
|
99
|
-
end
|
100
|
-
end
|
101
|
-
rescue => e
|
102
|
-
nil
|
103
|
-
end
|
104
|
-
end
|
105
|
-
end
|
106
|
-
end
|
107
|
-
|
108
|
-
def listen( *patterns, &block )
|
109
|
-
if block.nil?
|
110
|
-
listen_once( *patterns )
|
111
|
-
else
|
112
|
-
listen_each( *patterns ) do |topic, items|
|
113
|
-
block.call( topic, items )
|
114
|
-
end
|
115
|
-
end
|
116
|
-
end
|
117
|
-
|
118
|
-
def unlisten( **patterns )
|
119
|
-
patterns.each do |pattern|
|
120
|
-
@threads[pattern].kill rescue nil
|
121
|
-
@threads.delete( pattern ) rescue nil
|
122
|
-
end
|
123
|
-
end
|
124
|
-
|
125
|
-
def notify( topic, **items )
|
126
|
-
items[:topic] = topic
|
127
|
-
@event_queue.insert_one( items )
|
128
|
-
end
|
129
|
-
|
130
|
-
end
|
131
|
-
|
132
|
-
end
|
133
|
-
|