Class: ThriftServer

Inherits:
Object
  • Object
show all
Defined in:
lib/thrift_server.rb,
lib/thrift_server/version.rb,
lib/thrift_server/logging_middleware.rb,
lib/thrift_server/metrics_middleware.rb,
lib/thrift_server/error_tracking_middleware.rb,
lib/thrift_server/honeybadger_error_tracker.rb

Defined Under Namespace

Classes: ErrorTrackingMiddleware, HoneybadgerErrorTracker, LoggingMiddleware, MetricsMiddleware, MiddlewareStack, RPC, StackDelegate

Constant Summary collapse

VERSION =
"0.1.0"

Class Method Summary collapse

Class Method Details

.build(processor, handler, options = { }, &block) ⇒ Object



56
57
58
59
60
61
62
# File 'lib/thrift_server.rb', line 56

def build(processor, handler, options = { }, &block)
  stack = wrap(processor, options, &block).new handler
  transport = Thrift::ServerSocket.new options.fetch(:port, 9090)
  transport_factory = Thrift::FramedTransportFactory.new

  Thrift::ThreadPoolServer.new stack, transport, transport_factory, nil, options.fetch(:threads, 4)
end

.wrap(processor, options = { }) {|stack| ... } ⇒ Object

Yields:

  • (stack)


64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
# File 'lib/thrift_server.rb', line 64

def wrap(processor, options = { })
  rpcs = processor.instance_methods.select { |m| m =~ /^process_(.+)$/ }

  logger = options.fetch :logger do
    fail ArgumentError, ':logger required'
  end

  statsd = options.fetch :statsd do
    fail ArgumentError, ':statsd required'
  end

  error_tracker = options.fetch :error_tracker do
    fail ArgumentError, ':error_tracker required'
  end

  stack = MiddlewareStack.new
  stack.use ErrorTrackingMiddleware, error_tracker
  stack.use MetricsMiddleware, statsd
  stack.use LoggingMiddleware, logger

  yield stack if block_given?

  wrapped = Class.new processor do
    extend Forwardable

    def_delegator :@handler, :use

    define_method :initialize do |handler|
      stack_delegator = Class.new StackDelegate
      stack_delegator.module_eval do
        rpcs.each do |method|
          rpc_name = method.to_s.match(/^process_(.+)$/)[1]

          define_method rpc_name.to_sym do |*args|
            call RPC.new(rpc_name, args)
          end
        end
      end

      super stack_delegator.new(stack, handler)
    end
  end

  wrapped
end