first pass adding java kafka provider

This commit is contained in:
jway 2014-10-03 11:56:14 -07:00
parent f1ef2772e2
commit b898709042
8 changed files with 131 additions and 11 deletions

1
.gitignore vendored
View File

@ -7,3 +7,4 @@ ext/mkmf.log
ext/Makefile
pkg/
tmp/
*.jar

View File

@ -1,20 +1,28 @@
PATH
remote: .
specs:
hermann (0.16.0)
hermann (0.17.0)
concurrent-ruby
mini_portile (~> 0.6.0)
GEM
remote: https://rubygems.org/
specs:
coderay (1.1.0)
concurrent-ruby (0.7.0)
diff-lcs (1.2.5)
ffi (1.9.5-java)
method_source (0.8.2)
mini_portile (0.6.0)
pry (0.9.12.6)
coderay (~> 1.0)
method_source (~> 0.8)
slop (~> 3.4)
pry (0.9.12.6-java)
coderay (~> 1.0)
method_source (~> 0.8)
slop (~> 3.4)
spoon (~> 0.0)
rake (10.3.2)
rake-compiler (0.9.3)
rake
@ -34,9 +42,12 @@ GEM
rspec-support (~> 3.0.0)
rspec-support (3.0.4)
slop (3.5.0)
spoon (0.0.4)
ffi
system_timer (1.2.4)
PLATFORMS
java
ruby
DEPENDENCIES

View File

@ -18,12 +18,26 @@ SPEC = Gem::Specification.new do |s|
s.files += `git ls-files -- lib`.split($\)
s.files += `git ls-files -- ext`.split($\)
s.extensions = Dir['ext/**/extconf.rb']
s.require_paths = ["lib", "ext/hermann"]
s.rubygems_version = '2.2.2'
s.add_dependency('mini_portile', '~> 0.6.0')
s.specification_version = 3 if s.respond_to?(:specification_version)
s.add_dependency 'concurrent-ruby'
if RUBY_PLATFORM == "java"
s.add_runtime_dependency 'jar-dependencies', '~>0.1.2'
s.add_development_dependency 'ruby-maven', '~> 3.1.1.0'
s.add_development_dependency 'rake'
s.requirements << "jar org.apache.kafka:kafka_2.10, 0.8.1.1"
s.requirements << "jar org.mod4j.org.eclipse.xtext:log4j, 1.2.15"
s.requirements << "jar org.scala-lang:scala-library, 2.10.1"
s.requirements << "jar com.yammer.metrics:metrics-core, 2.2.0"
s.requirements << "jar org.slf4j:slf4j-api, 1.7.2"
s.requirements << "jar com.101tec:zkclient, 0.3"
s.require_paths = ["lib"]
else
s.add_dependency('mini_portile', '~> 0.6.0')
s.extensions = Dir['ext/**/extconf.rb']
s.require_paths = ["lib", "ext/hermann"]
end
end

View File

@ -1,6 +1,12 @@
require 'hermann'
require 'hermann/result'
require 'hermann_lib'
if RUBY_PLATFORM == "java"
require 'hermann/providers/java_producer'
else
require 'hermann_lib'
end
module Hermann
class Producer
@ -9,7 +15,11 @@ module Hermann
def initialize(topic, brokers)
@topic = topic
@brokers = brokers
@internal = Hermann::Lib::Producer.new(topic, brokers)
if RUBY_PLATFORM == "java"
@internal = Hermann::Providers::JavaProducer.new(topic, brokers)
else
@internal = Hermann::Lib::Producer.new(topic, brokers)
end
# We're tracking children so we can make sure that at Producer exit we
# make a reasonable attempt to clean up outstanding result objects
@children = []
@ -39,13 +49,11 @@ module Hermann
# result from the broker
def push(value)
result = create_result
if value.kind_of? Array
return value.map { |e| self.push(e) }
else
@internal.push_single(value, result)
end
return result
end

View File

@ -0,0 +1,70 @@
require 'java'
require 'hermann'
require 'concurrent'
module JavaUtil
include_package 'java.util'
end
module ProducerUtil
include_package 'kafka.producer'
end
module JavaApiUtil
include_package 'kafka.javaapi.producer'
end
module Hermann
module Providers
class JavaProducer
attr_accessor :topic, :producer
def initialize(topic, brokers)
@topic = topic
properties = create_properties(brokers: brokers)
config = create_config(properties)
@producer = JavaApiUtil::Producer.new(config)
end
def defaults
{
string_encoder: 'kafka.serializer.StringEncoder',
partitioner: 'kafka.producer.DefaultPartitioner',
required_acks: "1"
}
end
def create_config(properties)
ProducerUtil::ProducerConfig.new(properties)
end
def create_properties(args={})
brokers = args[:brokers]
str_encoder = defaults[:string_encoder]
partitioner = defaults[:partitioner]
acks = defaults[:required_acks]
properties = JavaUtil::Properties.new
properties.put('metadata.broker.list', brokers)
properties.put('serializer.class', str_encoder)
properties.put('partitioner.class', partitioner)
properties.put('request.required.acks', acks)
properties
end
def push(*messages)
messages.flatten.map do |msg|
_push(msg)
end
end
def push_single(msg, result)
_push(msg)
end
private
def _push(msg)
data = ProducerUtil::KeyedMessage.new(@topic, msg)
@producer.send(data)
end
end
end
end

View File

@ -1,3 +1,3 @@
module Hermann
VERSION = '0.16.0'
VERSION = '0.17.0'
end

15
lib/hermann_jars.rb Normal file
View File

@ -0,0 +1,15 @@
# this is a generated file, to avoid over-writing it just delete this comment
require 'jar_dependencies'
require_jar( 'org.slf4j', 'slf4j-api', '1.7.2' )
require_jar( 'org.scala-lang', 'scala-library', '2.10.1' )
require_jar( 'log4j', 'log4j', '1.2.14' )
require_jar( 'com.yammer.metrics', 'metrics-core', '2.2.0' )
require_jar( 'org.apache.zookeeper', 'zookeeper', '3.3.4' )
require_jar( 'net.sf.jopt-simple', 'jopt-simple', '3.2' )
require_jar( 'org.apache.kafka', 'kafka_2.10', '0.8.1.1' )
require_jar( 'jline', 'jline', '0.9.94' )
require_jar( 'com.101tec', 'zkclient', '0.3' )
require_jar( 'org.mod4j.org.eclipse.xtext', 'log4j', '1.2.15' )
require_jar( 'junit', 'junit', '3.8.1' )
require_jar( 'org.xerial.snappy', 'snappy-java', '1.0.5' )

View File

@ -0,0 +1 @@
java_producer_spec.rb