background_lite 0.1.0 → 0.2.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.
@@ -1,3 +1,6 @@
1
+ require 'digest/sha1'
2
+ require 'logger'
3
+
1
4
  # This module holds methods for background handling
2
5
  module BackgroundLite
3
6
  # This class is for configuring defaults of the background processing
@@ -14,6 +17,9 @@ module BackgroundLite
14
17
  @@default_error_reporter = :stdout
15
18
  cattr_accessor :default_error_reporter
16
19
 
20
+ # Logger for debugging purposes
21
+ cattr_writer :default_logger
22
+
17
23
  def self.config #:nodoc:
18
24
  @config ||= YAML.load(File.read("#{RAILS_ROOT}/config/background.yml")) rescue { RAILS_ENV => {} }
19
25
  end
@@ -27,6 +33,17 @@ module BackgroundLite
27
33
  end
28
34
  end
29
35
  end
36
+
37
+ def self.default_logger #:nodoc:
38
+ fallback_logger = if Object.const_defined?("RAILS_DEFAULT_LOGGER")
39
+ RAILS_DEFAULT_LOGGER
40
+ else
41
+ logger = Logger.new(STDOUT)
42
+ logger.level = Logger::WARN
43
+ logger
44
+ end
45
+ @@default_logger ||= config['logger'] || fallback_logger
46
+ end
30
47
 
31
48
  def self.load(configuration) #:nodoc:
32
49
  if configuration.blank?
@@ -83,17 +100,25 @@ module BackgroundLite
83
100
  [options.delete(:handler) || config[:handler] || BackgroundLite::Config.default_handler].flatten
84
101
  end
85
102
  reporter = options.delete(:reporter) || config[:reporter] || BackgroundLite::Config.default_error_reporter
103
+ logger = options.delete(:logger) || config[:logger] || BackgroundLite::Config.default_logger
86
104
 
87
105
  handler.each do |hand|
88
- options = {}
89
106
  if hand.is_a? Hash
90
107
  raise "Malformed handler options Hash" if hand.keys.size != 1
91
108
  options = hand.values.first
92
109
  hand = hand.keys.first
93
110
  end
111
+ options ||= {}
94
112
 
95
113
  begin
96
114
  BackgroundLite.disable do
115
+ if logger.debug?
116
+ # Transaction ID is currently only used for debugging to find corresponding
117
+ # messages on both sides of the queue. It is optional and should be expected
118
+ # to be nil
119
+ options[:transaction_id] = Digest::SHA1.hexdigest(object.to_s + method.to_s + args.inspect + Time.now.to_s)
120
+ logger.debug("Sending to background: Object: #{object.inspect} Method: #{method} Args: #{args.inspect} Options: #{options.inspect}")
121
+ end
97
122
  "BackgroundLite::#{hand.to_s.camelize}Handler".constantize.handle(object, method, args, options)
98
123
  end
99
124
 
@@ -28,7 +28,7 @@ module BackgroundLite
28
28
  # queue:: The name of the queue to use to send the message to the background
29
29
  # process.
30
30
  def self.handle(object, method, args, options = {})
31
- ActiveMessaging::Gateway.publish((options[:queue] || self.queue_name).to_sym, Marshal.dump([object, method, args]))
31
+ ActiveMessaging::Gateway.publish((options[:queue] || self.queue_name).to_sym, Marshal.dump([object, method, args, options[:transaction_id]]))
32
32
  end
33
33
 
34
34
  # Decodes a marshalled message which was previously sent over
@@ -36,14 +36,14 @@ module BackgroundLite
36
36
  # as a string, and the method arguments.
37
37
  def self.decode(message)
38
38
  begin
39
- object, method, args = Marshal.load(message)
39
+ object, method, args, transaction_id = Marshal.load(message)
40
40
  rescue ArgumentError => e
41
41
  # Marshal.load does not trigger const_missing, so we have to do this
42
42
  # ourselves.
43
43
  e.message.split(' ').last.constantize
44
44
  retry
45
45
  end
46
- [object, method, args]
46
+ [object, method, args, transaction_id]
47
47
  end
48
48
 
49
49
  # Executes a marshalled message which was previously sent over
@@ -51,14 +51,19 @@ module BackgroundLite
51
51
  # passed.
52
52
  def self.execute(message)
53
53
  begin
54
- object, method, args = self.decode(message)
55
- puts "--- executing method: #{method}\n--- with variables: #{args.inspect}\n--- in object: #{object.class.name}, #{object.id}"
56
-
54
+ object, method, args, transaction_id = self.decode(message)
55
+ logger = BackgroundLite::Config.default_logger
56
+ if logger.debug?
57
+ logger.debug "--- executing method: #{method}"
58
+ logger.debug "--- with variables: #{args.inspect}"
59
+ logger.debug "--- in object: #{object.class.name}, #{object.id}"
60
+ logger.debug "--- Transaction ID: #{transaction_id}"
61
+ end
57
62
  object.send(method, *args)
58
- puts "--- it happened!"
63
+ logger.debug "--- it happened!" if logger.debug?
59
64
  rescue Exception => e
60
- puts e.message
61
- puts e.backtrace
65
+ logger.fatal e.message
66
+ logger.fatal e.backtrace
62
67
  end
63
68
  end
64
69
  end
@@ -3,12 +3,16 @@ module BackgroundLite
3
3
  # Resque to the background process.
4
4
  class ResqueHandler
5
5
  @queue = :background
6
-
6
+
7
+ class << self
8
+ attr_accessor :queue
9
+ end
10
+
7
11
  # Marshals the method and the arguments and sends it through Resque
8
12
  # to the background process.
9
13
  def self.handle(object, method, args, options = {})
10
14
  require 'resque'
11
- Resque.enqueue(self, Base64.encode64(Marshal.dump([object, method, args])))
15
+ Resque.enqueue(self, Base64.encode64(Marshal.dump([object, method, args, options[:transaction_id]])))
12
16
  end
13
17
 
14
18
  # Decodes a marshalled message which was previously sent over
@@ -16,14 +20,14 @@ module BackgroundLite
16
20
  # as a string, and the method arguments.
17
21
  def self.decode(message)
18
22
  begin
19
- object, method, args = Marshal.load(Base64.decode64(message))
23
+ object, method, args, transaction_id = Marshal.load(Base64.decode64(message))
20
24
  rescue ArgumentError => e
21
25
  # Marshal.load does not trigger const_missing, so we have to do this
22
26
  # ourselves.
23
27
  e.message.split(' ').last.constantize
24
28
  retry
25
29
  end
26
- [object, method, args]
30
+ [object, method, args, transaction_id]
27
31
  end
28
32
 
29
33
  # Executes a marshalled message which was previously sent over
@@ -31,14 +35,19 @@ module BackgroundLite
31
35
  # passed.
32
36
  def self.perform(message)
33
37
  begin
34
- object, method, args = self.decode(message)
35
- puts "--- executing method: #{method}\n--- with variables: #{args.inspect}\n--- in object: #{object.class.name}, #{object.id}"
36
-
38
+ object, method, args, transaction_id = self.decode(message)
39
+ logger = BackgroundLite::Config.default_logger
40
+ if logger.debug?
41
+ logger.debug "--- executing method: #{method}"
42
+ logger.debug "--- with variables: #{args.inspect}"
43
+ logger.debug "--- in object: #{object.class.name}, #{object.id}"
44
+ logger.debug "--- Transaction ID: #{transaction_id}"
45
+ end
37
46
  object.send(method, *args)
38
- puts "--- it happened!"
47
+ logger.debug "--- it happened!" if logger.debug?
39
48
  rescue Exception => e
40
- puts e.message
41
- puts e.backtrace
49
+ logger.fatal e.message
50
+ logger.fatal e.backtrace
42
51
  end
43
52
  end
44
53
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: background_lite
3
3
  version: !ruby/object:Gem::Version
4
- hash: 27
4
+ hash: 23
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
- - 1
8
+ - 2
9
9
  - 0
10
- version: 0.1.0
10
+ version: 0.2.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Thomas Kadauke
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-08-09 00:00:00 +02:00
18
+ date: 2010-08-10 00:00:00 +02:00
19
19
  default_executable:
20
20
  dependencies: []
21
21