active_pubsub 0.0.7 → 0.0.8

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 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