magellan-rails 0.2.3 → 0.2.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 63e5b0203bac9edc86ff8a7c38a4d5614d4cb885
4
- data.tar.gz: cc46775047760890bfc4b4090dea5ee33d8fbf00
3
+ metadata.gz: 231109b7dd8ed557f11184f6533773c31f062376
4
+ data.tar.gz: d75401b143155636dca006515648a596d01d969e
5
5
  SHA512:
6
- metadata.gz: 6a8f418c06a1be76956354ad59db62ca43d256e1241ebeb06ee6c6fbd964552d56977d3cee49d1900c4d716a54fc1b4af6d62b864b8edc9e909506361bdbd74f
7
- data.tar.gz: cf79d0fe416b92487b12b4f8e762614e3b4689b87a3db5cb7cf29011763ed9199e0638e479a7f85f520a7ec5ce38b5ca79e2e5e768094838dac0a30eba032a32
6
+ metadata.gz: ed19a72f0274ad5b5a1f8076ec2fcb3649fefba52d848d63305dd9bb426056df7a2ee7c3141246fe03279f8a89654fe0effac0df4fcdd89186d831a74a1caeaa
7
+ data.tar.gz: 272bbefd6ff9ac58f4db4c550363c07fe74e14a7457e08107e27ec8bf8a3ba2353408df93757727bb2cbef9ad9e606b8fdbc7bedcfaf87c371bc2db7f8a595e3
@@ -0,0 +1,7 @@
1
+ # 0.2.4
2
+
3
+ ## Enhancement
4
+
5
+ * Reconnect AMQP at connection lost.
6
+ Environment variable `MAGELLAN_RAILS_AMQP_RECONNECT_TIMEOUT` specify
7
+ how long worker wait for reconnection in secounds (default: 300sec).
data/Gemfile CHANGED
@@ -1,8 +1,5 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
- gem "bunny_mock", :git => 'git://github.com/groovenauts/bunny-mock.git',
4
- :branch => "features/minimum_necessary_mock"
5
-
6
3
  # Specify your gem's dependencies in magellan-rails.gemspec
7
4
  gemspec
8
5
 
@@ -1,4 +1,4 @@
1
- Copyright (c) 2014 Yuuki Noguchi
1
+ Copyright (c) 2014, 2015 Groovenauts, Inc.
2
2
 
3
3
  MIT License
4
4
 
data/README.md CHANGED
@@ -1,29 +1,30 @@
1
- # Magellan::Rails
1
+ # magellan-rails
2
2
 
3
- TODO: Write a gem description
3
+ MAGELLAN adapter for Ruby on Rails framework.
4
4
 
5
- ## Installation
5
+ MAGELLAN: https://www.magellanic-clouds.com/
6
6
 
7
- Add this line to your application's Gemfile:
8
-
9
- gem 'magellan-rails'
10
-
11
- And then execute:
7
+ ## Usage
12
8
 
13
- $ bundle
9
+ Add the following line into your Gemfile and execute `bundle install`.
14
10
 
15
- Or install it yourself as:
11
+ ```
12
+ gem "magellan-rails"
13
+ ```
16
14
 
17
- $ gem install magellan-rails
15
+ And add the following line into `config/application.rb` in your Rails application.
18
16
 
19
- ## Usage
17
+ ```
18
+ require "magellan/rails"
19
+ ```
20
20
 
21
- TODO: Write usage instructions here
21
+ See Tutorial for more details.
22
+ http://devcenter.magellanic-clouds.com/getting-started/ch05-03.html (Japanese only)
22
23
 
23
- ## Contributing
24
+ ## Environment Variables
24
25
 
25
- 1. Fork it ( https://github.com/[my-github-username]/magellan-rails/fork )
26
- 2. Create your feature branch (`git checkout -b my-new-feature`)
27
- 3. Commit your changes (`git commit -am 'Add some feature'`)
28
- 4. Push to the branch (`git push origin my-new-feature`)
29
- 5. Create a new Pull Request
26
+ | Environment Variable | Default | Description |
27
+ |---------------------------------------|---------|-------------|
28
+ | MAGELLAN_HTTP_WORKER | 1 | 1/true/yes/on for load HTTP worker models. 0/false/no/off for suppress loading models for HTTP worker |
29
+ | MAGELLAN_SUBSCRIBER_WORKER | 1 | 1/true/yes/on for load Subscriber(MQTT) worker models. 0/false/no/off for suppress loading models for Subscriber(MQTT) worker |
30
+ | MAGELLAN_RAILS_AMQP_RECONNECT_TIMEOUT | 300 | How long wait for AMQP reconnect in seconds. |
@@ -1,4 +1,4 @@
1
- Copyright (c) 2014 Yuuki Noguchi
1
+ Copyright (c) 2014, 2015 Groovenauts, Inc.
2
2
 
3
3
  MIT License
4
4
 
@@ -2,8 +2,10 @@
2
2
 
3
3
  module Magellan
4
4
  class Publisher
5
+ class MessageTooLong < StandardError; end
6
+
5
7
  def initialize(host: nil, port: nil, vhost: nil, user: nil, pass: nil, timeout: nil)
6
- # RabbitMQへの接続設定を作成
8
+ # connection settings for AMQP
7
9
  connection_settings = {
8
10
  host: load_env_as_default(host, ['MAGELLAN_PUBLISH_AMQP_ADDR'], :string),
9
11
  port: load_env_as_default(port, ['MAGELLAN_PUBLISH_AMQP_PORT'], :integer),
@@ -19,10 +21,15 @@ module Magellan
19
21
 
20
22
  exchange_name = ENV["MAGELLAN_PUBLISH_EXCHANGE"] || "magellan_publish"
21
23
 
22
- # no_declareを設定しない場合、Exchangeに対してdeclareを実行してしまい、
23
- # Acess Contorolにひっかかりエラーとなります
24
- # exchangeはmagellan-conductorによって作成済みの想定です
24
+ # here :no_declare options should be true to get rid of Access Control Error.
25
25
  @exchange = @channel.exchange(exchange_name, no_declare: true)
26
+
27
+ # publish message size limit
28
+ @message_size_limit = load_env_as_default(nil, ["MAGELLAN_PUBLISH_MESSAGE_SIZE_LIMIT"], :integer) || (256 * 1024 * 1024)
29
+ # message size limit should be treated equally with MQTT message.
30
+ # substruct MQTT's topic length (2 bytes)
31
+ # currently magellan-publisher can publish message only in QoS=0 mode. so packet identifier record is not included in a packet.
32
+ @message_size_limit -= 2
26
33
  end
27
34
 
28
35
  def convert_topic(mqtt_topic)
@@ -31,6 +38,9 @@ module Magellan
31
38
  private :convert_topic
32
39
 
33
40
  def publish(topic, body)
41
+ if topic.bytesize + body.bytesize > @message_size_limit
42
+ raise MessageTooLong, "publishing topic(#{topic.bytesize} bytes) and payload(#{body.bytesize} bytes) exceed message size limitation(#{@message_size_limit} bytes)."
43
+ end
34
44
  @exchange.publish(body, routing_key: convert_topic(topic))
35
45
  end
36
46
 
@@ -1,5 +1,5 @@
1
1
  module Magellan
2
2
  class Publisher
3
- VERSION = "0.0.2"
3
+ VERSION = "0.0.4"
4
4
  end
5
5
  end
@@ -6,8 +6,8 @@ require 'magellan/publisher/version'
6
6
  Gem::Specification.new do |spec|
7
7
  spec.name = "magellan-publisher"
8
8
  spec.version = Magellan::Publisher::VERSION
9
- spec.authors = ["Tomoyuki Chikanaga"]
10
- spec.email = ["t-chikanaga@groovenauts.jp"]
9
+ spec.authors = ["Groovenauts, Inc."]
10
+ spec.email = ["tech@groovenauts.jp"]
11
11
  spec.summary = %q{}
12
12
  spec.description = %q{}
13
13
  spec.homepage = ""
@@ -16,22 +16,45 @@ describe Magellan::Publisher do
16
16
  @bunny = BunnyMock.new
17
17
  channel = @bunny.create_channel
18
18
  @exchange = @bunny.exchange('test_exchange', type: :direct, durable: false, auto_delete: false)
19
- expect(@exchange).to receive(:publish).with(@payload, routing_key: @rabbitmq_topic)
20
19
 
21
20
  allow(Bunny ).to receive(:new).and_return(@bunny)
22
21
  allow(@bunny ).to receive(:create_channel).and_return(channel)
23
22
  allow(channel).to receive(:exchange).with('test_exchange', no_declare: true).and_return(@exchange)
24
23
 
25
24
  ENV["MAGELLAN_PUBLISH_EXCHANGE"] = "test_exchange"
26
- @publisher = Magellan::Publisher.new(host: "127.0.0.1",
27
- port: 5672,
28
- vhost: "/customer1.sample_project",
29
- user: "customer1.sample_project",
30
- pass: "pasw1")
31
25
  end
32
26
 
33
- it do
34
- @publisher.publish(@topic, @payload)
27
+ context "normally" do
28
+ before do
29
+ expect(@exchange).to receive(:publish).with(@payload, routing_key: @rabbitmq_topic)
30
+ @publisher = Magellan::Publisher.new(host: "127.0.0.1",
31
+ port: 5672,
32
+ vhost: "/customer1.sample_project",
33
+ user: "customer1.sample_project",
34
+ pass: "pasw1")
35
+ end
36
+
37
+ it do
38
+ @publisher.publish(@topic, @payload)
39
+ end
40
+ end
41
+
42
+ context "message size limit exceed" do
43
+ before do
44
+ ENV["MAGELLAN_PUBLISH_MESSAGE_SIZE_LIMIT"] = (@topic.size + @payload.size + 1).to_s
45
+ @publisher = Magellan::Publisher.new(host: "127.0.0.1",
46
+ port: 5672,
47
+ vhost: "/customer1.sample_project",
48
+ user: "customer1.sample_project",
49
+ pass: "pasw1")
50
+ end
51
+ after do
52
+ ENV["MAGELLAN_PUBLISH_MESSAGE_SIZE_LIMIT"] = nil
53
+ end
54
+
55
+ it do
56
+ expect { @publisher.publish(@topic, @payload) }.to raise_error(Magellan::Publisher::MessageTooLong)
57
+ end
35
58
  end
36
59
  end
37
60
 
@@ -114,7 +114,7 @@ class Magellan::Rails::Request
114
114
  end
115
115
 
116
116
 
117
- # @doc レクエストボディをencodingに応じてデコードする。
117
+ # @doc リクエストボディをencodingに応じてデコードする。
118
118
  # 現在対応しているencodingは以下。
119
119
  # - base64: Base64デコードする
120
120
  # - plain: デコードせずそのままの値を返す
@@ -1,5 +1,5 @@
1
1
  module Magellan
2
2
  module Rails
3
- VERSION = "0.2.3"
3
+ VERSION = "0.2.4"
4
4
  end
5
5
  end
@@ -41,6 +41,7 @@ module Magellan::Worker::Config
41
41
  config[:publish_user] = ENV["MAGELLAN_PUBLISH_AMQP_USER"]
42
42
  config[:publish_password] = ENV["MAGELLAN_PUBLISH_AMQP_PASS"]
43
43
  config[:publish_exchange] = ENV["MAGELLAN_PUBLISH_EXCHANGE"]
44
+ config[:amqp_reconnect_timeout] = (ENV["MAGELLAN_RAILS_AMQP_RECONNECT_TIMEOUT"] || 300).to_i
44
45
  config
45
46
  end
46
47
  end
@@ -24,11 +24,21 @@ class Magellan::Worker::Core
24
24
  vhost: @config[:vhost],
25
25
  user: @config[:rabbitmq_user],
26
26
  pass: @config[:rabbitmq_password],
27
- timeout: 0.3
27
+ timeout: 0.3,
28
+ heartbeat_interval: 60,
28
29
  }
29
30
 
30
31
  @conn = Bunny.new(connection_settings)
31
32
  @conn.start
33
+
34
+ open_channel
35
+
36
+ @shutdown = false
37
+
38
+ self
39
+ end
40
+
41
+ def open_channel
32
42
  @channel = @conn.create_channel
33
43
 
34
44
  queue_name = @config[:request_queue]
@@ -37,14 +47,10 @@ class Magellan::Worker::Core
37
47
  # no_declareを設定しない場合、キューやエクスチェンジに対してdeclareを実行してしまい、
38
48
  # Acess Contorolにひっかかりエラーとなります
39
49
  # queueとexchange及びbindはmagellan-conductorによって作成済みの想定です
40
- @queue = @channel.queue(queue_name, no_declare: true)
41
- @exchange = @channel.exchange(exchange_name, no_declare: true)
50
+ @queue = @channel.queue(queue_name, no_declare: true, durable: true)
51
+ @exchange = @channel.exchange(exchange_name, no_declare: true, durable: true)
42
52
 
43
53
  @executor = Magellan::Worker::Executor.new(@exchange)
44
-
45
- @shutdown = false
46
-
47
- self
48
54
  end
49
55
 
50
56
  def shutdown
@@ -52,6 +58,20 @@ class Magellan::Worker::Core
52
58
  @shutdown = true
53
59
  end
54
60
 
61
+ def wait_reconnect
62
+ limit = Time.now + @config[:amqp_reconnect_timeout]
63
+ while Time.now <= limit and not(@shutdown)
64
+ sleep 1.0
65
+ if @channel.connection.status == :open
66
+ @channel.close rescue nil
67
+ open_channel
68
+ Magellan.logger.info("== AMQP connection recovered ==")
69
+ return true
70
+ end
71
+ end
72
+ return false
73
+ end
74
+
55
75
  def run
56
76
  # reset for re-run
57
77
  @shutdown = false
@@ -62,27 +82,35 @@ class Magellan::Worker::Core
62
82
  end
63
83
 
64
84
  Magellan.logger.info("====== Magellan Worker start ======")
65
- @queue.subscribe(block: true, manual_ack: true) do |delivery_info, properties, payload|
66
- reply_to = properties.reply_to # ワーカー実行結果返却時のルーティングキー
67
- correlation_id = properties.correlation_id # ワーカー実行結果返却時にどのリクエストに対応するメッセージか判別するための識別子
68
- delivery_tag = delivery_info.delivery_tag # ackを返却時に使用
69
-
70
- # ワーカーロジック実行中に落ちたとしてもRabbitMQから再送させないために
71
- # メッセージを取得した直後にackを返します
72
- # 第1引数: ackを返す対象のメッセージを指定
73
- # 第2引数: ackを返す対象以前のメッセージもackを返すか
74
- # true: 指定したメッセージ以前に受信したメッセージ全てが対象
75
- # false: 指定したメッセージのみが対象
76
- @channel.basic_ack(delivery_tag, false)
77
-
78
- begin
79
- request_message = parse_body(payload)
80
- @executor.execute(reply_to, correlation_id, delivery_tag, request_message)
81
- rescue
82
- Magellan.logger.error("Magellan Worker request execution error: #{$!}\n" + $@.join("\n"))
85
+ until @shutdown
86
+ @queue.subscribe(block: true, manual_ack: true) do |delivery_info, properties, payload|
87
+ reply_to = properties.reply_to # ワーカー実行結果返却時のルーティングキー
88
+ correlation_id = properties.correlation_id # ワーカー実行結果返却時にどのリクエストに対応するメッセージか判別するための識別子
89
+ delivery_tag = delivery_info.delivery_tag # ackを返却時に使用
90
+
91
+ # ワーカーロジック実行中に落ちたとしてもRabbitMQから再送させないために
92
+ # メッセージを取得した直後にackを返します
93
+ # 第1引数: ackを返す対象のメッセージを指定
94
+ # 第2引数: ackを返す対象以前のメッセージもackを返すか
95
+ # true: 指定したメッセージ以前に受信したメッセージ全てが対象
96
+ # false: 指定したメッセージのみが対象
97
+ @channel.basic_ack(delivery_tag, false)
98
+
99
+ begin
100
+ request_message = parse_body(payload)
101
+ @executor.execute(reply_to, correlation_id, delivery_tag, request_message)
102
+ rescue
103
+ Magellan.logger.error("Magellan Worker request execution error: #{$!}\n" + $@.join("\n"))
104
+ end
105
+ if @shutdown
106
+ delivery_info.consumer.cancel
107
+ end
83
108
  end
84
- if @shutdown
85
- delivery_info.consumer.cancel
109
+ # AMQPの接続が切れると Queue#subscribe から処理が帰るので再接続を待つ
110
+ break if @shutdown
111
+ unless wait_reconnect
112
+ Magellan.logger.info("magellan-rails: AMQP reconnect timeout")
113
+ break
86
114
  end
87
115
  end
88
116
  Magellan.logger.info("====== Magellan Worker finished ======")
@@ -6,8 +6,8 @@ require 'magellan/rails/version'
6
6
  Gem::Specification.new do |spec|
7
7
  spec.name = "magellan-rails"
8
8
  spec.version = Magellan::Rails::VERSION
9
- spec.authors = ["Yuuki Noguchi"]
10
- spec.email = ["otonakaoru@gmail.com"]
9
+ spec.authors = ["Groovenauts, Inc."]
10
+ spec.email = ["tech@groovenauts.jp"]
11
11
  spec.summary = %q{}
12
12
  spec.description = %q{}
13
13
  spec.homepage = ""
@@ -25,5 +25,4 @@ Gem::Specification.new do |spec|
25
25
 
26
26
  spec.add_development_dependency "bundler", "~> 1.6"
27
27
  spec.add_development_dependency "rspec"
28
- # spec.add_development_dependency "bunny_mock"
29
28
  end
@@ -2,13 +2,46 @@
2
2
 
3
3
  require "spec_helper"
4
4
  require 'bunny'
5
- require 'bunny_mock'
6
5
  require 'json'
7
6
  require 'msgpack'
8
7
 
9
8
  describe Magellan::Worker::Core do
10
9
 
11
10
  describe "#run" do
11
+ before do
12
+ bunny = double(:bunny)
13
+ channel = double(:channel)
14
+ exchange = double(:exchange, name: 'test_exchange', type: :direct, durable: false, auto_delete: false)
15
+ @queue = double(:queue, name: "consumer1.sample_project.1.0.0.rails")
16
+ work_pool = double "work_pool"
17
+
18
+ allow(Bunny ).to receive(:new).and_return(bunny)
19
+ allow(bunny ).to receive(:start)
20
+ allow(bunny ).to receive(:create_channel).and_return(channel)
21
+ allow(channel).to receive(:queue).with('customer1.sample_project.1.0.0.rails', no_declare: true, durable: true).and_return(@queue)
22
+ allow(channel).to receive(:exchange).with("customer1.sample_project.reply", no_declare: true, durable: true).and_return(exchange)
23
+ allow(channel).to receive(:basic_ack).and_return(@queue)
24
+ allow(channel).to receive(:work_pool).and_return(work_pool)
25
+ allow(channel).to receive(:connection).and_return(double(:connection, status: :closed))
26
+ allow(channel).to receive(:open)
27
+ allow(work_pool).to receive(:shutdown)
28
+
29
+
30
+ config = {}
31
+ config[:host] = '127.0.0.1'
32
+ config[:port] = '5672'
33
+ config[:vhost] = '/customer1.sample_project'
34
+ config[:rabbitmq_user] = 'customer1.sample_project'
35
+ config[:request_queue] = 'customer1.sample_project.1.0.0.rails'
36
+ config[:response_exchange] = 'customer1.sample_project.reply'
37
+ config[:rabbitmq_password] = 'pswd1'
38
+ config[:amqp_reconnect_timeout] = 1
39
+
40
+ allow(Magellan::Worker::Config).to receive(:load_config).and_return(config)
41
+
42
+ @executor = double('executor')
43
+ allow(Magellan::Worker::Executor).to receive(:new).and_return(@executor)
44
+ end
12
45
 
13
46
  context "set all env" do
14
47
  before do
@@ -28,43 +61,27 @@ describe Magellan::Worker::Core do
28
61
  'reply_ttl' => 1000
29
62
  }
30
63
  }
31
-
32
- bunny = BunnyMock.new
33
- channel = bunny.create_channel
34
- exchange = bunny.exchange('test_exchange', type: :direct, durable: false, auto_delete: false)
35
- queue = channel.queue("consumer1.sample_project.1.0.0.rails")
36
- queue.bind(exchange)
37
- exchange.publish(@request_message.to_json, routing_key: "1.0.0.rails", reply_to: 'reply_test', correlation_id: "correlation_id_sample")
38
- @work_pool = double "work_pool"
39
-
40
- allow(Bunny ).to receive(:new).and_return(bunny)
41
- allow(bunny ).to receive(:create_channel).and_return(channel)
42
- allow(channel).to receive(:queue).with('customer1.sample_project.1.0.0.rails', no_declare: true).and_return(queue)
43
- allow(channel).to receive(:basic_ack).and_return(queue)
44
- allow(channel).to receive(:work_pool).and_return(@work_pool)
45
-
46
- config = {}
47
- config[:host] = '127.0.0.1'
48
- config[:port] = '5672'
49
- config[:vhost] = '/customer1.sample_project'
50
- config[:rabbitmq_user] = 'customer1.sample_project'
51
- config[:request_queue] = 'customer1.sample_project.1.0.0.rails'
52
- config[:response_exchange] = 'customer1.sample_project.reply'
53
- config[:rabbitmq_password] = 'pswd1'
54
-
55
- allow(Magellan::Worker::Config).to receive(:load_config).and_return(config)
56
-
57
- @executor = double('executor')
58
- allow(Magellan::Worker::Executor).to receive(:new).and_return(@executor)
59
- allow(@executor).to receive(:execute).and_return(nil)
60
64
  end
61
65
 
62
66
  subject{ Magellan::Worker::Core.new.initialize! }
63
67
  it do
64
- expect(Magellan::Worker::Config).to receive(:load_config).once
65
- expect(@executor ).to receive(:execute).with('reply_test', 'correlation_id_sample', '1', @request_message).once
66
- subject.run
67
- expect(Magellan.logger ).to be_a(Logger)
68
+ consumer = double(:consumer, cancel: nil)
69
+ delivery_info = double(:delivery_info, delivery_tag: "delivery_tag", consumer: consumer)
70
+ expect(@queue).to receive(:subscribe).with(block: true, manual_ack: true).and_yield(delivery_info,
71
+ double(:properties, reply_to: "reply_test", correlation_id: "correlation_id_sample"),
72
+ @request_message.to_json)
73
+ core = subject
74
+ # FIXME: RSpec3 mock obsolete and_return{ ... } feature and it seems no alternatives.
75
+ # Re-define `execute` method to emulate signal handling during the method execution.
76
+ @executor.singleton_class.module_eval do
77
+ define_method(:execute) do |*args|
78
+ core.shutdown
79
+ nil
80
+ end
81
+ end
82
+ expect(@executor).to receive(:execute).with("reply_test", "correlation_id_sample", "delivery_tag", @request_message).once
83
+ core.run
84
+ expect(Magellan.logger).to be_a(Logger)
68
85
  end
69
86
  end
70
87
 
@@ -75,7 +92,7 @@ describe Magellan::Worker::Core do
75
92
  'headers' => {
76
93
  'Title' => 'groovenauts-app',
77
94
  'Interface-Version' => '1.0.0',
78
- 'Title-Runtime-Version'=> '1.0.0',
95
+ 'Title-Runtime-Version'=> '2.0.0',
79
96
  'Reference-Id' =>'192.168.1.110',
80
97
  'Url' =>'http://magellan-clouds.com/worker/test',
81
98
  'Oauth-Requester-Id' =>'tarou',
@@ -86,66 +103,26 @@ describe Magellan::Worker::Core do
86
103
  'reply_ttl' => 1000
87
104
  }
88
105
  }
89
-
90
- bunny = BunnyMock.new
91
- channel = bunny.create_channel
92
- exchange = bunny.exchange('test_exchange', type: :direct, durable: false, auto_delete: false)
93
- queue = channel.queue("consumer1.sample_project.1.0.0.rails")
94
- queue.bind(exchange)
95
- exchange.publish(@request_message.to_msgpack, routing_key: "1.0.0.rails", reply_to: 'reply_test', correlation_id: "correlation_id_sample")
96
- @work_pool = double "work_pool"
97
-
98
- allow(Bunny ).to receive(:new).and_return(bunny)
99
- allow(bunny ).to receive(:create_channel).and_return(channel)
100
- allow(channel).to receive(:queue).with('customer1.sample_project.1.0.0.rails', no_declare: true).and_return(queue)
101
- allow(channel).to receive(:basic_ack).and_return(queue)
102
- allow(channel).to receive(:work_pool).and_return(@work_pool)
103
-
104
- config = {}
105
- config[:host] = '127.0.0.1'
106
- config[:port] = '5672'
107
- config[:vhost] = '/customer1.sample_project'
108
- config[:rabbitmq_user] = 'customer1.sample_project'
109
- config[:request_queue] = 'customer1.sample_project.1.0.0.rails'
110
- config[:response_exchange] = 'customer1.sample_project.reply'
111
- config[:rabbitmq_password] = 'pswd1'
112
-
113
- allow(Magellan::Worker::Config).to receive(:load_config).and_return(config)
114
-
115
- @executor = double('executor')
116
- allow(Magellan::Worker::Executor).to receive(:new).and_return(@executor)
117
- allow(@executor).to receive(:execute).and_return(nil)
118
106
  end
119
107
 
120
108
  subject{ Magellan::Worker::Core.new.initialize! }
121
109
  it do
122
- expect(Magellan::Worker::Config).to receive(:load_config).once
123
- expect(@executor ).to receive(:execute).with('reply_test', 'correlation_id_sample', '2', @request_message).once
124
- subject.run
125
- expect(Magellan.logger ).to be_a(Logger)
126
- end
127
-
128
- describe "gracefully shutdown" do
129
- before do
130
- @consumer = double(:consumer)
131
- expect_any_instance_of(BunnyMock::DeliveryInfo).to receive(:consumer).and_return(@consumer)
132
- expect(@consumer).to receive(:cancel)
133
- end
134
- it do
135
- expect(Magellan::Worker::Config).to receive(:load_config).once
136
- expect(@work_pool).to receive(:shutdown).once
137
- # store local variable to be referenced in module_eval block
138
- core = subject()
139
- # FIXME: RSpec3 mock obsolete and_return{ ... } feature and it seems no alternatives.
140
- # Re-define `execute` method to emulate signal handling during the method execution.
141
- @executor.singleton_class.module_eval do
142
- define_method(:execute) do |*args|
143
- core.shutdown
144
- nil
145
- end
110
+ consumer = double(:consumer, cancel: nil)
111
+ delivery_info = double(:delivery_info, delivery_tag: "delivery_tag", consumer: consumer)
112
+ expect(@queue).to receive(:subscribe).with(block: true, manual_ack: true).and_yield(delivery_info,
113
+ double(:properties, reply_to: "reply_test", correlation_id: "correlation_id_sample"),
114
+ @request_message.to_msgpack)
115
+ core = subject
116
+ # FIXME: RSpec3 mock obsolete and_return{ ... } feature and it seems no alternatives.
117
+ # Re-define `execute` method to emulate signal handling during the method execution.
118
+ @executor.singleton_class.module_eval do
119
+ define_method(:execute) do |*args|
120
+ core.shutdown
121
+ nil
146
122
  end
147
- subject.run
148
123
  end
124
+ expect(@executor).to receive(:execute).with("reply_test", "correlation_id_sample", "delivery_tag", @request_message).once
125
+ subject.run
149
126
  end
150
127
  end
151
128
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: magellan-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.3
4
+ version: 0.2.4
5
5
  platform: ruby
6
6
  authors:
7
- - Yuuki Noguchi
7
+ - Groovenauts, Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-03-09 00:00:00.000000000 Z
11
+ date: 2015-09-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: railties
@@ -96,7 +96,7 @@ dependencies:
96
96
  version: '0'
97
97
  description: ''
98
98
  email:
99
- - otonakaoru@gmail.com
99
+ - tech@groovenauts.jp
100
100
  executables:
101
101
  - magellan-rails
102
102
  extensions: []
@@ -104,6 +104,7 @@ extra_rdoc_files: []
104
104
  files:
105
105
  - ".gitignore"
106
106
  - ".rspec"
107
+ - ChangeLog.md
107
108
  - Gemfile
108
109
  - LICENSE.txt
109
110
  - README.md
@@ -169,7 +170,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
169
170
  version: '0'
170
171
  requirements: []
171
172
  rubyforge_project:
172
- rubygems_version: 2.4.6
173
+ rubygems_version: 2.4.5.1
173
174
  signing_key:
174
175
  specification_version: 4
175
176
  summary: ''