[英]how to modify message of one kafka topic and send to another kafka topic using java?
[英]How to produce a json object message into kafka topic using java(spring)?
我想向kafka主題發送消息。 該消息應具有以下模式:
{"targetFileInfo":{"path":"2018-05-07-10/row01-small-01.txt.ready"}}
我知道這是一個json模式,那么如何在String中轉換該json?
我使用一個Maven項目,因此需要使用哪些依賴項
String stringData = JSON.stringify({"targetFileInfo":{"path":"2018-05-07-10/row01-small-01.txt.ready"}});
因此,我認為最好不要將Json轉換為字符串,並且不要將按摩發送到kafka主題中。
我的代碼就是這樣,它可以發送一個字符串,但是我不知道如何修改我的代碼以發送上述消息。 也許你可以幫我。
Producer<String, String> producer = null;
Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("acks", "all");
props.put("retries", 0);
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
producer = new KafkaProducer<>(props);
String msg = "welcome";
producer.send(new ProducerRecord<String, String>("event", msg));
producer.close();
根據評論,您需要在kafka JsonNode
作為消息發送。 為此編寫一個自定義的序列化器/反序列化器。
import java.io.IOException;
import java.util.Map;
import org.apache.kafka.common.serialization.Deserializer;
import org.apache.kafka.common.serialization.Serializer;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JsonNodeSerDes implements Serializer<JsonNode>, Deserializer<JsonNode> {
private ObjectMapper mapper = new ObjectMapper();
@Override
public byte[] serialize(String topic, JsonNode data) {
try {
return mapper.writeValueAsBytes(data);
} catch (JsonProcessingException e) {
return new byte[0];
}
}
@Override
public JsonNode deserialize(String topic, byte[] data) {
try {
return mapper.readValue(data, JsonNode.class);
} catch (IOException e) {
return null;
}
}
@Override
public void configure(Map<String, ?> configs, boolean isKey) {
}
@Override
public void close() {
}
}
我在同一個類中編寫了序列化器/反序列化器。 您可以將它們分為兩個類(一個實現Serializer
,另一個實現Deserializer
)。
在創建KafkaProducer
您需要提供“value.serializer”配置和“value.deserializer”配置KafkaConsumer
。
使用的外部依賴項:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.8.8</version>
</dependency>
那解決了我的問題:
Producer<String, String> producer = null;
Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("acks", "all");
props.put("retries", 0);
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
producer = new KafkaProducer<>(props);
try {
producer = new KafkaProducer<String, String>(props);
} catch (Exception e) {
e.printStackTrace();
}
blobStorageChecker = new BlobStorageChecker();
String folder = blobStorageChecker.getCurrentDateUTC();
String msg = "{\"targetFileInfo\":{\"path\":\"test/"+folder+"row01-small.txt\"},\"sourceFileInfo\":{\"lastModifiedTime\":1525437960000,\"file\":\"/row01-small-01.txt\",\"filename\":\"/data/row01/row01-small.txt\",\"size\":19728,\"remoteUri\":\"ftp://waws-prod-am2-191.ftp.net/data/orsted-real/inbound/row01\",\"contentEncoding\":\"\",\"contentType\":\"\"}}";
ProducerRecord<String, String> record = new ProducerRecord<String, String>("event-orsted-v1", null, msg);
if (producer != null) {
try {
Future<RecordMetadata> future = producer.send(record);
RecordMetadata metadata = future.get();
} catch (Exception e) {
System.err.println(e.getMessage());
e.printStackTrace();
}
}
producer.close();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.