如何从ValueTransformer中的Punctuator实例向下游转发事件?

时间:2019-05-29 09:19:43

标签: apache-kafka-streams

在KafkaStream中,当实现 ValueTransformer 时,在 transform()调用中,我安排了一个新的Punctuator。当执行 Punctuator 的方法 punctuate()时,我希望它使用上下文实例将事件转发到下游。但是,当属于DSL拓扑的一部分时,上下文实例似乎未定义。

有关使用Transformer进行此操作的任何线索吗?

在处理器中使用相同的逻辑,实现其工作的低级处理器拓扑。

在ValueTransformerWithKey中:

@Override 
    public Event transform(final String key, final Event event) { 
        this.context.schedule(timeout.toMillis(), PunctuationType.WALL_CLOCK_TIME, new MyPunctuator(context, key, event));
        return null;
}

在MyPunctuator中:

private class MytPunctuator implements Punctuator {
    private String key;
    private ProcessorContext context;
    private Event event;

    MyPunctuator(ProcessorContext context, String key, Event event)
    {
        this.context = context;
        this.key = key;
        this.event = event;
    }

    @Override
    public void punctuate(final long timestamp) {
        context.forward(key, AlertEvent.builder().withSource(event).build());
        context.commit();
    }
}

执行时

myStream
    .groupByKey(Serialized.with(Serdes.String(), Event.serde()))
    .reduce((k, v) -> v)
    .transformValues(() -> valueTransformerWithKey)
    .toStream().to(ALARM_TOPIC, Produced.with(Serdes.String(), AlarmEvent.serde()));

我希望一旦标点符号过期,就可以将标点符号产生的Alarm事件转发给ALARM主题。

相反,我遇到了以下异常:不支持ProcessorContext.forward()。

1 个答案:

答案 0 :(得分:0)

和往常一样,我在javadoc中找到了答案: https://kafka.apache.org/20/javadoc/org/apache/kafka/streams/kstream/ValueTransformerWithKey.html

  

请注意,在转换中不允许使用ProcessorContext.forward(对象,对象)或ProcessorContext.forward(对象,对象,To),并且会导致异常。