void shutdown() {
        LOGGER.info("Shutting down Stroom Kafka Producer Factory Service");

        allSharedProducersMap.values()
                .parallelStream()
                .forEach(sharedKafkaProducer -> {
                    sharedKafkaProducer.getKafkaProducer().ifPresent(kafkaProducer -> {
                        LOGGER.info("Closing Kafka producer for {}",
                                sharedKafkaProducer.getSharedKafkaProducerIdentity());
                        kafkaProducer.close();
                    });
                });
    }
Class to provide shared {@link KafkaProducer} instances wrapped inside a {@link SharedKafkaProducer}.
We want one {@link KafkaProducer} per {@link KafkaConfigDoc}, however the config in a {@link KafkaConfigDoc}
can change at runtime so on each request for a {@link SharedKafkaProducer} we need to check if the
{@link KafkaConfigDoc} has changed since the time we created it. New calls to
{@link KafkaProducerFactory#getSharedProducer(DocRef)} will always get a {@link SharedKafkaProducer} for the
latest config. {@link KafkaProducer}
stroom-kafka/stroom-kafka-impl/src/main/java/stroom/kafka/impl/KafkaProducerFactoryImpl.java