【问题标题】:Why start() and poll() in SourceTask are abstract?为什么 SourceTask 中的 start() 和 poll() 是抽象的?
【发布时间】:2021-05-07 01:37:35
【问题描述】:

start() 和 poll() 是抽象的,所以在我从 SourceTask 扩展的类中,我可以执行以下操作:

public void start(Map<String, String> props, Object anotherParameter)
{
//whatever
}

public List<SourceRecord> poll(Object anotherParameter) throws InterruptedException 
{
//whatever
}

但是调用“poll(whateverObject)”或“start(props,whateverObject)”的代码如何初始化whateverObject并在调用它时正确引用它?因为我不能自定义调用这个方法的代码,对吧?或者我可以吗?如果是,如何?

我已经看到了其他连接器实现,但我不明白它是如何工作的。

【问题讨论】:

  • 不确定我是否理解这个问题。这些方法是抽象的,因为您要覆盖和实现它们。该答案不仅限于 Connect API。除此之外,start only takes one parameter and poll takes none
  • 抽象方法的意义在于,用户可以按照他们认为合适的方式实现它们,只要实现满足方法的约定即可。然后其他代码可以调用这些方法而不用担心实现。考虑到这一点,我不确定您实际上在哪里感到困惑?
  • 我的意思是,如果方法是抽象的,我可以向它添加参数,而不是实现:public List&lt;SourceRecord&gt; poll() 我可以实现:public List&lt;SourceRecord&gt; poll(Object parameter) 这对于抽象方法来说很好。问题是我无法控制调用 poll() 的方式和时间,那么如何让 kafka 调用 poll(Object parameter) 而不仅仅是 poll()。
  • "我的意思是,如果方法是抽象的,我可以向它添加参数" – 这不是真的。您的 #poll(Object) 方法重载 #poll() 方法,但不会覆盖它。

标签: java apache-kafka apache-kafka-connect


【解决方案1】:

start() 和 poll() 是抽象的,所以在我从 SourceTask 扩展的类中,我可以执行以下操作

不,您不能“执行以下操作”(添加参数),因为those are not the method contracts

您仍然需要覆盖实际的方法,但是如果需要,您可以调用 其他 方法(同名,带参数),但这些方法不是抽象的,并且没有要重载的语义含义,因此它们可以命名为任何名称,因此只是常规的 Java 方法调用。

我不能自定义调用这个方法的代码,对吧?

你不能*。

* 除非你想从源代码重建 Kafka Connect

问题是我无法控制 poll() 的调用方式和时间

没错。不太清楚您要添加哪些参数,但 poll 肯定不需要任何东西,您需要做的任何对象初始化都应该通过配置完成(传递给 start 方法的属性映射)

【讨论】:

    猜你喜欢
    • 2012-03-09
    • 1970-01-01
    • 1970-01-01
    • 2020-07-06
    • 2020-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-29
    相关资源
    最近更新 更多