active_pubsub 0.0.7 → 0.0.8

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: 4c4e0a20248f5de90d821e8e07db538c76dd121c
4
- data.tar.gz: c3e9ffbf7d9faef44bf37393f38b39cfd3bfd806
3
+ metadata.gz: 732df7c0baced02169548ca0e1b68fe64672bf98
4
+ data.tar.gz: dc0e9439ab43e368ebef496cb24a0686e1d6d7e1
5
5
  SHA512:
6
- metadata.gz: 56af865a31f3bc9939f079c800191f9976a04d5039556d3e7721d74a9a59cda5e9d9560f439ec91fbaec689e0c5ae2f2ad09f5002ccf1cc529c525e009d560fb
7
- data.tar.gz: 0604dcb58eec116f71ae5c964d87f5a455c5aae35a2d1708ab5fdeae84aa36028efc45f2557dc2910e10dddc4a5547756f5b30be0aae13e8fe049d210ad63f4b
6
+ metadata.gz: 1fa9d7aabee001f5a1423d590277d0a6de796d3220f1ffa8c884699343e02689a4fc17fb2b8ef7389446fe7f244aa4566dc306fd22cde720c537b5a94dcdb2e5
7
+ data.tar.gz: f5068dc1ce77133ca6bbb2574d942be00a1c683c7b967da06465db2e1ecc44a1cedc4d2c78d1797c5762a9e1651ec8196e679ef3e865798c8d094657c1963fb6
data/README.md CHANGED
@@ -5,6 +5,16 @@ Service oriented observers for active record, via RabbitMQ and Bunny gem. Publis
5
5
  Best examples can be found here:
6
6
  https://github.com/jasonayre/active_pubsub_examples
7
7
 
8
+ ### Quick important development/spring bug note ###
9
+ If you are having issues with either publisher or subscribers hanging in development,
10
+ kill spring. Kill it twice actually. Make sure its dead. Then restart with env var
11
+
12
+ ```
13
+ DISABLE_SPRING=1 bx subscriber start
14
+ ```
15
+
16
+ And when running server or console make sure to DISABLE_SPRING=1 as well. (dont know how to treat the problem yet just diagnose the symptom which seems to be spring)
17
+
8
18
  ## Publisher Example
9
19
  ``` ruby
10
20
  class Post < ::ActiveRecord::Base
data/bin/subscriber CHANGED
@@ -5,22 +5,53 @@ require 'active_pubsub'
5
5
  require './config/environment.rb'
6
6
 
7
7
  class Subscriber < ::Thor
8
+ option :address, :type => :string, :default => ENV['RABBITMQ_URL'], :aliases => %w(-a), :desc => "RabbitMQ url. Default is #{ENV['RABBITMQ_URL']}"
9
+ option :log, :type => :string, :default => ::STDOUT, :aliases => %w(-l), :desc => 'Log file or device. Default is STDOUT.'
10
+ option :level, :type => :numeric, :default => ::Logger::INFO, :aliases => %w(-v), :desc => 'Log level to use, 0-5 (see http://www.ruby-doc.org/stdlib/libdoc/logger/rdoc/)'
11
+
8
12
  desc "start", "Start ActivePubsub Subscriber"
9
13
  def start
10
- puts "Starting ActivePubsub Subscriber"
14
+ merge_config_options!(options)
15
+ configure_logger
16
+ configure_traps
17
+ start_subscribers
18
+ end
19
+
20
+ no_tasks do
21
+ def configure_logger
22
+ log_level = options.debug? ? ::Logger::DEBUG : options.level
23
+ ::ActivePubsub::Logging.initialize_logger(options.log, log_level)
24
+
25
+ ::ActivePubsub.config.logger
26
+ end
11
27
 
12
- ::ActivePubsub.load_subscribers
28
+ # Configure signal traps.
29
+ def configure_traps
30
+ exit_signals = [:INT, :TERM]
31
+ exit_signals << :QUIT unless defined?(JRUBY_VERSION)
13
32
 
14
- ::ActivePubsub.start_subscribers
33
+ exit_signals.each do |signal|
34
+ trap(signal) do
35
+ puts "Stopping Subscribers"
36
+ exit(0)
37
+ end
38
+ end
39
+ end
15
40
 
16
- puts "Subscribers Started"
41
+ def merge_config_options!(options)
42
+ ::ActivePubsub.config.merge!(options)
43
+ end
44
+
45
+ def start_subscribers
46
+ ::ActivePubsub.logger.info "Starting Subscribers"
47
+
48
+ ::ActivePubsub.load_subscribers
49
+
50
+ ::ActivePubsub.start_subscribers
51
+ end
17
52
  end
18
53
  end
19
54
 
20
- #todo: write event loop that handles shutdown gracefully
21
- #however, it seems that Bunny knows when to wake subscribers up
22
- #so sleeping seems to be enough for now
23
-
24
55
  ::Subscriber.start
25
56
 
26
57
  sleep
@@ -10,6 +10,7 @@ module ActivePubsub
10
10
  self[:address] ||= ENV['RABBITMQ_URL']
11
11
  self[:publish_as] ||= nil
12
12
  self[:service_namespace] ||= nil
13
+ self[:logger] ||= ::ActivePubsub::Logging.logger
13
14
  end
14
15
  end
15
16
  end
@@ -1,6 +1,5 @@
1
1
  require "bunny"
2
2
 
3
-
4
3
  module ActivePubsub
5
4
  class Connection < Delegator
6
5
  attr_accessor :connection, :channel
@@ -0,0 +1,41 @@
1
+ require 'logger'
2
+
3
+ module ActivePubsub
4
+ module Logging
5
+ def self.initialize_logger(log_target=$stdout, log_level=::Logger::INFO)
6
+ @counter ||= 0
7
+ @counter = @counter + 1
8
+ @logger = ::Logger.new(log_target)
9
+ @logger.level = log_level
10
+ @logger
11
+ end
12
+
13
+ def self.logger
14
+ defined?(@logger) ? @logger : initialize_logger
15
+ end
16
+
17
+ def self.logger=(new_logger)
18
+ @logger = new_logger
19
+ end
20
+
21
+ def logger
22
+ ::ActivePubsub::Logging.logger
23
+ end
24
+
25
+ def log_exception(ex)
26
+ logger.error { ex.message }
27
+ logger.error { ex.backtrace[0..5].join("\n") }
28
+ logger.debug { ex.backtrace.join("\n") }
29
+ end
30
+
31
+ def log_signature
32
+ @_log_signature ||= "[#{self.class == Class ? self.name : self.class.name}]"
33
+ end
34
+
35
+ def sign_message(message)
36
+ "#{log_signature} #{message}"
37
+ end
38
+ end
39
+ end
40
+
41
+ # Inspired by [protobuf](https://github.com/localshred/protobuf)
@@ -31,18 +31,24 @@ module ActivePubsub
31
31
  record_updated_event = ::ActivePubsub::Event.new(self.class.exchange_key, "updated", serialized_resource)
32
32
 
33
33
  ::ActivePubsub.publish_event(record_updated_event)
34
+
35
+ ::ActivePubsub.logger.info(record_updated_event)
34
36
  end
35
37
 
36
38
  def publish_created_event
37
39
  record_created_event = ::ActivePubsub::Event.new(self.class.exchange_key, "created", serialized_resource)
38
40
 
39
41
  ::ActivePubsub.publish_event(record_created_event)
42
+
43
+ ::ActivePubsub.logger.info(record_created_event)
40
44
  end
41
45
 
42
46
  def publish_destroyed_event
43
47
  record_destroyed_event = ::ActivePubsub::Event.new(self.class.exchange_key, "destroyed", serialized_resource)
44
48
 
45
49
  ::ActivePubsub.publish_event(record_destroyed_event)
50
+
51
+ ::ActivePubsub.logger.info(record_destroyed_event)
46
52
  end
47
53
 
48
54
  def serialized_resource
@@ -52,6 +52,8 @@ module ActivePubsub
52
52
 
53
53
  def publish_event(event)
54
54
  ::ActiveRecord::Base.connection_pool.with_connection do
55
+ ::ActivePubsub.logger.info("Publishing event: #{event.id} to #{event.routing_key}")
56
+
55
57
  exchanges[event.exchange].publish(serialize_event(event), :routing_key => event.routing_key)
56
58
  end
57
59
  end
@@ -5,7 +5,7 @@ module ActivePubsub
5
5
  # we only need publisher started if service has a publishable model
6
6
  ::ActiveSupport.on_load(:active_record) do
7
7
  if(::ActivePubsub::Publisher.publishable_model_count > 0) && !::ActivePubsub::Publisher.started?
8
- puts "Starting Publisher"
8
+ ::ActivePubsub.logger.info("Starting Publisher")
9
9
  ::ActivePubsub::Publisher.start
10
10
  end
11
11
  end
@@ -18,6 +18,11 @@ module ActivePubsub
18
18
  self.local_service_namespace = service_namespace
19
19
  end
20
20
 
21
+ def self.clear_connections!
22
+ channel.close
23
+ connection.close
24
+ end
25
+
21
26
  def self.channel
22
27
  connection.channel
23
28
  end
@@ -46,6 +51,8 @@ module ActivePubsub
46
51
 
47
52
  subscriber_instance = new(deserialized_record)
48
53
  subscriber_instance.instance_exec(deserialized_record, &block)
54
+
55
+ ::ActivePubsub.logger.info "#{delivery_info[:routing_key]} #{name} consumed #{deserialized_event}"
49
56
  end
50
57
  end
51
58
 
@@ -53,11 +60,11 @@ module ActivePubsub
53
60
  end
54
61
 
55
62
  def self.deserialize_event(event)
56
- @current_event = ::Marshal.load(event)
63
+ ::Marshal.load(event)
57
64
  end
58
65
 
59
66
  def self.deserialize_record(record)
60
- @current_record = ::Marshal.load(record)
67
+ ::Marshal.load(record)
61
68
  end
62
69
 
63
70
  def self.observes(target_exchange)
@@ -80,7 +87,7 @@ module ActivePubsub
80
87
  "\n"
81
88
  end
82
89
 
83
- puts message
90
+ ::ActivePubsub.logger.info(message)
84
91
  end
85
92
 
86
93
  def self.started?
@@ -93,6 +100,5 @@ module ActivePubsub
93
100
  def initialize(record)
94
101
  @record = record
95
102
  end
96
-
97
103
  end
98
104
  end
@@ -1,3 +1,3 @@
1
1
  module ActivePubsub
2
- VERSION = "0.0.7"
2
+ VERSION = "0.0.8"
3
3
  end
data/lib/active_pubsub.rb CHANGED
@@ -7,6 +7,8 @@ require "celluloid"
7
7
  require "active_support/all"
8
8
  require "active_attr"
9
9
  require "pry"
10
+ require "active_pubsub/config"
11
+ require "active_pubsub/logging"
10
12
 
11
13
  module ActivePubsub
12
14
  class << self
@@ -16,9 +18,9 @@ module ActivePubsub
16
18
  delegate :publish_event, :to => :publisher
17
19
  end
18
20
 
19
- def self.configure
20
- self.configuration ||= ::ActivePubsub::Config.new
21
+ @configuration ||= ::ActivePubsub::Config.new
21
22
 
23
+ def self.configure
22
24
  yield(configuration)
23
25
 
24
26
  ::ActiveSupport.run_load_hooks(:active_pubsub, self)
@@ -28,6 +30,14 @@ module ActivePubsub
28
30
  ::Dir.glob(::Rails.root.join('app', 'subscribers', "*.rb")).each{ |file| load file }
29
31
  end
30
32
 
33
+ def self.logger
34
+ configuration.logger
35
+ end
36
+
37
+ def self.logger?
38
+ configuration.logger.present?
39
+ end
40
+
31
41
  def self.publisher
32
42
  ::Celluloid::Actor[:rabbit_publisher]
33
43
  end
@@ -37,11 +47,10 @@ module ActivePubsub
37
47
  end
38
48
 
39
49
  def self.start_subscribers
40
-
41
50
  ::ActivePubsub::Subscriber.subclasses.each do |subscriber|
42
51
  next if subscriber.started?
43
52
 
44
- puts "Starting #{subscriber.name}"
53
+ ::ActivePubsub.logger.info("Starting #{subscriber.name}")
45
54
 
46
55
  subscriber.bind_subscriptions!
47
56
  subscriber.print_subscriptions!
@@ -51,11 +60,9 @@ module ActivePubsub
51
60
  def self.symbolize_routing_key(routing_key)
52
61
  :"#{routing_key.split('.').join('_')}"
53
62
  end
54
-
55
63
  end
56
64
 
57
65
  require "active_pubsub/connection"
58
- require "active_pubsub/config"
59
66
  require "active_pubsub/event"
60
67
  require "active_pubsub/publisher"
61
68
  require "active_pubsub/publishable"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_pubsub
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.7
4
+ version: 0.0.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jason Ayre
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-10-21 00:00:00.000000000 Z
11
+ date: 2014-10-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: active_attr
@@ -314,6 +314,7 @@ files:
314
314
  - lib/active_pubsub/config.rb
315
315
  - lib/active_pubsub/connection.rb
316
316
  - lib/active_pubsub/event.rb
317
+ - lib/active_pubsub/logging.rb
317
318
  - lib/active_pubsub/publish_with_serializer.rb
318
319
  - lib/active_pubsub/publishable.rb
319
320
  - lib/active_pubsub/publisher.rb