我遇到了伴随对象选择其类型而不是案例类的问题
我正在使用喷雾 json serdes。他们需要一个隐式的 JsonFormat。此格式是通过调用取决于案例类参数数量的函数来获得的: jsonFormat2(Class2) 如果案例类有两个字段,例如
case class Class2(a: String, b: Integer)
Run Code Online (Sandbox Code Playgroud)
或 jsonFormat3(Class3) 的
case class Class3(a: String, b: Integer, c: Long)
Run Code Online (Sandbox Code Playgroud)
鉴于必须知道案例类在整个代码中具有的参数数量并不好,我想创建一个案例类伴随对象,以便您可以封装此信息并从类本身获取 JsonFormat,例如:
object Class2 extends DefaultJsonProtocol
{
def getJsonFormat() = {
jsonFormat2(Class2)
}
}
Run Code Online (Sandbox Code Playgroud)
但如果我这样做,我会遇到以下编译问题:
type mismatch;
[error] found : mypackage.Class2.type
[error] required: (?, ?) => ?
[error] jsonFormat2(Class2)
Run Code Online (Sandbox Code Playgroud)
如果我们查看 jsonFormat2 中的代码,签名是:
def jsonFormat2[P1 :JF, P2 :JF, T <: Product :ClassManifest
(construct: (P1, P2) => T): RootJsonFormat[T] = { // ...
Run Code Online (Sandbox Code Playgroud)
如果我更改伴随对象名称(例如更改为 MyClass2),它将正常工作。所以,类型似乎是冲突的。
似乎在处理类型时,伴生对象无法像它们所使用的类那样命名。
有人可以解释为什么会发生这种情况吗?如果有限制,或者如何解决它,以便伴生对象可以使用相同的名称?
我有一个 Processor-API 处理器,它在内部转发到几个单独的接收器(想想事件分类器,尽管它在事件之间也有状态逻辑)。我正在考虑稍后将其中两个主题连接起来。一旦加入,我会将元素的更新(丰富)版本转发到我实际加入的那些主题。
如果在处理器 API 代码中转发到多个接收器(接收器 1、接收器 2),而这些接收器又被发送到主题,您将如何混合 DSL?
我想你可以创建单独的流,比如
val stream1 = builder.stream(outputTopic)
val stream2 = builder.stream(outputTopic2)
Run Code Online (Sandbox Code Playgroud)
并从那里开始构建?然而,这会创建更多的子拓扑 - 这里的含义是什么?
另一种可能性是在处理器 API 中拥有自己的状态存储,并在同一个处理器中对其进行管理(我实际上正在这样做)。它增加了代码的复杂性,但不是更高效吗?例如,您可以删除不再使用的数据(一旦进行连接,您可以将新连接的数据转发到接收器,并且它不再符合连接条件)。还有其他效率问题吗?
默认情况下,Kafka Streams 状态存储是“紧凑的”。是否可以在状态存储中使用保留策略设置“压缩,删除”?
在所有Kafka代理重新启动以升级offset.retention.minutes设置(将其增加到60天)之后,消耗在那里的Kafka Streams应用程序被卡住了,并且消费者组显示了重新平衡:
bin/kafka-consumer-groups.sh --bootstrap-server ${BOOTSTRAP_SERVERS} --describe --group stream-processor | sort
Warning: Consumer group 'stream-processor' is rebalancing.
TOPIC PARTITION CURRENT-OFFSET LOG-END-OFFSET LAG CONSUMER-ID HOST CLIENT-ID
customers 0 84263 84288 25 - - -
customers 1 71731 85068 13337 - - -
customers 10 71841 84801 12960 - - -
customers 11 84273 84336 63 - - -
customers 12 84189 84297 108 - - -
customers 13 83969 84051 82 - - -
customers 14 84693 84767 74 - - - …Run Code Online (Sandbox Code Playgroud) 我在 Kafka Streams 应用程序(2.1 版)的日志中发现了这个问题。
Coordinator selected invalid assignment protocol: null
Run Code Online (Sandbox Code Playgroud)
Kafka 客户端库中的代码看起来很简单,其中没有找到分配器:
PartitionAssignor assignor = lookupAssignor(assignmentStrategy);
if (assignor == null)
throw new IllegalStateException("Coordinator selected invalid
assignment protocol: " + assignmentStrategy);
Run Code Online (Sandbox Code Playgroud)
而 lookupAssignor 只是按名称查找:
private PartitionAssignor lookupAssignor(String name) {
for (PartitionAssignor assignor : this.assignors) {
if (assignor.name().equals(name))
return assignor;
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
在什么情况下这可能发生在 Kafka Streams 应用程序上?后果是什么?
如何重命名和移动使用 SBT 程序集插件生成的 uberjar?
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.6")
Run Code Online (Sandbox Code Playgroud)
我的 assemblyMergeStrategy(用于 META-INF 删除):
assemblyMergeStrategy in assembly := {
case PathList("META-INF", xs @ _*) => MergeStrategy.discard
case x => MergeStrategy.first
}
Run Code Online (Sandbox Code Playgroud)
它会生成类似以下内容的内容:
target/scala-2.12/my-project-assembly-0.1.jar
Run Code Online (Sandbox Code Playgroud)
我希望能够使用一致的名称(不需要单独的脚本)自动重命名(并在另一个目录中生成)。
LowCardinalityClickHouse 中的字段是一种优化,其中值是字典编码的,以实现更快的查找和更小的存储。根据文档:
使用 LowCarditality 数据类型的效率取决于数据的多样性。如果字典包含的不同值少于 10,000 个,则 ClickHouse 大多显示出更高的数据读取和存储效率。如果字典包含超过 100,000 个不同的值,则与使用普通数据类型相比,ClickHouse 的性能可能更差。
用作布尔值的 UInt8 值怎么样?基数是 2,但占用空间如此之小 (8),它实际上会在查询中提供使用它的好处吗?
我试图混淆带有依赖项的 jar(尽管如果我将常规单个 jar 设置为 inFile,同样的问题也会影响)。
我正在使用 Java 8,但我必须使用较新版本的 Proguard 和 Proguard Maven 插件,因为覆盖了来自更高版本的一些 jar 依赖项(否则我会遇到“不支持的主次版本”问题)。
当执行“mvn clean install”时,该步骤被执行,但我收到“在pluginArtifacts中找不到proguard jar错误”。请参阅下面的日志。
我在 Proguard Maven 插件代码中看到,现在您需要(从 7.0.0 开始)来自 com.guardsquare 的 proguard-base 和 proguard-core,而不是 net.sf.proguard 中过时的先前版本 - 这个不适合以后使用罐子。
显然,在我指定的地方找不到 proguard jar - 我应该如何包含此依赖项?
我在我的 pom 中使用这个:
<build>
<plugins>
<plugin>
<groupId>com.github.wvengen</groupId>
<artifactId>proguard-maven-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals><goal>proguard</goal></goals>
<configuration>
<injar>${project.build.finalName}-jar-with-dependencies.jar</injar>
<outjar>${project.build.finalName}-small.jar</outjar>
<proguardVersion>7.1.0</proguardVersion>
<options>
<option>-allowaccessmodification</option>
<option>-dontoptimize</option>
<option>-dontshrink</option>
<option>-dontnote</option>
<option>-dontwarn</option> <!-- added option to ignore com.sun missing classes -->
<option>-keepattributes Signature</option>
</options>
<libs>
<lib>${java.home}/lib/rt.jar</lib>
</libs>
<dependencies>
<dependency>
<groupId>com.guardsquare</groupId> …Run Code Online (Sandbox Code Playgroud) apache-kafka ×4
scala ×2
cardinality ×1
clickhouse ×1
encoding ×1
jar ×1
java ×1
maven ×1
obfuscation ×1
proguard ×1
sbt ×1
sbt-assembly ×1
spray-json ×1
types ×1
uberjar ×1