使用Spring Kafka将文件作为byteArray发送到Kafka

时间:2018-12-20 14:24:40

标签: java spring apache-kafka spring-kafka

我正在为在我的项目中实施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 .........

我无法找出我所缺少的。有人可以指出我完成这项任务的正确方向。

0 个答案:

没有答案