我正在为在我的项目中实施kafka集群的POC工作。我在本地计算机上通过3个代理设置了一个kafka集群。现在,我正在使用Spring MVC REST服务将消息发送到Kafka服务器,该服务在内部使用Spring Kafka来产生和使用往返于Kafka集群的消息。现在,我需要将文件(包含XML数据)发送到Kafka服务器。我尝试使用 Kafka的ByteArraySerializer / Deserializer 来做到这一点。我正在将XMl文件转换为byteArray并将其发送到Kafka服务器,但是我的byteArray正在转换为数字数组。我正在粘贴用于将消息发送到的代码。 kafka服务器。
@Async
public String sendMessageFromFile(String filePath) {
File file = new File(filePath);
byte[] b = new byte[(int) file.length()];
try {
FileInputStream fileInputStream = new FileInputStream(file);
fileInputStream.read(b);
for (int i = 0; i < b.length; i++) {
System.out.print((char)b[i]);
}
ListenableFuture<SendResult<Integer, byte[]>> future = kafkaTemplate.send("TESTQUEUE", b);//Sending bytearray to the kafka cluster
future.addCallback(new ListenableFutureCallback<SendResult<Integer, byte[]>>() {
@Override
public void onSuccess(final SendResult<Integer, byte[]> message) {
LOGGER.info("sent message= " + Arrays.toString(message.getProducerRecord().value()) + " with offset= " + message.getRecordMetadata().offset());
}
@Override
public void onFailure(final Throwable throwable) {
LOGGER.error("unable to send message from file with path= " + filePath, throwable);
}
});
fileInputStream.close();
}catch(FileNotFoundException e) {
LOGGER.error("Invalid file path");
return "Invalid file path";
}catch(IOException e) {
LOGGER.error("An error occured while reading the file: "+e.getMessage());
return "An error occured while parsing the file";
}
return "File is being sent";
}
下面是我的配置。
public class MessagingServiceConfiguration {
private final String bootstrapServersProducer = "localhost:9092";
private final String bootstrapServersConsumer = "localhost:9093";
@Autowired
private Environment env;
@Bean
ConcurrentKafkaListenerContainerFactory<Integer, byte[]>
kafkaListenerContainerFactory() {
ConcurrentKafkaListenerContainerFactory<Integer, byte[]> factory =
new ConcurrentKafkaListenerContainerFactory<>();
factory.setConsumerFactory(consumerFactory());
return factory;
}
@Bean
public ConsumerFactory<Integer, byte[]> consumerFactory() {
return new DefaultKafkaConsumerFactory<>(consumerConfigs());
}
@Bean
public Map<String, Object> consumerConfigs() {
Map<String, Object> props = new HashMap<>();
props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServersConsumer);
props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, ByteArrayDeserializer.class);
return props;
}
@Bean
public ListenerServiceImpl listener() {
return new ListenerServiceImpl();
}
@Bean
public ProducerFactory<Integer, byte[]> producerFactory() {
return new DefaultKafkaProducerFactory<>(producerConfigs());
}
@Bean
public Map<String, Object> producerConfigs() {
Map<String, Object> props = new HashMap<>();
props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServersProducer);
props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, ByteArraySerializer.class);
return props;
}
@Bean
public KafkaTemplate<Integer, byte[]> kafkaTemplate() {
return new KafkaTemplate<Integer, byte[]>(producerFactory());
}
}
下面是我的消费者代码:
@KafkaListener(id = "TEST_CONSUMER_ID", topics = "TESTQUEUE")
public void listenMessageInQueue(byte[] msg) {
LOGGER.info("receiving payload='{}'", msg);
messageDao.saveMessage(msg.toString());
}
下面是我从卡夫卡回来的消息。
[60、65、100、118、97、110、99、101、83、104、105、112、109、101、110, 116、78、111、116、105、102、105、99、97、116、105、111、110、32、120, 109、108、110、115、58、100、115、102、114、61、34、117、114、110、58 114、111、115、101、116、116、97、110、101、116、58、115、112、101, 99、105、102、105、99、97、116、105、111、110、58、100、111、109、97, 105、110、58、80、114、111、99、117、114、101 .........
我无法找出我所缺少的。有人可以指出我完成这项任务的正确方向。