Class: Ap4r::StoredMessage

Inherits:
ActiveRecord::Base
  • Object
show all
Defined in:
lib/ap4r/stored_message.rb

Overview

This class is the model class for SAF(store and foward). The migration file is located at following path,

ap4r/lib/ap4r/xxx_create_table_for_saf.rb

Don’t forget to create table, before use SAF.

Constant Summary collapse

STATUS_STORED =
0
STATUS_FORWARDED =
1
STATUS_FAILED =
-1
PHYSICAL =
:physical
LOGICAL =
:logical

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.destroy_if_exists(id, options) ⇒ Object

Destroy a record by id. Some options are supported.

  • :delete_mode (:physical or :logical)

Default delete mmode is physical. If you need logical delete, for example you neeed checking message duplication etc, Set the instance variable appropriately.



63
64
65
66
67
68
69
70
71
72
# File 'lib/ap4r/stored_message.rb', line 63

def self.destroy_if_exists(id, options)
  result = nil
  begin
    result = StoredMessage.find(id) 
  rescue ActiveRecord::RecordNotFound
    # There are chances that othere thread or process already forwarded. 
    return nil
  end
  result.destroy_or_update(options)
end

.store(queue_name, queue_message, rm_options = {}) ⇒ Object

Insert queue information, such as queue name and message, for next logic.

duplication_check_id is generated from UUID and should be unique in all records of StoreMessages. So, using this id, it’s possible to protect to execute same asynchronous processing by same message. But by default, record of StoreMessages is removed after putting a message into queue completed.



40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/ap4r/stored_message.rb', line 40

def self.store(queue_name, queue_message, rm_options = {})
  sm = StoredMessage.new do |s|
    s.duplication_check_id = UUID.new
    s.queue = queue_name
    s.status = STATUS_STORED
    s.object = Marshal::dump(queue_message)
    s.headers = Marshal::dump(rm_options)
  end

  begin
    sm.save!
  rescue Exception => error
    raise error
  end  
  sm
end

Instance Method Details

#destroy_or_update(options = {:delete_mode => PHYSICAL}) ⇒ Object



74
75
76
77
78
79
80
81
82
83
84
85
86
# File 'lib/ap4r/stored_message.rb', line 74

def destroy_or_update(options = {:delete_mode => PHYSICAL})
  case options[:delete_mode]
  when PHYSICAL
    # TODO: Confirm to raise error, 2006/10/17 kato-k 
    self.destroy
  when LOGICAL
    self.status = STATUS_FORWARDED
    self.save!
  else
    raise "unknown delete mode: #{options[:delete_mode]}"
  end
  self
end