wamp-worker 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.travis.yml +1 -1
- data/README.md +70 -20
- data/lib/wamp/worker.rb +20 -38
- data/lib/wamp/worker/runner.rb +0 -5
- data/lib/wamp/worker/version.rb +1 -1
- data/spec/spec_helper.rb +6 -4
- data/spec/wamp/worker/runner_spec.rb +5 -7
- data/test/wamp_test/Gemfile +1 -1
- data/test/wamp_test/Gemfile.lock +5 -5
- data/wamp-worker.gemspec +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d59dde6fad655ba748c0aaec07b00104922c21ad
|
4
|
+
data.tar.gz: 04b00eacf5d7a51f84c2e1d5bbaed32b24f68a41
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 241db674bc4577109ddc1ceea83200ba0f592d97c2c69b0a568422ea05708aee5b1b9900c3c38dbc967030f2ce46c44cbaf14859fcaa56f2298382c6a8b6f345
|
7
|
+
data.tar.gz: 158cb1345b8401eccc38e50a5fa83508de319b4371ce6450cabf8b1d659afa07137463dba1f533a1e36f81d93050c615cde47b1d39d3efe2c83438dfa30e21c5
|
data/.gitignore
CHANGED
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# Wamp::Worker
|
2
2
|
|
3
|
-
[![Gem Version](https://badge.fury.io/rb/wamp-worker.svg)](https://badge.fury.io/rb/
|
4
|
-
[![
|
3
|
+
[![Gem Version](https://badge.fury.io/rb/wamp-worker.svg)](https://badge.fury.io/rb/wamp-worker)
|
4
|
+
[![CI Status](https://travis-ci.org/ericchapman/ruby_wamp_worker.svg?branch=master)](https://travis-ci.org/ericchapman/ruby_wamp_worker)
|
5
5
|
[![Codecov](https://img.shields.io/codecov/c/github/ericchapman/ruby_wamp_worker/master.svg)](https://codecov.io/github/ericchapman/ruby_wamp_worker)
|
6
6
|
|
7
7
|
Rails worker for talking to a WAMP Router which is described [here](https://tools.ietf.org/html/draft-oberstet-hybi-tavendo-wamp-02)
|
@@ -42,6 +42,9 @@ Some notes about Wamp::Worker
|
|
42
42
|
|
43
43
|
## Revision History
|
44
44
|
|
45
|
+
- v0.0.2:
|
46
|
+
- Updated to use Wamp::Client logger
|
47
|
+
- Other minor cleanup
|
45
48
|
- v0.0.1:
|
46
49
|
- Initial Release
|
47
50
|
|
@@ -65,8 +68,9 @@ Or install it yourself as:
|
|
65
68
|
|
66
69
|
### Configuration
|
67
70
|
|
68
|
-
To configure Wamp::Worker, create a
|
69
|
-
|
71
|
+
To configure Wamp::Worker, create a initializer file with the following options
|
72
|
+
|
73
|
+
**config/initializers/wamp-worker.rb**
|
70
74
|
|
71
75
|
``` ruby
|
72
76
|
Wamp::Worker.configure do
|
@@ -87,7 +91,8 @@ The attributes are defined as follows
|
|
87
91
|
You can also "subscribe" and "register" in the configuration object. That will be
|
88
92
|
described later.
|
89
93
|
|
90
|
-
**Note that you MUST make sure "config.eager_load = true" is set in the environment files
|
94
|
+
**Note that you MUST make sure "config.eager_load = true" is set in the environment files
|
95
|
+
located in "config/environments/\*.rb"**
|
91
96
|
|
92
97
|
### Multiple Workers
|
93
98
|
|
@@ -154,27 +159,42 @@ For Rails applications that have Sidekiq, you can push the processing of the han
|
|
154
159
|
to the background by including "Wamp::Worker::BackgroundHandler" instead of
|
155
160
|
"Wamp::Worker::Handler".
|
156
161
|
|
157
|
-
###
|
162
|
+
### Call/Publish Methods
|
158
163
|
|
159
|
-
The library also supports "call" and "publish" methods from
|
160
|
-
done by including "Wamp::Worker::Session" in your class. For example
|
164
|
+
The library also supports "call" and "publish" methods from objects outside of the
|
165
|
+
worker. This is done by including "Wamp::Worker::Session" in your class. For example
|
161
166
|
|
162
|
-
**app/controllers/
|
167
|
+
**app/controllers/add_controller.rb**
|
163
168
|
|
164
169
|
``` ruby
|
165
|
-
class
|
170
|
+
class AddController < ApplicationController
|
166
171
|
include Wamp::Worker::Session.new
|
172
|
+
|
173
|
+
def index
|
174
|
+
response = nil
|
175
|
+
|
176
|
+
self.wamp_session.call "com.example.back.add", [params[:a].to_i, params[:b].to_i] do |result, error, details|
|
177
|
+
response = result
|
178
|
+
end
|
179
|
+
|
180
|
+
render json: { result: response }
|
181
|
+
end
|
167
182
|
end
|
168
183
|
```
|
169
184
|
|
185
|
+
Note that the name defaults to ":default" and the method "wamp_session". These
|
186
|
+
can be overridden by adding the following attributes to the "include"
|
187
|
+
|
170
188
|
**app/controllers/add_controller.rb**
|
171
189
|
|
172
190
|
``` ruby
|
173
191
|
class AddController < ApplicationController
|
192
|
+
include Wamp::Worker::Session.new, :other, :different_session
|
193
|
+
|
174
194
|
def index
|
175
195
|
response = nil
|
176
196
|
|
177
|
-
self.
|
197
|
+
self.different_session.call "com.example.back.add", [params[:a].to_i, params[:b].to_i] do |result, error, details|
|
178
198
|
response = result
|
179
199
|
end
|
180
200
|
|
@@ -183,22 +203,52 @@ class AddController < ApplicationController
|
|
183
203
|
end
|
184
204
|
```
|
185
205
|
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
``` ruby
|
190
|
-
class ApplicationController < ActionController::Base
|
191
|
-
include Wamp::Worker::Session.new :other, method: :different_session
|
192
|
-
end
|
193
|
-
```
|
206
|
+
This will talk to the ":other" worker and expose it using "different_session"
|
207
|
+
rather than "wamp_session"
|
194
208
|
|
195
209
|
### Starting the Worker
|
196
210
|
|
211
|
+
There are 2 different ways you can start a worker
|
212
|
+
|
213
|
+
#### Rails/Heroku worker
|
214
|
+
|
197
215
|
To start the worker, use the "wamp-worker" executable
|
198
216
|
|
199
217
|
$ bundle exec wamp-worker
|
200
218
|
|
201
|
-
|
219
|
+
This executable supports the following options
|
202
220
|
|
203
221
|
- "-l" (default: "info"): logging level (debug, info, warn, error)
|
204
222
|
- "-n" (default: "default"): name of the worker
|
223
|
+
- "-e" (default: "development"): application environment to load
|
224
|
+
|
225
|
+
or in your Procfile for Heroku
|
226
|
+
|
227
|
+
**Procfile**
|
228
|
+
|
229
|
+
```
|
230
|
+
web: bundle exec puma -C config/puma.rb
|
231
|
+
worker: bundle exec wamp-worker -e production
|
232
|
+
```
|
233
|
+
|
234
|
+
#### Thread
|
235
|
+
|
236
|
+
You can also spawn a thread inside if your application. One way to do this
|
237
|
+
is as follows
|
238
|
+
|
239
|
+
**config/initializers/wamp-worker.rb**
|
240
|
+
|
241
|
+
``` ruby
|
242
|
+
require "thread"
|
243
|
+
|
244
|
+
Thread.new do
|
245
|
+
Wamp::Worker.run uri: 'ws://127.0.0.1:8080/ws', realm: 'realm1'
|
246
|
+
end
|
247
|
+
```
|
248
|
+
|
249
|
+
Note that this method is not recommended for scalable designs because it will
|
250
|
+
create a new instance of the worker every time you scale the web instance.
|
251
|
+
Only do this if you really know what you are doing.
|
252
|
+
|
253
|
+
Also, when calling "register", you must include the "invoke" option. See WAMP
|
254
|
+
documentation for more details.
|
data/lib/wamp/worker.rb
CHANGED
@@ -13,13 +13,13 @@ require "redis"
|
|
13
13
|
module Wamp
|
14
14
|
module Worker
|
15
15
|
|
16
|
-
# Used to include a requestor in
|
16
|
+
# Used to include a requestor in any class
|
17
17
|
#
|
18
18
|
class Session
|
19
19
|
def self.new(name=nil, method: :wamp_session)
|
20
20
|
name ||= DEFAULT
|
21
21
|
Module.new do
|
22
|
-
define_method(method) {
|
22
|
+
define_method(method) { Proxy::Requestor.new(name) }
|
23
23
|
end
|
24
24
|
end
|
25
25
|
end
|
@@ -36,12 +36,7 @@ module Wamp
|
|
36
36
|
# Returns the logger object
|
37
37
|
#
|
38
38
|
def self.logger
|
39
|
-
|
40
|
-
$stdout.sync = true unless ENV['RAILS_ENV'] == "production"
|
41
|
-
@logger = Logger.new $stdout
|
42
|
-
@logger.level = Logger::INFO
|
43
|
-
end
|
44
|
-
@logger
|
39
|
+
Wamp::Client.logger
|
45
40
|
end
|
46
41
|
|
47
42
|
# Sets the log level
|
@@ -49,20 +44,6 @@ module Wamp
|
|
49
44
|
# @param log_level [Symbol] - the desired log level
|
50
45
|
def self.log_level=(log_level)
|
51
46
|
Wamp::Client.log_level = log_level
|
52
|
-
level =
|
53
|
-
case log_level
|
54
|
-
when :error
|
55
|
-
Logger::ERROR
|
56
|
-
when :debug
|
57
|
-
Logger::DEBUG
|
58
|
-
when :fatal
|
59
|
-
Logger::FATAL
|
60
|
-
when :warn
|
61
|
-
Logger::WARN
|
62
|
-
else
|
63
|
-
Logger::INFO
|
64
|
-
end
|
65
|
-
self.logger.level = level
|
66
47
|
end
|
67
48
|
|
68
49
|
# Method to configure the worker
|
@@ -75,7 +56,7 @@ module Wamp
|
|
75
56
|
# Method to start a worker
|
76
57
|
#
|
77
58
|
# @param name [Symbol] - The name of the connection
|
78
|
-
def self.run(name, **args)
|
59
|
+
def self.run(name=nil, **args)
|
79
60
|
name ||= DEFAULT
|
80
61
|
|
81
62
|
# Get the connection info
|
@@ -85,17 +66,6 @@ module Wamp
|
|
85
66
|
Runner::Main.new(name, **options).start
|
86
67
|
end
|
87
68
|
|
88
|
-
# Returns a requestor for objects to perform calls to the worker
|
89
|
-
#
|
90
|
-
# @param name [Symbol] - The name of the connection
|
91
|
-
# @return [Wamp::Worker::Proxy::Requestor] - An object that can be used to make requests
|
92
|
-
def self.requestor(name)
|
93
|
-
name ||= DEFAULT
|
94
|
-
|
95
|
-
# Create a requestor proxy for the connection
|
96
|
-
Proxy::Requestor.new(name)
|
97
|
-
end
|
98
|
-
|
99
69
|
# Registers procedures
|
100
70
|
#
|
101
71
|
# @param name [Symbol] - The name of the connection
|
@@ -107,8 +77,14 @@ module Wamp
|
|
107
77
|
self.logger.debug("#{self.name} invoking handler '#{r.klass}##{r.method}' for procedure '#{r.procedure}'")
|
108
78
|
r.klass.create(proxy, :procedure, a, k, d).invoke(r.method)
|
109
79
|
}
|
110
|
-
session.register(r.procedure, handler, r.options)
|
111
|
-
|
80
|
+
session.register(r.procedure, handler, r.options) do |result, error, details|
|
81
|
+
if error
|
82
|
+
self.logger.error("#{self.name} register failed '#{r.klass}##{r.method}' for procedure '#{r.procedure}'")
|
83
|
+
self.logger.error(" error: #{error.inspect}")
|
84
|
+
else
|
85
|
+
self.logger.info("#{self.name} registered for '#{r.klass}##{r.method}' for procedure '#{r.procedure}'")
|
86
|
+
end
|
87
|
+
end
|
112
88
|
end
|
113
89
|
end
|
114
90
|
|
@@ -123,8 +99,14 @@ module Wamp
|
|
123
99
|
self.logger.debug("#{self.name} invoking handler '#{s.klass}##{s.method}' for subscription '#{s.topic}'")
|
124
100
|
s.klass.create(proxy, :subscription, a, k, d).invoke(s.method)
|
125
101
|
}
|
126
|
-
session.subscribe(s.topic, handler, s.options)
|
127
|
-
|
102
|
+
session.subscribe(s.topic, handler, s.options) do |result, error, details|
|
103
|
+
if error
|
104
|
+
self.logger.error("#{self.name} subscribe failed '#{s.klass}##{s.method}' for topic '#{s.topic}'")
|
105
|
+
self.logger.error(" error: #{error.inspect}")
|
106
|
+
else
|
107
|
+
self.logger.info("#{self.name} subscribed '#{s.klass}##{s.method}' for topic '#{s.topic}'")
|
108
|
+
end
|
109
|
+
end
|
128
110
|
end
|
129
111
|
end
|
130
112
|
|
data/lib/wamp/worker/runner.rb
CHANGED
@@ -110,11 +110,6 @@ module Wamp
|
|
110
110
|
@client = options[:client] || Wamp::Client::Connection.new(options)
|
111
111
|
@active = false
|
112
112
|
|
113
|
-
# Log the event
|
114
|
-
logger.info("#{self.class.name} '#{self.name}' created with options")
|
115
|
-
logger.info(" uri: #{options[:uri]}")
|
116
|
-
logger.info(" realm: #{options[:realm]}")
|
117
|
-
|
118
113
|
# Create a queue for passing messages to the main runner
|
119
114
|
@descriptor_queue = ::Queue.new
|
120
115
|
|
data/lib/wamp/worker/version.rb
CHANGED
data/spec/spec_helper.rb
CHANGED
@@ -1,11 +1,13 @@
|
|
1
1
|
require 'simplecov'
|
2
|
-
SimpleCov.start
|
3
|
-
add_filter 'spec/'
|
4
|
-
end
|
2
|
+
SimpleCov.start
|
5
3
|
|
6
|
-
$LOAD_PATH.unshift File.expand_path("../../lib", __FILE__)
|
7
4
|
require "wamp/worker"
|
8
5
|
|
6
|
+
if ENV['CODECOV_TOKEN']
|
7
|
+
require 'codecov'
|
8
|
+
SimpleCov.formatter = SimpleCov::Formatter::Codecov
|
9
|
+
end
|
10
|
+
|
9
11
|
Dir[File.expand_path('spec/support/**/*.rb')].each { |f| require f }
|
10
12
|
|
11
13
|
require 'sidekiq/testing'
|
@@ -3,7 +3,7 @@ require "spec_helper"
|
|
3
3
|
describe Wamp::Worker::Runner do
|
4
4
|
let(:name) { :other }
|
5
5
|
let(:runner) { described_class::Main.new(name) }
|
6
|
-
let(:requestor) { Wamp::Worker.
|
6
|
+
let(:requestor) { Wamp::Worker::Proxy::Requestor.new(name) }
|
7
7
|
|
8
8
|
def execute_runner
|
9
9
|
|
@@ -65,12 +65,10 @@ describe Wamp::Worker::Runner do
|
|
65
65
|
|
66
66
|
it "increments the ticker" do
|
67
67
|
expect(runner.dispatcher.ticker.get).to eq(0)
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
end
|
73
|
-
}.to change{ runner.dispatcher.ticker.get }.by(3)
|
68
|
+
execute_runner do
|
69
|
+
sleep(2)
|
70
|
+
end
|
71
|
+
expect(runner.dispatcher.ticker.get).not_to eq(0)
|
74
72
|
end
|
75
73
|
|
76
74
|
context "challenge" do
|
data/test/wamp_test/Gemfile
CHANGED
@@ -34,7 +34,7 @@ gem 'jbuilder', '~> 2.5'
|
|
34
34
|
# gem 'capistrano-rails', group: :development
|
35
35
|
|
36
36
|
gem 'sidekiq'
|
37
|
-
gem 'wamp-worker'
|
37
|
+
gem 'wamp-worker', '~> 0.1.1'
|
38
38
|
|
39
39
|
# Reduces boot times through caching; required in config/boot.rb
|
40
40
|
gem 'bootsnap', '>= 1.1.0', require: false
|
data/test/wamp_test/Gemfile.lock
CHANGED
@@ -189,10 +189,10 @@ GEM
|
|
189
189
|
thread_safe (~> 0.1)
|
190
190
|
uglifier (4.1.20)
|
191
191
|
execjs (>= 0.3.0, < 3)
|
192
|
-
wamp-worker (0.1.
|
193
|
-
redis
|
194
|
-
wamp_client (
|
195
|
-
wamp_client (0.2.
|
192
|
+
wamp-worker (0.1.1)
|
193
|
+
redis (~> 4.0)
|
194
|
+
wamp_client (~> 0.2.2)
|
195
|
+
wamp_client (0.2.2)
|
196
196
|
json (~> 2.0)
|
197
197
|
websocket-eventmachine-client (~> 1.1)
|
198
198
|
web-console (3.7.0)
|
@@ -236,7 +236,7 @@ DEPENDENCIES
|
|
236
236
|
turbolinks (~> 5)
|
237
237
|
tzinfo-data
|
238
238
|
uglifier (>= 1.3.0)
|
239
|
-
wamp-worker
|
239
|
+
wamp-worker (~> 0.1.1)
|
240
240
|
web-console (>= 3.3.0)
|
241
241
|
|
242
242
|
RUBY VERSION
|
data/wamp-worker.gemspec
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: wamp-worker
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Eric Chapman
|
@@ -100,14 +100,14 @@ dependencies:
|
|
100
100
|
requirements:
|
101
101
|
- - "~>"
|
102
102
|
- !ruby/object:Gem::Version
|
103
|
-
version: 0.2.
|
103
|
+
version: 0.2.2
|
104
104
|
type: :runtime
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
108
|
- - "~>"
|
109
109
|
- !ruby/object:Gem::Version
|
110
|
-
version: 0.2.
|
110
|
+
version: 0.2.2
|
111
111
|
- !ruby/object:Gem::Dependency
|
112
112
|
name: redis
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|