qwirk 0.0.1 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. data/README.md +9 -14
  2. data/lib/qwirk.rb +26 -17
  3. data/lib/qwirk/adapter.rb +3 -45
  4. data/lib/qwirk/adapter/base.rb +2 -0
  5. data/lib/qwirk/adapter/base/expanding_worker_config.rb +133 -0
  6. data/lib/qwirk/adapter/base/worker_config.rb +104 -0
  7. data/lib/qwirk/adapter/in_memory.rb +13 -0
  8. data/lib/qwirk/{queue_adapter/in_mem → adapter/in_memory}/factory.rb +2 -2
  9. data/lib/qwirk/{queue_adapter/in_mem → adapter/in_memory}/publisher.rb +4 -4
  10. data/lib/qwirk/{queue_adapter/in_mem → adapter/in_memory}/queue.rb +3 -2
  11. data/lib/qwirk/{queue_adapter/in_mem → adapter/in_memory}/reply_queue.rb +3 -2
  12. data/lib/qwirk/{queue_adapter/in_mem → adapter/in_memory}/topic.rb +2 -2
  13. data/lib/qwirk/{queue_adapter/in_mem → adapter/in_memory}/worker.rb +6 -8
  14. data/lib/qwirk/adapter/in_memory/worker_config.rb +50 -0
  15. data/lib/qwirk/adapter/inline.rb +9 -0
  16. data/lib/qwirk/adapter/inline/publisher.rb +86 -0
  17. data/lib/qwirk/adapter/inline/worker.rb +55 -0
  18. data/lib/qwirk/adapter/inline/worker_config.rb +30 -0
  19. data/lib/qwirk/adapter_factory.rb +48 -0
  20. data/lib/qwirk/base_worker.rb +18 -28
  21. data/lib/qwirk/batch/file_worker.rb +4 -4
  22. data/lib/qwirk/manager.rb +11 -8
  23. data/lib/qwirk/marshal_strategy/none.rb +1 -1
  24. data/lib/qwirk/publish_handle.rb +22 -11
  25. data/lib/qwirk/publisher.rb +9 -9
  26. data/lib/qwirk/{request_worker.rb → reply_worker.rb} +3 -3
  27. data/lib/qwirk/worker.rb +27 -29
  28. data/test/jms_fail_test.rb +11 -11
  29. data/test/jms_requestor_block_test.rb +12 -12
  30. data/test/jms_requestor_test.rb +8 -8
  31. data/test/jms_test.rb +10 -10
  32. metadata +104 -185
  33. data/examples/README +0 -1
  34. data/examples/activemq.xml +0 -84
  35. data/examples/advanced_requestor/README.md +0 -15
  36. data/examples/advanced_requestor/base_request_worker.rb +0 -18
  37. data/examples/advanced_requestor/char_count_worker.rb +0 -16
  38. data/examples/advanced_requestor/config.ru +0 -24
  39. data/examples/advanced_requestor/exception_raiser_worker.rb +0 -17
  40. data/examples/advanced_requestor/length_worker.rb +0 -14
  41. data/examples/advanced_requestor/print_worker.rb +0 -14
  42. data/examples/advanced_requestor/publisher.rb +0 -49
  43. data/examples/advanced_requestor/qwirk.yml +0 -16
  44. data/examples/advanced_requestor/reverse_worker.rb +0 -14
  45. data/examples/advanced_requestor/triple_worker.rb +0 -14
  46. data/examples/batch/my_batch_worker.rb +0 -30
  47. data/examples/batch/my_line_worker.rb +0 -8
  48. data/examples/qwirk.yml +0 -20
  49. data/examples/requestor/README.md +0 -13
  50. data/examples/requestor/config.ru +0 -13
  51. data/examples/requestor/qwirk_persist.yml +0 -5
  52. data/examples/requestor/requestor.rb +0 -68
  53. data/examples/requestor/reverse_echo_worker.rb +0 -15
  54. data/examples/setup.rb +0 -13
  55. data/examples/shared/README.md +0 -24
  56. data/examples/shared/config.ru +0 -13
  57. data/examples/shared/publisher.rb +0 -49
  58. data/examples/shared/qwirk_persist.yml +0 -5
  59. data/examples/shared/shared_worker.rb +0 -16
  60. data/examples/simple/README +0 -53
  61. data/examples/simple/bar_worker.rb +0 -10
  62. data/examples/simple/baz_worker.rb +0 -10
  63. data/examples/simple/config.ru +0 -14
  64. data/examples/simple/publisher.rb +0 -49
  65. data/examples/simple/qwirk_persist.yml +0 -4
  66. data/examples/simple/tmp/kahadb/db-1.log +0 -0
  67. data/examples/simple/tmp/kahadb/db.data +0 -0
  68. data/examples/simple/tmp/kahadb/db.redo +0 -0
  69. data/examples/task/README +0 -47
  70. data/examples/task/config.ru +0 -14
  71. data/examples/task/foo_worker.rb +0 -10
  72. data/examples/task/messages.out +0 -1000
  73. data/examples/task/publisher.rb +0 -25
  74. data/examples/task/qwirk_persist.yml +0 -5
  75. data/examples/task/task.rb +0 -36
  76. data/lib/qwirk/queue_adapter.rb +0 -3
  77. data/lib/qwirk/queue_adapter/active_mq.rb +0 -13
  78. data/lib/qwirk/queue_adapter/active_mq/publisher.rb +0 -12
  79. data/lib/qwirk/queue_adapter/active_mq/worker_config.rb +0 -16
  80. data/lib/qwirk/queue_adapter/in_mem.rb +0 -7
  81. data/lib/qwirk/queue_adapter/in_mem/worker_config.rb +0 -59
  82. data/lib/qwirk/queue_adapter/jms.rb +0 -50
  83. data/lib/qwirk/queue_adapter/jms/connection.rb +0 -42
  84. data/lib/qwirk/queue_adapter/jms/consumer.rb +0 -37
  85. data/lib/qwirk/queue_adapter/jms/publisher.rb +0 -126
  86. data/lib/qwirk/queue_adapter/jms/worker.rb +0 -89
  87. data/lib/qwirk/queue_adapter/jms/worker_config.rb +0 -38
  88. data/lib/qwirk/version.rb +0 -3
  89. data/lib/qwirk/worker_config.rb +0 -187
data/examples/README DELETED
@@ -1 +0,0 @@
1
- Modify the qwirk.yml file to setup the proper credentials for you ActiveMQ server.
@@ -1,84 +0,0 @@
1
- <!--
2
- ActiveMQ Configuration where the Broker is in-vm
3
-
4
- Settings objectives:
5
- - Use available resources
6
- - No indefinite limiting of producers to prevent "hanging" of producers
7
- when consumers are slow
8
- - Use store based message flow so that slow consumers do not slow down producers
9
- -->
10
- <beans
11
- xmlns="http://www.springframework.org/schema/beans"
12
- xmlns:amq="http://activemq.apache.org/schema/core"
13
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
14
- xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
15
- http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core.xsd">
16
-
17
- <broker xmlns="http://activemq.apache.org/schema/core" brokerName="qwirk" dataDirectory="tmp" destroyApplicationContextOnStop="true">
18
-
19
- <!-- Set producerFlowControl limits -->
20
- <destinationPolicy>
21
- <policyMap>
22
- <policyEntries>
23
- <policyEntry topic=">" producerFlowControl="true" memoryLimit="1024mb" />
24
- <policyEntry queue=">" producerFlowControl="true" memoryLimit="1024mb" />
25
- </policyEntries>
26
- </policyMap>
27
- </destinationPolicy>
28
-
29
- <!-- Use the JMX context already created by the JVM -->
30
- <managementContext>
31
- <managementContext createConnector="false"/>
32
- </managementContext>
33
-
34
- <!--
35
- Configure message persistence for the broker. The default persistence
36
- mechanism is the KahaDB store (identified by the kahaDB tag).
37
- For more information, see:
38
-
39
- http://activemq.apache.org/persistence.html
40
- -->
41
- <persistenceAdapter>
42
- <kahaDB directory="tmp/kahadb"/>
43
- </persistenceAdapter>
44
-
45
- <plugins>
46
- <!-- Configure authentication of remote connections -->
47
- <simpleAuthenticationPlugin>
48
- <users>
49
- <authenticationUser username="qwirkadmin" password="qwirkadmin" groups="users,admins"/>
50
- <authenticationUser username="qwirk" password="qwirk" groups="users"/>
51
- </users>
52
- </simpleAuthenticationPlugin>
53
- </plugins>
54
-
55
- <!-- Limits for the broker before it slows down or fails producers.
56
- Cause producers to fail with javax.jms.ResourceAllocationException
57
- if no space is available after 3 seconds -->
58
- <systemUsage>
59
- <systemUsage sendFailIfNoSpaceAfterTimeout="3000">
60
- <!-- Memory limit for NON_PERSISTENT messages
61
- Apparently no longer used since ActiveMQ 5 now uses store
62
- based cursors for NON_PERSISTENT messages -->
63
- <memoryUsage>
64
- <memoryUsage limit="2 gb"/>
65
- </memoryUsage>
66
- <!-- Disk storage limit for PERSISTENT messages -->
67
- <storeUsage>
68
- <storeUsage limit="50 gb"/>
69
- </storeUsage>
70
- <!-- Disk storage limit for temporary (NON_PERSISTENT) messages -->
71
- <tempUsage>
72
- <tempUsage limit="50 gb"/>
73
- </tempUsage>
74
- </systemUsage>
75
- </systemUsage>
76
-
77
- <!-- Allow remote connections using openwire protocols -->
78
- <transportConnectors>
79
- <transportConnector name="openwire" uri="tcp://0.0.0.0:61616"/>
80
- </transportConnectors>
81
-
82
- </broker>
83
-
84
- </beans>
@@ -1,15 +0,0 @@
1
- # Step 0
2
- # Follow the directions for configuring jms.yml located in examples/README
3
-
4
- # Step 1
5
- # Start an ActiveMQ Server
6
-
7
- # Step 2
8
- # Start up the manager
9
- rackup -p 4567
10
-
11
- # Step 3
12
- jruby publish.rb foobar 4 2
13
-
14
- # Step 4
15
- # Play around with the options in qwirk_persist.yml and repeat steps 2&3.
@@ -1,18 +0,0 @@
1
- module BaseRequestWorker
2
- include Qwirk::RequestWorker
3
-
4
- config_accessor :sleep_time, :float, 'Number of seconds to sleep between messages', 0
5
-
6
- def self.included(base)
7
- Qwirk::Worker.included(base)
8
- end
9
-
10
- def perform(obj)
11
- puts "#{self}: Received #{obj} at #{Time.now}"
12
- if config.sleep_time > 0.0
13
- puts "#{self}: Sleeping for #{config.sleep_time} at #{Time.now}"
14
- sleep config.sleep_time
15
- end
16
- super
17
- end
18
- end
@@ -1,16 +0,0 @@
1
- class CharCountWorker
2
- include Qwirk::RequestWorker
3
-
4
- topic 'test_string', :response => {:marshal => :bson, :time_to_live => 5000}
5
- config_accessor :sleep_time, :float, 'Number of seconds to sleep between messages', 0
6
-
7
- def request(obj)
8
- if config.sleep_time > 0.0
9
- puts "#{self}: Sleeping for #{config.sleep_time} at #{Time.now}"
10
- sleep config.sleep_time
11
- end
12
- hash = Hash.new(0)
13
- obj.each_char {|c| hash[c] += 1}
14
- hash
15
- end
16
- end
@@ -1,24 +0,0 @@
1
- require '../setup'
2
- require './publisher'
3
- require './char_count_worker'
4
- require './exception_raiser_worker'
5
- require './length_worker'
6
- require './print_worker'
7
- require './reverse_worker'
8
- require './triple_worker'
9
-
10
- # If we're not starting up a standalone publisher, then start up a manager
11
- if ENV['RACK_ENV'] != 'publisher'
12
- manager = Qwirk[$adapter_key].create_manager(:name => 'Worker', :persist_file => 'qwirk_persist.yml')
13
- manager['CharCount'].max_count = 1
14
- manager['ExceptionRaiser'].max_count = 1
15
- manager['Length'].max_count = 1
16
- manager['Print'].max_count = 1
17
- manager['Reverse'].max_count = 1
18
- manager['Triple'].max_count = 1
19
- at_exit { manager.stop }
20
- end
21
- if ENV['RACK_ENV'] != 'worker'
22
- Rumx::Bean.root.bean_add_child(:Publisher, Publisher.new($adapter_key))
23
- end
24
- run Rumx::Server
@@ -1,17 +0,0 @@
1
- class ExceptionRaiserWorker
2
- include Qwirk::RequestWorker
3
-
4
- topic 'test_string', :response => {:marshal => :string, :time_to_live => 5000}
5
-
6
- config_accessor :raise_exception, :boolean, 'Raise an exception instead of handling the request', false
7
- config_accessor :sleep_time, :float, 'Number of seconds to sleep between messages', 0
8
-
9
- def request(obj)
10
- if config.sleep_time > 0.0
11
- puts "#{self}: Sleeping for #{config.sleep_time} at #{Time.now}"
12
- sleep config.sleep_time
13
- end
14
- raise "Raising dummy exception on #{obj}" if config.raise_exception
15
- "We decided not to raise on #{obj}"
16
- end
17
- end
@@ -1,14 +0,0 @@
1
- class LengthWorker
2
- include Qwirk::RequestWorker
3
-
4
- topic 'test_string', :response => {:marshal => :ruby, :time_to_live => 5000}
5
- config_accessor :sleep_time, :float, 'Number of seconds to sleep between messages', 0
6
-
7
- def request(obj)
8
- if config.sleep_time > 0.0
9
- puts "#{self}: Sleeping for #{config.sleep_time} at #{Time.now}"
10
- sleep config.sleep_time
11
- end
12
- obj.length
13
- end
14
- end
@@ -1,14 +0,0 @@
1
- class PrintWorker
2
- include Qwirk::Worker
3
-
4
- topic 'test_string'
5
- config_accessor :sleep_time, :float, 'Number of seconds to sleep between messages', 0
6
-
7
- def perform(obj)
8
- if config.sleep_time > 0.0
9
- puts "#{self}: Sleeping for #{config.sleep_time} at #{Time.now}"
10
- sleep config.sleep_time
11
- end
12
- puts "#{self}: Received #{obj} at #{Time.now}"
13
- end
14
- end
@@ -1,49 +0,0 @@
1
- require 'rumx'
2
- require 'qwirk'
3
-
4
- class Publisher
5
- include Rumx::Bean
6
-
7
- bean_attr_reader :messages, :hash, 'Message', :hash_type => :string, :allow_write => false
8
-
9
- bean_operation :publish, :void, 'Publish and receive messages', [
10
- [ :message, :string, 'Message to get sent', 'Hello' ],
11
- [ :timeout, :float, 'Timeout on receiving response', 4.0 ],
12
- [ :sleep_time, :float, "Time between publishing and receiving where we're supposedly working", 2.0 ]
13
- ]
14
-
15
- def initialize(adapter_key)
16
- @publisher = Qwirk[adapter_key].create_publisher(:topic_name => 'test_string', :response => true, :marshal => :string)
17
- end
18
-
19
- def publish(message, timeout, sleep_time)
20
- @messages = {}
21
- puts "Publishing at #{Time.now.to_f}"
22
- handle = @publisher.publish(message)
23
- sleep sleep_time
24
-
25
- handle.read_response(timeout) do |response|
26
- response.on_message 'CharCount' do |hash|
27
- messages['CharCount'] = "returned #{hash.inspect} in #{response.msec_delta.to_i} ms"
28
- end
29
- response.on_message 'Length', 'Reverse', 'Triple' do |val|
30
- messages[response.name] = "returned #{val} in #{response.msec_delta.to_i} ms"
31
- end
32
- response.on_message 'ExceptionRaiser' do |val|
33
- messages[response.name] = "didn't raise an exception, returned \"#{val}\" in #{response.msec_delta.to_i} ms"
34
- end
35
- response.on_timeout 'Reverse' do
36
- messages[response.name] = "Timed out with it's own timeout handler in #{response.msec_delta.to_i} ms"
37
- end
38
- response.on_timeout do
39
- messages[response.name] = "timed out in #{response.msec_delta.to_i} ms"
40
- end
41
- response.on_remote_exception 'ExceptionRaiser' do |e|
42
- messages[response.name] = "It figures that ExceptionRaiser would raise an exception: #{e.message} in #{response.msec_delta.to_i} ms"
43
- end
44
- response.on_remote_exception do |e|
45
- messages[response.name] = "raised exception: #{e.message} in #{response.msec_delta.to_i} ms"
46
- end
47
- end
48
- end
49
- end
@@ -1,16 +0,0 @@
1
- ---
2
- CharCount:
3
- :max_count: 1
4
- ExceptionRaiser:
5
- :max_count: 1
6
- :raise_exception: true
7
- Length:
8
- :max_count: 1
9
- :sleep_time: 5.0
10
- Print:
11
- :max_count: 1
12
- Reverse:
13
- :max_count: 1
14
- :sleep_time: 5.0
15
- Triple:
16
- :max_count: 1
@@ -1,14 +0,0 @@
1
- class ReverseWorker
2
- include Qwirk::RequestWorker
3
-
4
- topic 'test_string', :response => {:marshal => :string, :time_to_live => 5000}
5
- config_accessor :sleep_time, :float, 'Number of seconds to sleep between messages', 0
6
-
7
- def request(obj)
8
- if config.sleep_time > 0.0
9
- puts "#{self}: Sleeping for #{config.sleep_time} at #{Time.now}"
10
- sleep config.sleep_time
11
- end
12
- obj.reverse
13
- end
14
- end
@@ -1,14 +0,0 @@
1
- class TripleWorker
2
- include Qwirk::RequestWorker
3
-
4
- topic 'test_string', :response => {:marshal => :string, :time_to_live => 5000}
5
- config_accessor :sleep_time, :float, 'Number of seconds to sleep between messages', 0
6
-
7
- def request(obj)
8
- if config.sleep_time > 0.0
9
- puts "#{self}: Sleeping for #{config.sleep_time} at #{Time.now}"
10
- sleep config.sleep_time
11
- end
12
- obj * 3
13
- end
14
- end
@@ -1,30 +0,0 @@
1
- class MyBatchWorker
2
- include Qwirk::Batch::FileWorker
3
-
4
- file :glob => '/home/batch_files/**', :max_outstanding_requests => 100, :fail_threshold => 0.8, :save_period => 30.seconds
5
- marshal :bson
6
-
7
- def start_file(file, is_restart)
8
- @outfile = File.open(output_file_for(file), 'a')
9
- end
10
-
11
- def record_to_object(line)
12
- line_to_hash(line)
13
- end
14
-
15
- def process_response(hash)
16
- @outfile.puts(hash_to_line(hash))
17
- end
18
-
19
- def failed
20
- @outfile.close
21
- end
22
-
23
- def stop
24
- @outfile.close
25
- end
26
-
27
- def finish_file
28
- @outfile.close
29
- end
30
- end
@@ -1,8 +0,0 @@
1
- class MyLineWorker
2
- include Qwirk::Batch::RequestWorker
3
- response_marshal :string
4
-
5
- def request(line)
6
- line.reverse
7
- end
8
- end
data/examples/qwirk.yml DELETED
@@ -1,20 +0,0 @@
1
- in_mem:
2
- :adapter: InMem
3
- :log_times: true
4
-
5
- active_mq:
6
- :adapter: ActiveMQ
7
- :log_times: true
8
- :factory: org.apache.activemq.ActiveMQConnectionFactory
9
- :broker_url: tcp://localhost:61616
10
- #:username: myuser
11
- #:password: mypassword
12
-
13
- active_mq_invm:
14
- :adapter: ActiveMQ
15
- :log_times: true
16
- :factory: org.apache.activemq.ActiveMQConnectionFactory
17
- :broker_url: vm://qwirk?brokerConfig=xbean:../activemq.xml
18
- :object_message_serialization_defered: true
19
- :username: qwirk
20
- :password: qwirk
@@ -1,13 +0,0 @@
1
- # Step 0
2
- # Follow the directions for configuring jms.yml located in examples/README
3
-
4
- # Step 1
5
- # Start an ActiveMQ Server
6
-
7
- # Step 2
8
- # Start up the manager
9
- rackup -p 4567
10
-
11
- # Step 3
12
- # Request 'my string' get reversed
13
- jruby request.rb 'my string'
@@ -1,13 +0,0 @@
1
- require '../setup'
2
- require './reverse_echo_worker'
3
- require './requestor'
4
-
5
- # If we're not starting up a standalone publisher, then start up a manager
6
- if ENV['RACK_ENV'] != 'publisher'
7
- manager = Qwirk[$adapter_key].create_manager(:name => 'Worker', :persist_file => 'qwirk_persist.yml')
8
- at_exit { manager.stop }
9
- end
10
- if ENV['RACK_ENV'] != 'worker'
11
- Rumx::Bean.root.bean_add_child(:Requestor, Requestor.new($adapter_key))
12
- end
13
- run Rumx::Server
@@ -1,5 +0,0 @@
1
- ---
2
- ReverseEcho:
3
- :min_count: 1
4
- :max_count: 1
5
- ...
@@ -1,68 +0,0 @@
1
- require 'rumx'
2
- require 'qwirk'
3
-
4
- class MessageInfo
5
- include Rumx::Bean
6
-
7
- bean_attr_reader :request, :string, 'The message that was sent'
8
- bean_attr_reader :response, :string, 'The response that was received'
9
-
10
- def initialize(request, response)
11
- @request, @response = request, response
12
- end
13
- end
14
-
15
- class Requestor
16
- include Rumx::Bean
17
-
18
- bean_reader :messages, :list, 'Messages', :list_type => :bean
19
-
20
- bean_operation :publish, :void, 'Publish and receive messages', [
21
- [ :message, :string, 'Message to get sent', 'Hello' ],
22
- [ :timeout, :float, 'Timeout on receiving response', 4.0 ],
23
- [ :sleep_time, :float, "Time between publishing and receiving where we're supposedly working", 2.0 ],
24
- [ :thread_count, :integer, 'Number of different threads that are publishing and receiving the message', 10 ]
25
- ]
26
-
27
-
28
- def initialize(adapter_key)
29
- @outstanding_hash_mutex = Mutex.new
30
- @messages = []
31
- @publisher = Qwirk[adapter_key].create_publisher(:queue_name => 'ReverseEcho', :response => {:time_to_live => 10000}, :marshal => :string)
32
- end
33
-
34
- def publish(message, timeout, sleep_time, thread_count)
35
- @outstanding_hash_mutex.synchronize do
36
- @messages = []
37
- end
38
- threads = []
39
- (0...thread_count).each do |i|
40
- threads << Thread.new(i) do |i|
41
- puts "#{i}: Publishing at #{Time.now.to_f}"
42
- request = "##{i}: #{message}"
43
- response = nil
44
- begin
45
- handle = @publisher.publish(request)
46
- # Here's where we'd go off and do other work
47
- sleep sleep_time
48
- puts "#{i}: Finished sleeping at #{Time.now.to_f}"
49
- response = handle.read_response(timeout)
50
- puts "#{i}: Received at #{Time.now.to_f}: #{response}"
51
- rescue Exception => e
52
- puts "#{i}: Exception: #{e.message}\n\t#{e.backtrace.join("\n\t")}"
53
- response = e.message
54
- end
55
- @outstanding_hash_mutex.synchronize do
56
- @messages << MessageInfo.new(request, response)
57
- end
58
- end
59
- end
60
- threads.each {|t| t.join}
61
- end
62
-
63
- def messages
64
- @outstanding_hash_mutex.synchronize do
65
- return @messages.dup
66
- end
67
- end
68
- end