簡體   English   中英

使用kafkastreams根據記錄內容寫到kafka Topic

[英]Write to kafka Topic based on the content on content of record using kafkastreams

我正在嘗試根據父級中記錄的內容將一個主題(父級)寫到kafka中的另一個主題(子級)。 如果我從父主題中消費,則示例記錄為{"date":{"string":"2017-03-20"},"time":{"string":"20:04:13:563"},"event_nr":1572470,"interface":"Transaction Manager","event_id":5001,"date_time":1490040253563,"entity":"Transaction Manager","state":0,"msg_param_1":{"string":"ISWSnk"},"msg_param_2":{"string":"Application startup"},"msg_param_3":null,"msg_param_4":null,"msg_param_5":null,"msg_param_6":null,"msg_param_7":null,"msg_param_8":null,"msg_param_9":null,"long_msg_param_1":null,"long_msg_param_2":null,"long_msg_param_3":null,"long_msg_param_4":null,"long_msg_param_5":null,"long_msg_param_6":null,"long_msg_param_7":null,"long_msg_param_8":null,"long_msg_param_9":null,"last_sent":{"long":1490040253563},"transmit_count":{"int":1},"team_id":null,"app_id":{"int":4},"logged_by_app_id":{"int":4},"entity_type":{"int":3},"binary_data":null}

我想使用實體的值來寫入與實體的名稱相同的主題(實體的值是固定的,因此,如果難以以編程方式動態創建主題,我可以靜態創建該值)。 我正在嘗試使用這個

import org.apache.kafka.common.serialization.Serde;
import org.apache.kafka.common.serialization.Serdes;
import org.apache.kafka.streams.KafkaStreams;
import org.apache.kafka.streams.KeyValue;
import org.apache.kafka.streams.StreamsConfig;
import org.apache.kafka.streams.kstream.KStream;
import org.apache.kafka.streams.kstream.KStreamBuilder;
import java.util.Properties;

public class entityDataLoader {
    public static void main(final String[] args) throws Exception {
    final Properties streamsConfiguration = new Properties();
    streamsConfiguration.put(StreamsConfig.APPLICATION_ID_CONFIG, "map-function-lambda-example");
    streamsConfiguration.put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
    streamsConfiguration.put(StreamsConfig.KEY_SERDE_CLASS_CONFIG, Serdes.ByteArray().getClass().getName());
    streamsConfiguration.put(StreamsConfig.VALUE_SERDE_CLASS_CONFIG, Serdes.String().getClass().getName());

    // Set up serializers and deserializers, which we will use for overriding the default serdes
    // specified above.
    final Serde<String> stringSerde = Serdes.String();
    final Serde<byte[]> byteArraySerde = Serdes.ByteArray();

    // In the subsequent lines we define the processing topology of the Streams application.
    final KStreamBuilder builder = new KStreamBuilder();

    // Read the input Kafka topic into a KStream instance.
    final KStream<byte[], String> textLines = builder.stream(byteArraySerde, stringSerde, "postilion-events");

    String content = textLines.toString();
    String entity = JSONExtractor.returnJSONValue(content, "entity");
    System.out.println(entity);

    textLines.to(entity);

    final KafkaStreams streams = new KafkaStreams(builder, streamsConfiguration);
    streams.cleanUp();
    streams.start();

    // Add shutdown hook to respond to SIGTERM and gracefully close Kafka Streams
    Runtime.getRuntime().addShutdownHook(new Thread(streams::close));
    }
}

內容的內容org.apache.kafka.streams.kstream.internals.KStreamImpl@568db2f2 ,很明顯@ KStream.toString()不是嘗試獲取實體值的正確方法。

PS JSONExtractor類定義為

import org.json.simple.JSONObject;
import org.json.simple.parser.ParseException;
import org.json.simple.parser.JSONParser;
class JSONExtractor {

public static String returnJSONValue(String args, String value){
    JSONParser parser = new JSONParser();
    String app= null;
    System.out.println(args);
    try{
        Object obj = parser.parse(args);
        JSONObject JObj = (JSONObject)obj;
        app= (String) JObj.get(value);
        return app;
    }
    catch(ParseException pe){
        System.out.println("No Object found");
        System.out.println(pe);
    }
    return app;
}
}

您可以使用branch()將父流拆分為“子流”,並將每個“子流”寫入一個輸出主題(請參見http://docs.confluent.io/current/streams/developer-guide.html#無狀態轉換

您的branch()必須為所有您輸出的主題創建一個“子流”,但是因為您知道所有主題,所以這應該不是問題。

另外,對於Kafka Streams,建議在啟動應用程序之前先創建所有輸出主題(請參閱http://docs.confluent.io/current/streams/developer-guide.html#user-topics

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM