kb-redstorm 0.6.5 → 0.6.6

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 (41) hide show
  1. data/CHANGELOG.md +9 -0
  2. data/README.md +206 -103
  3. data/examples/native/cluster_word_count_topology.rb +5 -5
  4. data/examples/native/local_exclamation_topology.rb +8 -8
  5. data/examples/native/local_exclamation_topology2.rb +7 -7
  6. data/examples/native/local_redis_word_count_topology.rb +7 -8
  7. data/examples/native/local_word_count_topology.rb +5 -5
  8. data/examples/simple/exclamation_topology.rb +7 -11
  9. data/examples/simple/exclamation_topology2.rb +10 -12
  10. data/examples/simple/hello_world_topology.rb +22 -0
  11. data/examples/simple/kafka_topology.rb +15 -15
  12. data/examples/simple/redis_word_count_topology.rb +3 -5
  13. data/examples/simple/ruby_version_topology.rb +7 -1
  14. data/examples/simple/word_count_topology.rb +8 -10
  15. data/ivy/settings.xml +1 -0
  16. data/ivy/storm_dependencies.xml +8 -0
  17. data/ivy/topology_dependencies.xml +7 -0
  18. data/lib/red_storm/application.rb +7 -5
  19. data/lib/red_storm/configurator.rb +1 -1
  20. data/lib/red_storm/proxy/batch_bolt.rb +63 -0
  21. data/lib/red_storm/proxy/batch_committer_bolt.rb +52 -0
  22. data/lib/red_storm/proxy/batch_spout.rb +12 -24
  23. data/lib/red_storm/proxy/proxy_function.rb +1 -9
  24. data/lib/red_storm/proxy/transactional_committer_spout.rb +47 -0
  25. data/lib/red_storm/proxy/transactional_spout.rb +46 -0
  26. data/lib/red_storm/simple_drpc_topology.rb +2 -2
  27. data/lib/red_storm/simple_topology.rb +14 -4
  28. data/lib/red_storm/topology_launcher.rb +16 -0
  29. data/lib/red_storm/version.rb +1 -1
  30. data/lib/tasks/red_storm.rake +69 -108
  31. data/redstorm.gemspec +24 -0
  32. data/src/main/redstorm/storm/jruby/JRubyBatchBolt.java +90 -0
  33. data/src/main/redstorm/storm/jruby/JRubyBatchCommitterBolt.java +9 -0
  34. data/src/main/redstorm/storm/jruby/JRubyBatchSpout.java +25 -26
  35. data/src/main/redstorm/storm/jruby/JRubyProxyFunction.java +1 -9
  36. data/src/main/redstorm/storm/jruby/JRubyTransactionalBolt.java +90 -0
  37. data/src/main/redstorm/storm/jruby/JRubyTransactionalCommitterBolt.java +31 -0
  38. data/src/main/redstorm/storm/jruby/JRubyTransactionalCommitterSpout.java +44 -0
  39. data/src/main/redstorm/storm/jruby/JRubyTransactionalSpout.java +89 -0
  40. metadata +80 -62
  41. data/examples/native/Gemfile +0 -2
@@ -1,36 +1,32 @@
1
1
  java_import 'backtype.storm.testing.TestWordSpout'
2
2
 
3
+ require 'red_storm'
3
4
  require 'examples/simple/exclamation_bolt'
4
5
 
5
6
  # this example topology uses the Storm TestWordSpout and our own JRuby ExclamationBolt
6
7
 
7
8
  module RedStorm
8
9
  module Examples
9
- class ExclamationTopology < RedStorm::SimpleTopology
10
- spout TestWordSpout, :parallelism => 5 do
10
+ class ExclamationTopology < SimpleTopology
11
+ spout TestWordSpout, :parallelism => 2 do
11
12
  debug true
12
13
  end
13
14
 
14
15
  bolt ExclamationBolt, :parallelism => 2 do
15
16
  source TestWordSpout, :shuffle
16
- # max_task_parallelism 1
17
17
  end
18
18
 
19
19
  bolt ExclamationBolt, :id => :ExclamationBolt2, :parallelism => 2 do
20
20
  source ExclamationBolt, :shuffle
21
- # max_task_parallelism 1
22
21
  debug true
23
22
  end
24
23
 
25
24
  configure do |env|
26
25
  debug false
27
- set "topology.worker.childopts", "-Djruby.compat.version=RUBY1_9"
28
- case env
29
- when :local
30
- max_task_parallelism 40
31
- when :cluster
32
- num_workers 20
33
- max_spout_pending(1000);
26
+ max_task_parallelism 4
27
+ if env == :cluster
28
+ num_workers 4
29
+ max_spout_pending(1000)
34
30
  end
35
31
  end
36
32
 
@@ -1,9 +1,10 @@
1
- java_import 'backtype.storm.testing.TestWordSpout'
2
- require 'red_storm'
3
-
4
1
  # this example topology uses the Storm TestWordSpout and our own JRuby ExclamationBolt
5
2
  # and a locally defined ExclamationBolt
6
3
 
4
+ java_import 'backtype.storm.testing.TestWordSpout'
5
+
6
+ require 'red_storm'
7
+
7
8
  module RedStorm
8
9
  module Examples
9
10
  class ExclamationBolt < RedStorm::SimpleBolt
@@ -12,9 +13,9 @@ module RedStorm
12
13
  end
13
14
 
14
15
  class ExclamationTopology2 < RedStorm::SimpleTopology
15
- spout TestWordSpout, :parallelism => 10
16
+ spout TestWordSpout, :parallelism => 2
16
17
 
17
- bolt ExclamationBolt, :parallelism => 3 do
18
+ bolt ExclamationBolt, :parallelism => 2 do
18
19
  source TestWordSpout, :shuffle
19
20
  end
20
21
 
@@ -24,13 +25,10 @@ module RedStorm
24
25
 
25
26
  configure do |env|
26
27
  debug true
27
- set "topology.worker.childopts", "-Djruby.compat.version=RUBY1_9"
28
- case env
29
- when :local
30
- max_task_parallelism 3
31
- when :cluster
32
- num_workers 20
33
- max_spout_pending(1000);
28
+ max_task_parallelism 4
29
+ if env == :cluster
30
+ num_workers 4
31
+ max_spout_pending(1000)
34
32
  end
35
33
  end
36
34
 
@@ -0,0 +1,22 @@
1
+ require 'red_storm'
2
+
3
+ class HelloWorldSpout < RedStorm::SimpleSpout
4
+ on_init {@words = ["hello", "world"]}
5
+ on_send {@words.shift unless @words.empty?}
6
+ end
7
+
8
+ class HelloWorldBolt < RedStorm::SimpleBolt
9
+ on_receive :emit => false do |tuple|
10
+ log.info(tuple.getString(0))
11
+ end
12
+ end
13
+
14
+ class HelloWorldTopology < RedStorm::SimpleTopology
15
+ spout HelloWorldSpout do
16
+ output_fields :word
17
+ end
18
+
19
+ bolt HelloWorldBolt do
20
+ source HelloWorldSpout, :global
21
+ end
22
+ end
@@ -1,26 +1,26 @@
1
- require 'red_storm'
2
1
  java_import 'storm.kafka.KafkaConfig'
3
2
  java_import 'storm.kafka.SpoutConfig'
4
3
  java_import 'storm.kafka.StringScheme'
5
4
  java_import 'storm.kafka.KafkaSpout'
6
5
 
6
+ require 'red_storm'
7
+
7
8
  # the KafkaTopology obviously requires a Kafka server running, you can ajust the
8
- # host and port below.
9
+ # host and port below.
9
10
  #
10
11
  # custom dependencies are required for the Kafka and Scala jars. put the following
11
- # dependencies in the "Dependencies" file in the root of your RedStorm project:
12
+ # dependencies in the "ivy/topology_dependencies.xml" file in the root of your RedStorm project:
12
13
  #
13
- # {
14
- # :storm_artifacts => [
15
- # "storm:storm:0.8.1, transitive=true",
16
- # ],
17
- # :topology_artifacts => [
18
- # "org.jruby:jruby-complete:1.6.8, transitive=false",
19
- # "org.scala-lang:scala-library:2.8.0, transitive=false",
20
- # "storm:kafka:0.7.0-incubating, transitive=false",
21
- # "storm:storm-kafka:0.8.0-wip4, transitive=false",
22
- # ],
23
- # }
14
+ # <?xml version="1.0"?>
15
+ # <ivy-module version="2.0">
16
+ # <info organisation="redstorm" module="topology-deps"/>
17
+ # <dependencies>
18
+ # <dependency org="org.jruby" name="jruby-core" rev="1.7.3" conf="default" transitive="true"/>
19
+ # <dependency org="org.scala-lang" name="scala-library" rev="2.8.0" conf="default" transitive="false"/>
20
+ # <dependency org="storm" name="kafka" rev="0.7.0-incubating" conf="default" transitive="false"/>
21
+ # <dependency org="storm" name="storm-kafka" rev="0.8.0-wip4" conf="default" transitive="false"/>
22
+ # </dependencies>
23
+ # </ivy-module>
24
24
 
25
25
  class KafkaTopology < RedStorm::SimpleTopology
26
26
  spout_config = SpoutConfig.new(
@@ -36,7 +36,7 @@ class KafkaTopology < RedStorm::SimpleTopology
36
36
  end
37
37
 
38
38
  spout KafkaSpout, [spout_config]
39
-
39
+
40
40
  bolt SplitStringBolt do
41
41
  output_fields :word
42
42
  source KafkaSpout, :shuffle
@@ -1,9 +1,7 @@
1
- require 'rubygems'
2
1
  require 'red_storm'
3
-
2
+ require 'examples/simple/word_count_bolt'
4
3
  require 'redis'
5
4
  require 'thread'
6
- require 'examples/simple/word_count_bolt'
7
5
 
8
6
  module RedStorm
9
7
  module Examples
@@ -46,14 +44,14 @@ module RedStorm
46
44
 
47
45
  configure do |env|
48
46
  debug true
49
- set "topology.worker.childopts", "-Djruby.compat.version=RUBY1_9"
47
+ # set "topology.worker.childopts", "-Djruby.compat.version=RUBY1_9"
50
48
  case env
51
49
  when :local
52
50
  max_task_parallelism 3
53
51
  when :cluster
54
52
  max_task_parallelism 5
55
53
  num_workers 20
56
- max_spout_pending(1000);
54
+ max_spout_pending(1000)
57
55
  end
58
56
  end
59
57
  end
@@ -6,7 +6,13 @@ module RedStorm
6
6
  module Examples
7
7
  class VersionSpout < RedStorm::SimpleSpout
8
8
  output_fields :dummy
9
- on_init {log.info("***************** RUBY_VERSION=#{RUBY_VERSION}")}
9
+ on_init do
10
+ log.info("***************** RUBY_VERSION=#{RUBY_VERSION}")
11
+ log.info("***************** JRUBY_VERSION=#{JRUBY_VERSION}")
12
+ log.info("***************** VERSION=#{VERSION}")
13
+ log.info("***************** RUBY_ENGINE=#{RUBY_ENGINE}")
14
+ log.info("***************** RUBY_PLATFORM=#{RUBY_PLATFORM}")
15
+ end
10
16
  on_send {}
11
17
  end
12
18
 
@@ -1,3 +1,4 @@
1
+ require 'red_storm'
1
2
  require 'examples/simple/random_sentence_spout'
2
3
  require 'examples/simple/split_sentence_bolt'
3
4
  require 'examples/simple/word_count_bolt'
@@ -5,25 +6,22 @@ require 'examples/simple/word_count_bolt'
5
6
  module RedStorm
6
7
  module Examples
7
8
  class WordCountTopology < SimpleTopology
8
- spout RandomSentenceSpout, :parallelism => 5
9
+ spout RandomSentenceSpout, :parallelism => 2
9
10
 
10
- bolt SplitSentenceBolt, :parallelism => 8 do
11
+ bolt SplitSentenceBolt, :parallelism => 2 do
11
12
  source RandomSentenceSpout, :shuffle
12
13
  end
13
14
 
14
- bolt WordCountBolt, :parallelism => 12 do
15
+ bolt WordCountBolt, :parallelism => 2 do
15
16
  source SplitSentenceBolt, :fields => ["word"]
16
17
  end
17
18
 
18
19
  configure :word_count do |env|
19
20
  debug true
20
- set "topology.worker.childopts", "-Djruby.compat.version=RUBY1_9"
21
- case env
22
- when :local
23
- max_task_parallelism 3
24
- when :cluster
25
- num_workers 20
26
- max_spout_pending(1000);
21
+ max_task_parallelism 4
22
+ if env == :cluster
23
+ num_workers 6
24
+ max_spout_pending(1000)
27
25
  end
28
26
  end
29
27
 
data/ivy/settings.xml CHANGED
@@ -1,3 +1,4 @@
1
+ <?xml version="1.0"?>
1
2
  <ivysettings>
2
3
  <settings defaultResolver="repositories"/>
3
4
  <resolvers>
@@ -0,0 +1,8 @@
1
+ <?xml version="1.0"?>
2
+ <ivy-module version="2.0">
3
+ <info organisation="redstorm" module="storm-deps"/>
4
+ <dependencies>
5
+ <dependency org="storm" name="storm" rev="0.8.2" conf="default" transitive="true" />
6
+ <override org="org.slf4j" module="slf4j-log4j12" rev="1.6.3"/>
7
+ </dependencies>
8
+ </ivy-module>
@@ -0,0 +1,7 @@
1
+ <?xml version="1.0"?>
2
+ <ivy-module version="2.0">
3
+ <info organisation="redstorm" module="topology-deps"/>
4
+ <dependencies>
5
+ <dependency org="org.jruby" name="jruby-core" rev="1.7.3" conf="default" transitive="true"/>
6
+ </dependencies>
7
+ </ivy-module>
@@ -20,15 +20,17 @@ DST_EXAMPLES = "#{CWD}/examples"
20
20
 
21
21
  SRC_IVY_DIR = "#{RedStorm::REDSTORM_HOME}/ivy"
22
22
  DST_IVY_DIR = "#{CWD}/ivy"
23
- CUSTOM_DEPENDENCIES = "#{CWD}/Dependencies"
24
23
  DEFAULT_IVY_SETTINGS = "#{SRC_IVY_DIR}/settings.xml"
25
24
  CUSTOM_IVY_SETTINGS = "#{DST_IVY_DIR}/settings.xml"
26
-
25
+ DEFAULT_IVY_STORM_DEPENDENCIES = "#{SRC_IVY_DIR}/storm_dependencies.xml"
26
+ CUSTOM_IVY_STORM_DEPENDENCIES = "#{DST_IVY_DIR}/storm_dependencies.xml"
27
+ DEFAULT_IVY_TOPOLOGY_DEPENDENCIES = "#{SRC_IVY_DIR}/topology_dependencies.xml"
28
+ CUSTOM_IVY_TOPOLOGY_DEPENDENCIES = "#{DST_IVY_DIR}/topology_dependencies.xml"
27
29
 
28
30
  module RedStorm
29
31
 
30
- class Application
31
- TASKS_FILE = "#{RedStorm::REDSTORM_HOME}/lib/tasks/red_storm.rake"
32
+ class Application
33
+ TASKS_FILE = "#{RedStorm::REDSTORM_HOME}/lib/tasks/red_storm.rake"
32
34
 
33
35
  def self.local_storm_command(class_file, ruby_mode = nil)
34
36
  src_dir = File.expand_path(File.dirname(class_file))
@@ -76,7 +78,7 @@ module RedStorm
76
78
  end
77
79
 
78
80
  def self.subshell(command)
79
- out = IO.popen(command, {:err => [:child, :out]}) {|io| io.read}
81
+ out = IO.popen(command, STDERR => STDOUT) {|io| io.read}
80
82
  [!!$?.success?, out]
81
83
  end
82
84
 
@@ -20,7 +20,7 @@ module RedStorm
20
20
  private
21
21
 
22
22
  def self.camel_case(s)
23
- s.to_s.gsub(/\/(.?)/) { "::#{$1.upcase}" }.gsub(/(?:^|_)(.)/) { $1.upcase }
23
+ s.to_s.gsub(/\/(.?)/) { "::#{$1.upcase}" }.gsub(/(?:^|_|\.)(.)/) { $1.upcase }
24
24
  end
25
25
  end
26
26
  end
@@ -0,0 +1,63 @@
1
+ require 'java'
2
+
3
+ java_import 'backtype.storm.coordination.BatchOutputCollector'
4
+ java_import 'backtype.storm.task.TopologyContext'
5
+ java_import 'backtype.storm.topology.IRichBolt'
6
+ java_import 'backtype.storm.coordination.IBatchBolt'
7
+ java_import 'backtype.storm.topology.OutputFieldsDeclarer'
8
+ java_import 'backtype.storm.tuple.Tuple'
9
+ java_import 'java.util.Map'
10
+
11
+ module Backtype
12
+ java_import 'backtype.storm.Config'
13
+ end
14
+
15
+ java_package 'redstorm.proxy'
16
+
17
+ # the Bolt class is a proxy to the real bolt to avoid having to deal with all the
18
+ # Java artifacts when creating a bolt.
19
+ #
20
+ # The real bolt class implementation must define these methods:
21
+ # - prepare(conf, context, collector)
22
+ # - execute(tuple)
23
+ # - declare_output_fields
24
+ #
25
+ # and optionnaly:
26
+ # - cleanup
27
+ #
28
+ class BatchBolt
29
+ java_implements IBatchBolt
30
+
31
+ java_signature 'IBatchBolt (String base_class_path, String real_bolt_class_name)'
32
+ def initialize(base_class_path, real_bolt_class_name)
33
+ @real_bolt = Object.module_eval(real_bolt_class_name).new
34
+ rescue NameError
35
+ require base_class_path
36
+ @real_bolt = Object.module_eval(real_bolt_class_name).new
37
+ end
38
+
39
+ java_signature 'void prepare(Map, TopologyContext, BatchOutputCollector, Object)'
40
+ def prepare(conf, context, collector, id)
41
+ @real_bolt.prepare(conf, context, collector, id)
42
+ end
43
+
44
+ java_signature 'void execute(Tuple)'
45
+ def execute(tuple)
46
+ @real_bolt.execute(tuple)
47
+ end
48
+
49
+ java_signature 'void finishBatch()'
50
+ def finishBatch
51
+ @real_bolt.finish_batch if @real_bolt.respond_to?(:finish_batch)
52
+ end
53
+
54
+ java_signature 'void declareOutputFields(OutputFieldsDeclarer)'
55
+ def declareOutputFields(declarer)
56
+ @real_bolt.declare_output_fields(declarer)
57
+ end
58
+
59
+ java_signature 'Map<String, Object> getComponentConfiguration()'
60
+ def getComponentConfiguration
61
+ @real_bolt.get_component_configuration
62
+ end
63
+ end
@@ -0,0 +1,52 @@
1
+ require 'java'
2
+
3
+ java_import 'backtype.storm.coordination.BatchOutputCollector'
4
+ java_import 'backtype.storm.task.TopologyContext'
5
+ java_import 'backtype.storm.coordination.IBatchBolt'
6
+ java_import 'backtype.storm.transactional.ICommitter'
7
+ java_import 'backtype.storm.topology.OutputFieldsDeclarer'
8
+ java_import 'backtype.storm.tuple.Tuple'
9
+ java_import 'java.util.Map'
10
+
11
+ module Backtype
12
+ java_import 'backtype.storm.Config'
13
+ end
14
+
15
+ java_package 'redstorm.proxy'
16
+
17
+ class BatchCommitterBolt
18
+ java_implements 'ICommitter, IBatchBolt'
19
+
20
+ java_signature 'IBatchCommitterBolt (String base_class_path, String real_bolt_class_name)'
21
+ def initialize(base_class_path, real_bolt_class_name)
22
+ @real_bolt = Object.module_eval(real_bolt_class_name).new
23
+ rescue NameError
24
+ require base_class_path
25
+ @real_bolt = Object.module_eval(real_bolt_class_name).new
26
+ end
27
+
28
+ java_signature 'void prepare(Map, TopologyContext, BatchOutputCollector, Object)'
29
+ def prepare(conf, context, collector, id)
30
+ @real_bolt.prepare(conf, context, collector, id)
31
+ end
32
+
33
+ java_signature 'void execute(Tuple)'
34
+ def execute(tuple)
35
+ @real_bolt.execute(tuple)
36
+ end
37
+
38
+ java_signature 'void finishBatch()'
39
+ def finishBatch
40
+ @real_bolt.finish_batch if @real_bolt.respond_to?(:finish_batch)
41
+ end
42
+
43
+ java_signature 'void declareOutputFields(OutputFieldsDeclarer)'
44
+ def declareOutputFields(declarer)
45
+ @real_bolt.declare_output_fields(declarer)
46
+ end
47
+
48
+ java_signature 'Map<String, Object> getComponentConfiguration()'
49
+ def getComponentConfiguration
50
+ @real_bolt.get_component_configuration
51
+ end
52
+ end
@@ -1,31 +1,19 @@
1
1
  require 'java'
2
2
 
3
- java_import 'storm.trident.operation.TridentCollector'
4
3
  java_import 'backtype.storm.task.TopologyContext'
4
+ java_import 'storm.trident.operation.TridentCollector'
5
5
  java_import 'storm.trident.spout.IBatchSpout'
6
- java_import 'backtype.storm.topology.OutputFieldsDeclarer'
7
- java_import 'backtype.storm.tuple.Tuple'
8
6
  java_import 'backtype.storm.tuple.Fields'
9
- java_import 'backtype.storm.tuple.Values'
10
7
  java_import 'java.util.Map'
8
+
11
9
  module Backtype
12
10
  java_import 'backtype.storm.Config'
13
11
  end
14
12
 
15
13
  java_package 'redstorm.proxy'
16
14
 
17
- # the BatchSpout class is a proxy to the real batch spout to avoid having to deal with all the
15
+ # the Spout class is a proxy to the real spout to avoid having to deal with all the
18
16
  # Java artifacts when creating a spout.
19
- #
20
- # The real batch spout class implementation must define these methods:
21
- # - open(conf, context, collector)
22
- # - emitBatch
23
- # - getOutputFields
24
- # - ack(batch_id)
25
- #
26
- # and optionnaly:
27
- # - close
28
- #
29
17
 
30
18
  class BatchSpout
31
19
  java_implements IBatchSpout
@@ -40,7 +28,12 @@ class BatchSpout
40
28
 
41
29
  java_signature 'void open(Map, TopologyContext)'
42
30
  def open(conf, context)
43
- @real_spout.open(conf, context)
31
+ @real_spout.open(conf, context) if @real_spout.respond_to?(:open)
32
+ end
33
+
34
+ java_signature 'void emitBatch(long, TridentCollector)'
35
+ def emitBatch(batch_id, collector)
36
+ @real_spout.emit_batch(batch_id, collector)
44
37
  end
45
38
 
46
39
  java_signature 'void close()'
@@ -48,19 +41,14 @@ class BatchSpout
48
41
  @real_spout.close if @real_spout.respond_to?(:close)
49
42
  end
50
43
 
51
- java_signature 'void emitBatch(long, TridentCollector)'
52
- def emitBatch(batch_id, collector)
53
- @real_spout.emit_batch(batch_id, collector)
54
- end
55
-
56
44
  java_signature 'void ack(long)'
57
45
  def ack(batch_id)
58
- @real_spout.ack(batch_id)
46
+ @real_spout.ack(batch_id) if @real_spout.respond_to?(:ack)
59
47
  end
60
48
 
61
49
  java_signature 'Fields getOutputFields()'
62
- def getOutputFields
63
- @real_spout.get_output_fields()
50
+ def getOutputFields()
51
+ @real_spout.get_output_fields
64
52
  end
65
53
 
66
54
  java_signature 'Map<String, Object> getComponentConfiguration()'
@@ -1,16 +1,10 @@
1
1
  require 'java'
2
2
 
3
-
4
3
  java_import 'storm.trident.tuple.TridentTuple'
5
-
6
4
  java_import 'storm.trident.operation.TridentCollector'
7
-
8
- java_import 'java.util.Map'
9
-
10
5
  java_import 'storm.trident.operation.TridentOperationContext'
11
-
12
6
  java_import 'storm.trident.operation.Function'
13
-
7
+ java_import 'java.util.Map'
14
8
 
15
9
  module Backtype
16
10
  java_import 'backtype.storm.Config'
@@ -43,6 +37,4 @@ class ProxyFunction
43
37
  def prepare(_map, _trident_operation_context)
44
38
  @real.prepare(_map, _trident_operation_context)
45
39
  end
46
-
47
-
48
40
  end
@@ -0,0 +1,47 @@
1
+ require 'java'
2
+
3
+ java_import 'backtype.storm.task.TopologyContext'
4
+ java_import 'backtype.storm.transactional.ITransactionalSpout'
5
+ java_import 'backtype.storm.transactional.ICommitterTransactionalSpout'
6
+ java_import 'backtype.storm.topology.OutputFieldsDeclarer'
7
+ java_import 'java.util.Map'
8
+
9
+ module Backtype
10
+ java_import 'backtype.storm.Config'
11
+ end
12
+
13
+ java_package 'redstorm.proxy'
14
+
15
+
16
+ class TransactionalCommitterSpout
17
+ java_implements 'ICommitterTransactionalSpout'
18
+
19
+ java_signature 'ICommitterTransactionalSpout (String base_class_path, String real_spout_class_name)'
20
+ def initialize(base_class_path, real_spout_class_name)
21
+ @real_spout = Object.module_eval(real_spout_class_name).new
22
+ rescue NameError
23
+ require base_class_path
24
+ @real_spout = Object.module_eval(real_spout_class_name).new
25
+ end
26
+
27
+ java_signature 'ICommitterTransactionalSpout.Emitter getEmitter(Map, TopologyContext)'
28
+ def getEmitter(conf, context)
29
+ @real_spout.get_emitter(conf, context)
30
+ end
31
+
32
+ java_signature 'ITransactionalSpout.Coordinator getCoordinator(Map, TopologyContext)'
33
+ def getCoordinator(conf, context)
34
+ @real_spout.get_coordinator(conf, context)
35
+ end
36
+
37
+ java_signature 'void declareOutputFields(OutputFieldsDeclarer)'
38
+ def declareOutputFields(declarer)
39
+ @real_spout.declare_output_fields(declarer)
40
+ end
41
+
42
+ java_signature 'Map<String, Object> getComponentConfiguration()'
43
+ def getComponentConfiguration
44
+ @real_spout.get_component_configuration
45
+ end
46
+
47
+ end
@@ -0,0 +1,46 @@
1
+ require 'java'
2
+
3
+ java_import 'backtype.storm.task.TopologyContext'
4
+ java_import 'backtype.storm.transactional.ITransactionalSpout'
5
+ java_import 'backtype.storm.topology.OutputFieldsDeclarer'
6
+ java_import 'java.util.Map'
7
+
8
+ module Backtype
9
+ java_import 'backtype.storm.Config'
10
+ end
11
+
12
+ java_package 'redstorm.proxy'
13
+
14
+
15
+ class TransactionalSpout
16
+ java_implements 'ITransactionalSpout'
17
+
18
+ java_signature 'ITransactionalSpout (String base_class_path, String real_spout_class_name)'
19
+ def initialize(base_class_path, real_spout_class_name)
20
+ @real_spout = Object.module_eval(real_spout_class_name).new
21
+ rescue NameError
22
+ require base_class_path
23
+ @real_spout = Object.module_eval(real_spout_class_name).new
24
+ end
25
+
26
+ java_signature 'ITransactionalSpout.Emitter getEmitter(Map, TopologyContext)'
27
+ def getEmitter(conf, context)
28
+ @real_spout.get_emitter(conf, context)
29
+ end
30
+
31
+ java_signature 'ITransactionalSpout.Coordinator getCoordinator(Map, TopologyContext)'
32
+ def getCoordinator(conf, context)
33
+ @real_spout.get_coordinator(conf, context)
34
+ end
35
+
36
+ java_signature 'void declareOutputFields(OutputFieldsDeclarer)'
37
+ def declareOutputFields(declarer)
38
+ @real_spout.declare_output_fields(declarer)
39
+ end
40
+
41
+ java_signature 'Map<String, Object> getComponentConfiguration()'
42
+ def getComponentConfiguration
43
+ @real_spout.get_component_configuration
44
+ end
45
+
46
+ end
@@ -13,11 +13,10 @@ module RedStorm
13
13
  end
14
14
 
15
15
  def grouping(grouping)
16
- @grouping = @grouping
16
+ @grouping = grouping
17
17
  end
18
18
 
19
19
  def define_grouping(declarer)
20
-
21
20
  case @grouping
22
21
  when :fields
23
22
  declarer.fieldsGrouping(Fields.new(*([params].flatten.map(&:to_s))))
@@ -73,6 +72,7 @@ module RedStorm
73
72
  end
74
73
 
75
74
  def self.input_bolt(bolt_class, *args, &bolt_block)
75
+ set_topology_class!
76
76
  options = args.last.is_a?(Hash) ? args.pop : {}
77
77
  contructor_args = !args.empty? ? args.pop : []
78
78
  bolt_options = {:id => self.underscore(bolt_class), :parallelism => DEFAULT_BOLT_PARALLELISM}.merge(options)