Class: ASIR::Transport::File

Inherits:
Stream show all
Includes:
PayloadIO
Defined in:
lib/asir/transport/file.rb

Overview

!SLIDE File Transport

Send Message to a file. Can be used as a log or named pipe service.

Constant Summary

Constants included from PayloadIO

PayloadIO::FOOTER, PayloadIO::HEADER

Constants included from ASIR::ThreadVariable

ASIR::ThreadVariable::DEBUG, ASIR::ThreadVariable::EMPTY_HASH, ASIR::ThreadVariable::SETTER

Instance Attribute Summary collapse

Attributes inherited from ASIR::Transport

#after_invoke_message, #after_receive_message, #before_send_message, #coder_needs_result_message, #decoder, #encoder, #invoker, #message_count, #needs_message_identifier, #needs_message_timestamp, #on_exception, #on_result_exception, #one_way, #running, #verbose

Attributes included from Log

#_logger

Instance Method Summary collapse

Methods included from PayloadIO

#_read, #_read_line_and_expect!, #_write, #close

Methods inherited from Stream

#_serve_stream!, #serve_stream!, #serve_stream_message!, #stream_eof?

Methods inherited from ASIR::Transport

#_after_invoke_message, #_subclass_responsibility, #invoke_message!, #needs_message_timestamp?, #receive_message, #receive_result, #send_result, #serve_message!, #stop!, #with_force_stop!, #with_server_signals!

Methods included from Log

#_log, #_log_enabled=, #_log_enabled?, #_log_format, #_log_result, enabled, enabled=, included

Methods included from AdditionalData

#[], #[]=, #_additional_data, #additional_data, #additional_data!, #additional_data=, included

Methods included from Message::Delay

#relative_message_delay!, #wait_for_delay!

Methods included from ASIR::ThreadVariable

included, setter

Constructor Details

#initialize(opts = nil) ⇒ File

Returns a new instance of File.



17
# File 'lib/asir/transport/file.rb', line 17

def initialize opts = nil; @one_way = true; super; end

Instance Attribute Details

#fileObject

Returns the value of attribute file.



14
15
16
# File 'lib/asir/transport/file.rb', line 14

def file
  @file
end

#modeObject

Returns the value of attribute mode.



14
15
16
# File 'lib/asir/transport/file.rb', line 14

def mode
  @mode
end

#permsObject

Returns the value of attribute perms.



14
15
16
# File 'lib/asir/transport/file.rb', line 14

def perms
  @perms
end

#result_fifoObject

Returns the value of attribute result_fifo.



15
16
17
# File 'lib/asir/transport/file.rb', line 15

def result_fifo
  @result_fifo
end

#result_fileObject

Returns the value of attribute result_file.



15
16
17
# File 'lib/asir/transport/file.rb', line 15

def result_file
  @result_file
end

#streamObject

!SLIDE File Transport Support



83
84
85
# File 'lib/asir/transport/file.rb', line 83

def stream
  @stream
end

Instance Method Details

#_receive_message(state) ⇒ Object



46
47
48
# File 'lib/asir/transport/file.rb', line 46

def _receive_message state
  state.message_payload = _read(state.in_stream || stream, state)
end

#_receive_result(state) ⇒ Object

Receive result from result_file.



60
61
62
63
64
65
66
# File 'lib/asir/transport/file.rb', line 60

def _receive_result state
  with_result_file state do | result_file |
    ::File.open(result_file, "r") do | stream |
      state.result_payload = _read(stream, state)
    end
  end
end

#_send_message(state) ⇒ Object



40
41
42
43
44
# File 'lib/asir/transport/file.rb', line 40

def _send_message state
  _write(state.message_payload, state.out_stream || stream, state)
ensure
  close if file && ::File.pipe?(file)
end

#_send_result(state) ⇒ Object

Send result to result_file.



51
52
53
54
55
56
57
# File 'lib/asir/transport/file.rb', line 51

def _send_result state
  with_result_file state do | result_file |
    ::File.open(result_file, "a+") do | stream |
      _write(state.result_payload, stream, state)
    end
  end
end

#needs_message_identifier?(m) ⇒ Boolean

Returns:

  • (Boolean)


76
77
78
# File 'lib/asir/transport/file.rb', line 76

def needs_message_identifier? m
  @needs_message_identifier || ! one_way || ! m.one_way
end

#prepare_server!Object Also known as: prepare_pipe_server!

!SLIDE Named Pipe Server



106
107
108
109
110
# File 'lib/asir/transport/file.rb', line 106

def prepare_server!
  unless ::File.exist? file
    ::ASIR::Fifo.mkfifo(file, perms)
  end
end

#run_server!Object Also known as: run_pipe_server!



113
114
115
116
117
118
119
120
# File 'lib/asir/transport/file.rb', line 113

def run_server!
  with_server_signals! do
    @running = true
    while @running
      serve_file!
    end
  end
end

#send_message(message) ⇒ Object

If not one_way, create a result_file fifo.



20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/asir/transport/file.rb', line 20

def send_message message
  result_file_created = false
  unless one_way || message.one_way
    result_file = message[:result_file] ||= self.result_file ||
      begin
        message.create_identifier!
        "#{self.file}-result-#{message.identifier}"
      end
    unless ::File.exist?(result_file) and result_fifo
      ::ASIR::Fifo.mkfifo(result_file, perms)
      result_file_created = true
    end
  end
  super
ensure
  if result_file_created
    ::File.unlink(result_file) rescue nil
  end
end

#serve_file!Object

!SLIDE Process (receive) messages from a file.



96
97
98
99
100
101
# File 'lib/asir/transport/file.rb', line 96

def serve_file!
  ::File.open(file, "r") do | stream |
    @running = true
    _serve_stream! stream, ! one_way
  end
end

#with_result_file(state) ⇒ Object



68
69
70
71
72
73
74
# File 'lib/asir/transport/file.rb', line 68

def with_result_file state
  unless one_way || (message = state.message).one_way
    if result_file = message[:result_file] || self.result_file
      yield result_file
    end
  end
end