class Harmony::Service::RpcService

Public Instance Methods

create_reply_to_connection() click to toggle source
# File lib/harmony/service/rpc_service.rb, line 44
def create_reply_to_connection
  opts = Sneakers::CONFIG
  conn = Bunny.new(opts[:amqp], vhost: opts[:vhost], heartbeat: opts[:heartbeat], logger: Sneakers.logger)
  conn.start
  conn
end
create_reply_to_exchange() click to toggle source
# File lib/harmony/service/rpc_service.rb, line 55
def create_reply_to_exchange
  ch = reply_to_connection.create_channel
  ch.exchange(AMQ::Protocol::EMPTY_STRING, auto_delete: true)
end
reply_to_connection() click to toggle source
# File lib/harmony/service/rpc_service.rb, line 40
def reply_to_connection
  @reply_to_connection ||= create_reply_to_connection
end
reply_to_exchange() click to toggle source
# File lib/harmony/service/rpc_service.rb, line 51
def reply_to_exchange
  @reply_to_queue ||= create_reply_to_exchange
end
stop() click to toggle source
Calls superclass method
# File lib/harmony/service/rpc_service.rb, line 34
def stop
  super
  # reply_to_exchange.close # not working
  reply_to_connection.close
end
work_with_params(message, _delivery_info, metadata) click to toggle source
# File lib/harmony/service/rpc_service.rb, line 13
def work_with_params(message, _delivery_info, metadata)
  logger.debug "Request: #{message}"
  request = Oj.load(message)
  request_class = request.class
  response_classes = request_response_mapping[request_class]
  raise "Unacceptable request class: #{request_class}" if response_classes.nil?

  result = new_handler.work_with_request(request)
  raise "Unacceptable response class: #{result.class}" unless response_classes.include?(result.class)

  send_response(result, metadata)
  ack!
rescue StandardError => error
  logger.error error.message
  logger.error error.backtrace.join("\n")

  error_response = ErrorResponse.new message: error.message, exception: error
  send_response(error_response, metadata)
  reject!
end

Private Instance Methods

new_handler() click to toggle source
# File lib/harmony/service/rpc_service.rb, line 87
def new_handler
  handler_class = Sneakers::CONFIG[:handler_class]
  raise 'No handler specified' if handler_class.nil?

  handler = Object.const_get(handler_class).new
  raise "Unable to create handler: #{handler_class}" if handler.nil?

  handler
end
request_response_mapping() click to toggle source
# File lib/harmony/service/rpc_service.rb, line 72
def request_response_mapping
  {
    Calculator::Request => [Calculator::Response],
    ActionList::ListRequest => [Array],
    ActionList::ItemRequest => [Hash],
    ActionList::ActionRequest => [Response],
    Chart::Request => [Chart::Response],
    Form::GetRequest => [Form::GetResponse],
    Flow::EndedRequest => [Response],
    Notification::Request => [Notification::AppResponse, Response],
    AttributeNamesRequest => [AttributeNamesResponse],
    OauthTokenRequest => [OauthTokenResponse]
  }
end
send_response(result, metadata) click to toggle source
# File lib/harmony/service/rpc_service.rb, line 62
def send_response(result, metadata)
  json = Oj.dump(result)
  logger.debug "Response: #{json}"
  send_response_json(json, metadata.reply_to, metadata.correlation_id)
end
send_response_json(json, routing_key, correlation_id) click to toggle source
# File lib/harmony/service/rpc_service.rb, line 68
def send_response_json(json, routing_key, correlation_id)
  reply_to_exchange.publish(json, routing_key: routing_key, correlation_id: correlation_id)
end