/** * Will rendezvous with {@link KafkaPublisher} after building * {@link PublishingContext} and will produce the resulting {@link FlowFile}. * The resulting FlowFile contains all required information to determine * if message publishing originated from the provided FlowFile has actually * succeeded fully, partially or failed completely (see * {@link #isFailedFlowFile(FlowFile)}. */ private FlowFile doRendezvousWithKafka(final FlowFile flowFile, final ProcessContext context, final ProcessSession session) { final AtomicReference<KafkaPublisherResult> publishResultRef = new AtomicReference<>(); session.read(flowFile, new InputStreamCallback() { @Override public void process(InputStream contentStream) throws IOException { PublishingContext publishingContext = PublishKafka.this.buildPublishingContext(flowFile, context, contentStream); KafkaPublisherResult result = PublishKafka.this.kafkaResource.publish(publishingContext); publishResultRef.set(result); } }); FlowFile resultFile = publishResultRef.get().isAllAcked() ? this.cleanUpFlowFileIfNecessary(flowFile, session) : session.putAllAttributes(flowFile, this.buildFailedFlowFileAttributes(publishResultRef.get().getLastMessageAcked(), flowFile, context)); if (!this.isFailedFlowFile(resultFile)) { resultFile = session.putAttribute(resultFile, MSG_COUNT, String.valueOf(publishResultRef.get().getMessagesSent())); } return resultFile; }