Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Service encapsulates an object which executes a bit of code in a loop that can be started or stopped and query whether it is running or not.
Ruby
branch: master

Fetching latest commit…

Cannot retrieve the latest commit at this time

Failed to load latest commit information.
lib
Gemfile
LICENSE
README.md
Rakefile
VERSION
service.gemspec

README.md

Service

serv·ice noun /ˈsɜr vɪs/ : The action of helping or doing work for someone.

Service encapsulates an object which executes a bit of code in a loop that can be started or stopped and query whether it is running or not.

Install

Bundler: gem 'service'

RubyGems: gem install service

Usage

Defining

You can define an Object as a Service by subclassing Service or by including/extending Service::Base.

class ServiceA < Service
end

class ServiceB
  include Service::Base
end

class ServiceC
  extend Service::Base
end

A Service object stores it's state in the @_service_state instance variable as to be as unobtrusive as possible when integrating with your custom objects.

The next thing to do is define a execute instance method on your object:

class MyService < Service
  def execute
    # ...
  end
end

Running

Service gives simply allows you to run your code that is within the execute method in four different ways: once (execute), once in a new Thread (execute!), in a loop (start/run), or in a loop within a new Thread (start!/run!)


Use the start/run instance method to call the execute instance method in a loop.

class MyService < Service
  def execute
    puts "Hello"
  end
end

MyService.new.run
# => Hello
# => Hello
# => ...

Use start!/run! to call the run in a new Thread.

class MyService < Service
  def execute
    puts "Hello"
  end
end

thread = MyService.new.run!
thread.join
# => Hello
# => Hello
# => ...

Stopping

Use the stop instance method break the run loop.
This will also kill the Thread it is running in, if running in a Thread.

class MyService < Service
  def execute
    sleep 3
    stop
  end
end

print "Running MyService in a new Thread... "
thread = MyService.new.run!
thread.join
puts "Done!"

Querying State

Use the started?/running? or stopped? instance methods to determine the current state of the Service instance.

class MyService < Service
  def execute
    sleep 10
  end
end

service = MyService.new
p service.running? # => false
service.run!
sleep 1
p service.running? # => true

Example

require 'service'

class PingService < Service
  def execute
    sleep rand(5)
    print 'ping'
    stop
  end
end

class PongService
  include Service::Base

  def execute
    sleep rand(5)
    print 'pong'
    stop
  end
end

class ExcitementService
  extend Service::Base

  def execute
    sleep rand(5)
    print '!'
    stop
  end
end

threads = []
threads << PingService.new.run!
threads << PongService.new.run!
threads << ExcitementService.new.run!

threads.each(&:join)

Copyright

Copyright © 2012 Ryan Scott Lewis ryan@rynet.us.

The MIT License (MIT) - See LICENSE for further details.

Something went wrong with that request. Please try again.