因此,api 0.8.2中的生产者改变了Kakfa配置属性;经过那个并让我的java Producer编译后,我得到一个例外。制作人针对我的Kafka_2.9.1-0.8.2.1群集节点,我得到关于DefaultSerializer
没有实例化的例外:
Exception in thread "main" org.apache.kafka.common.KafkaException: Could not instantiate class kafka.serializer.DefaultEncoder Does it have a public no-argument constructor?
at org.apache.kafka.common.utils.Utils.newInstance(Utils.java:235)
at org.apache.kafka.common.config.AbstractConfig.getConfiguredInstance(AbstractConfig.java:136)
at org.apache.kafka.clients.producer.KafkaProducer.<init>(KafkaProducer.java:216)
........
鉴于这是在Kakfa中实现的,我想知道是否使用Kafka作为依赖进行编译是不够的,因为我可能需要在运行时打包一个或多个Kafka罐子。我还没有找到关于此的文件(最新或其他)。我是否缺少一个生产者运行时jar?
供参考我在这里包括我的build.gradle
(它有点乱)。编译中的排除是在已经收到此错误之后的新添加,因此错误发生在依赖项块中有或没有这些行。我确实只尝试依靠kafka-client
模块获得0.8.2,但我不认为这适用于制作人。这是文件:
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.google.protobuf:protobuf-gradle-plugin:0.7.0'
}
}
group 'lamblin'
version '0.1-SNAPSHOT'
apply plugin: 'application'
apply plugin: "com.google.protobuf"
sourceCompatibility = 1.7
targetCompatibility = 1.7
// Eliminates bootstrap class warning from javac
//tasks.withType(Compile) {
// options.bootClasspath = "$JDK6_HOME/jre/lib/rt.jar"
//}
repositories {
mavenCentral()
}
dependencies {
testCompile group: 'junit', name: 'junit', version: '4.11'
compile group: 'com.google.guava', name: 'guava', version: '18.0'
compile group: 'com.google.protobuf', name: 'protobuf-java-util', version: '3.0.0-beta-1'
compile group: 'com.google.transit', name: 'gtfs-realtime-bindings', version: '0.0.4'
compile group: 'com.offbytwo', name: 'docopt', version: '0.6.0.20150202'
//compile group: 'org.apache.kafka', name: 'kafka_2.9.1', version: '0.8.2.1' {
compile ('org.apache.kafka:kafka_2.9.1:0.8.2.1') {
exclude group: 'com.sun.jmx', module: 'jmxri'
exclude group: 'javax.jmx', module: 'jms'
exclude group: 'com.sun.jdmk', module: 'jmxtools'
}
}
protobuf {
generateProtoTasks {
all().each { task ->
task.builtins {
python { }
}
}
}
protoc {
// artifact = 'com.google.protobuf:protoc:3.0.0-alpha-3'
artifact = 'com.google.protobuf:protoc:2.6.1'
}
}
// First Application Script
mainClassName = "com.insight.lamblin.GtfsToJson"
applicationName = "gtfsToJson"
// Subsequent Scripts
task createAllStartScripts() << {
// This task is added to by a loop over the scripts array creating-sub tasks
}
def scripts = [ 'gtfsToJson': 'com.insight.lamblin.GtfsToJson',
'rawGtfsKafkaProducer': 'com.insight.lamblin.RawGtfsKafkaProducer'
]
scripts.each() { scriptName, className ->
def t = tasks.create(name: scriptName+'StartScript', type: CreateStartScripts) {
mainClassName = className
applicationName = scriptName
outputDir = new File(project.buildDir, 'scripts')
classpath = jar.outputs.files + project.configurations.runtime
}
applicationDistribution.into("bin") {
from(t)
fileMode = 0755
}
createAllStartScripts.dependsOn(t)
}
答案 0 :(得分:2)
场景:在一个不起眼的教堂地下室,一堆折叠金属椅子被各种中年男性和一些女性占据,其中大多数人戴着眼镜并且显得不感兴趣。有一盒咖啡和一些半甜甜圈依次安放在塑料盘子上,在靠近入口处的墙壁上有一块破碎的无盖折叠桌。
丹尼尔:嗨,我的名字是丹尼尔,我是......(呜咽)......文件撇渣器 小组(慢慢地):欢迎丹尼尔。这个屏幕播放位是因为看起来我的Kafka问题只画了蟋蟀,所以我在这里保持一点点有趣......感觉寂寞。
在我的辩护中,有10个关于生产者属性设置的看似权威的kafka.apache.org文件。 kafka.serializer.DefaultSerializer
在几乎所有设置属性的示例中都非常突出和常见,Java生成器示例完全没有关于属性的详细信息或运行示例代码。
此外,尽管名称为“default”,但此属性没有默认值,因此需要设置它。这似乎是一个愚蠢的细节,但它必须对卡夫卡开发团队的某些人有意义。
当运行用Java编写的Kafka生成器时,生产者应该从少数可用的Java特定编码器中设置编码器。上面提到的似乎是Scala特有的。对于Java,您对org.apache.kafka.common.serialization
感兴趣,而与默认序列化器相同的是:ByteArraySerializer
。如果您设置key.serializer
和value.serializer
则应该有效。更好的设置方法是使用ProducerConfig
中的静态字符串,例如ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG
。
设置有点像:
import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.ProducerConfig;
import org.apache.kafka.clients.producer.ProducerRecord;
...
import java.util.Properties;
...
Properties props = new Properties();
props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG,
"172.31.22.7:9092,172.31.22.6:9092,172.31.22.5:9092,172.31.22.4:9092");
props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG,
"org.apache.kafka.common.serialization.ByteArraySerializer");
props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG,
"org.apache.kafka.common.serialization.ByteArraySerializer");
KafkaProducer<byte[], byte[]> producer = new KafkaProducer<>(props);
...