diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/kafka/KafkaProperties.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/kafka/KafkaProperties.java index d091b3d602..c6ed49f490 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/kafka/KafkaProperties.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/kafka/KafkaProperties.java @@ -172,8 +172,7 @@ public class KafkaProperties { } catch (IOException ex) { throw new IllegalStateException( - String.format("Resource '%s' must be on a file system", resource), - ex); + "Resource '" + resource + "' must be on a file system", ex); } } diff --git a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/EnableAutoConfigurationImportSelectorTests.java b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/EnableAutoConfigurationImportSelectorTests.java index c4b09057ff..bec67e8f0f 100644 --- a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/EnableAutoConfigurationImportSelectorTests.java +++ b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/EnableAutoConfigurationImportSelectorTests.java @@ -185,8 +185,8 @@ public class EnableAutoConfigurationImportSelectorTests { public void nonAutoConfigurationClassNameExclusionsWhenPresentOnClassPathShouldThrowException() throws Exception { configureExclusions(new String[0], - new String[] { - "org.springframework.boot.autoconfigure.EnableAutoConfigurationImportSelectorTests.TestConfiguration" }, + new String[] { "org.springframework.boot.autoconfigure." + + "EnableAutoConfigurationImportSelectorTests.TestConfiguration" }, new String[0]); this.expected.expect(IllegalStateException.class); this.importSelector.selectImports(this.annotationMetadata); @@ -195,8 +195,9 @@ public class EnableAutoConfigurationImportSelectorTests { @Test public void nonAutoConfigurationPropertyExclusionsWhenPresentOnClassPathShouldThrowException() throws Exception { - configureExclusions(new String[0], new String[0], new String[] { - "org.springframework.boot.autoconfigure.EnableAutoConfigurationImportSelectorTests.TestConfiguration" }); + configureExclusions(new String[0], new String[0], + new String[] { "org.springframework.boot.autoconfigure." + + "EnableAutoConfigurationImportSelectorTests.TestConfiguration" }); this.expected.expect(IllegalStateException.class); this.importSelector.selectImports(this.annotationMetadata); } diff --git a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/kafka/KafkaAutoConfigurationTests.java b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/kafka/KafkaAutoConfigurationTests.java index a5240b6fda..db3a8d8bae 100644 --- a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/kafka/KafkaAutoConfigurationTests.java +++ b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/kafka/KafkaAutoConfigurationTests.java @@ -79,38 +79,35 @@ public class KafkaAutoConfigurationTests { DefaultKafkaConsumerFactory consumerFactory = this.context .getBean(DefaultKafkaConsumerFactory.class); @SuppressWarnings("unchecked") - Map consumerProps = (Map) new DirectFieldAccessor( + Map configs = (Map) new DirectFieldAccessor( consumerFactory).getPropertyValue("configs"); // common - assertThat(consumerProps.get(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG)) + assertThat(configs.get(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG)) .isEqualTo(Collections.singletonList("foo:1234")); - assertThat(consumerProps.get(SslConfigs.SSL_KEY_PASSWORD_CONFIG)).isEqualTo("p1"); - assertThat((String) consumerProps.get(SslConfigs.SSL_KEYSTORE_LOCATION_CONFIG)) + assertThat(configs.get(SslConfigs.SSL_KEY_PASSWORD_CONFIG)).isEqualTo("p1"); + assertThat((String) configs.get(SslConfigs.SSL_KEYSTORE_LOCATION_CONFIG)) .endsWith(File.separator + "ksLoc"); - assertThat(consumerProps.get(SslConfigs.SSL_KEYSTORE_PASSWORD_CONFIG)) - .isEqualTo("p2"); - assertThat((String) consumerProps.get(SslConfigs.SSL_TRUSTSTORE_LOCATION_CONFIG)) + assertThat(configs.get(SslConfigs.SSL_KEYSTORE_PASSWORD_CONFIG)).isEqualTo("p2"); + assertThat((String) configs.get(SslConfigs.SSL_TRUSTSTORE_LOCATION_CONFIG)) .endsWith(File.separator + "tsLoc"); - assertThat(consumerProps.get(SslConfigs.SSL_TRUSTSTORE_PASSWORD_CONFIG)) + assertThat(configs.get(SslConfigs.SSL_TRUSTSTORE_PASSWORD_CONFIG)) .isEqualTo("p3"); // consumer - assertThat(consumerProps.get(ConsumerConfig.CLIENT_ID_CONFIG)).isEqualTo("ccid"); // override - assertThat(consumerProps.get(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG)) + assertThat(configs.get(ConsumerConfig.CLIENT_ID_CONFIG)).isEqualTo("ccid"); // override + assertThat(configs.get(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG)) .isEqualTo(Boolean.FALSE); - assertThat(consumerProps.get(ConsumerConfig.AUTO_COMMIT_INTERVAL_MS_CONFIG)) + assertThat(configs.get(ConsumerConfig.AUTO_COMMIT_INTERVAL_MS_CONFIG)) .isEqualTo(123L); - assertThat(consumerProps.get(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG)) + assertThat(configs.get(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG)) .isEqualTo("earliest"); - assertThat(consumerProps.get(ConsumerConfig.FETCH_MAX_WAIT_MS_CONFIG)) - .isEqualTo(456); - assertThat(consumerProps.get(ConsumerConfig.FETCH_MIN_BYTES_CONFIG)) - .isEqualTo(789); - assertThat(consumerProps.get(ConsumerConfig.GROUP_ID_CONFIG)).isEqualTo("bar"); - assertThat(consumerProps.get(ConsumerConfig.HEARTBEAT_INTERVAL_MS_CONFIG)) + assertThat(configs.get(ConsumerConfig.FETCH_MAX_WAIT_MS_CONFIG)).isEqualTo(456); + assertThat(configs.get(ConsumerConfig.FETCH_MIN_BYTES_CONFIG)).isEqualTo(789); + assertThat(configs.get(ConsumerConfig.GROUP_ID_CONFIG)).isEqualTo("bar"); + assertThat(configs.get(ConsumerConfig.HEARTBEAT_INTERVAL_MS_CONFIG)) .isEqualTo(234); - assertThat(consumerProps.get(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG)) + assertThat(configs.get(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG)) .isEqualTo(LongDeserializer.class); - assertThat(consumerProps.get(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG)) + assertThat(configs.get(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG)) .isEqualTo(IntegerDeserializer.class); } @@ -119,7 +116,6 @@ public class KafkaAutoConfigurationTests { load("spring.kafka.clientId=cid", "spring.kafka.producer.acks=all", "spring.kafka.producer.batch-size=20", "spring.kafka.producer.bootstrap-servers=bar:1234", // test override - // common "spring.kafka.producer.buffer-memory=12345", "spring.kafka.producer.compression-type=gzip", "spring.kafka.producer.key-serializer=org.apache.kafka.common.serialization.LongSerializer", @@ -133,39 +129,35 @@ public class KafkaAutoConfigurationTests { DefaultKafkaProducerFactory producerFactory = this.context .getBean(DefaultKafkaProducerFactory.class); @SuppressWarnings("unchecked") - Map producerProps = (Map) new DirectFieldAccessor( + Map configs = (Map) new DirectFieldAccessor( producerFactory).getPropertyValue("configs"); // common - assertThat(producerProps.get(ProducerConfig.CLIENT_ID_CONFIG)).isEqualTo("cid"); + assertThat(configs.get(ProducerConfig.CLIENT_ID_CONFIG)).isEqualTo("cid"); // producer - assertThat(producerProps.get(ProducerConfig.ACKS_CONFIG)).isEqualTo("all"); - assertThat(producerProps.get(ProducerConfig.BATCH_SIZE_CONFIG)).isEqualTo(20); - assertThat(producerProps.get(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG)) + assertThat(configs.get(ProducerConfig.ACKS_CONFIG)).isEqualTo("all"); + assertThat(configs.get(ProducerConfig.BATCH_SIZE_CONFIG)).isEqualTo(20); + assertThat(configs.get(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG)) .isEqualTo(Collections.singletonList("bar:1234")); // override - assertThat(producerProps.get(ProducerConfig.BUFFER_MEMORY_CONFIG)) - .isEqualTo(12345L); - assertThat(producerProps.get(ProducerConfig.COMPRESSION_TYPE_CONFIG)) - .isEqualTo("gzip"); - assertThat(producerProps.get(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG)) + assertThat(configs.get(ProducerConfig.BUFFER_MEMORY_CONFIG)).isEqualTo(12345L); + assertThat(configs.get(ProducerConfig.COMPRESSION_TYPE_CONFIG)).isEqualTo("gzip"); + assertThat(configs.get(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG)) .isEqualTo(LongSerializer.class); - assertThat(producerProps.get(SslConfigs.SSL_KEY_PASSWORD_CONFIG)).isEqualTo("p4"); - assertThat((String) producerProps.get(SslConfigs.SSL_KEYSTORE_LOCATION_CONFIG)) + assertThat(configs.get(SslConfigs.SSL_KEY_PASSWORD_CONFIG)).isEqualTo("p4"); + assertThat((String) configs.get(SslConfigs.SSL_KEYSTORE_LOCATION_CONFIG)) .endsWith(File.separator + "ksLocP"); - assertThat(producerProps.get(SslConfigs.SSL_KEYSTORE_PASSWORD_CONFIG)) - .isEqualTo("p5"); - assertThat((String) producerProps.get(SslConfigs.SSL_TRUSTSTORE_LOCATION_CONFIG)) + assertThat(configs.get(SslConfigs.SSL_KEYSTORE_PASSWORD_CONFIG)).isEqualTo("p5"); + assertThat((String) configs.get(SslConfigs.SSL_TRUSTSTORE_LOCATION_CONFIG)) .endsWith(File.separator + "tsLocP"); - assertThat(producerProps.get(SslConfigs.SSL_TRUSTSTORE_PASSWORD_CONFIG)) + assertThat(configs.get(SslConfigs.SSL_TRUSTSTORE_PASSWORD_CONFIG)) .isEqualTo("p6"); - assertThat(producerProps.get(ProducerConfig.RETRIES_CONFIG)).isEqualTo(2); - assertThat(producerProps.get(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG)) + assertThat(configs.get(ProducerConfig.RETRIES_CONFIG)).isEqualTo(2); + assertThat(configs.get(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG)) .isEqualTo(IntegerSerializer.class); } @Test public void listenerProperties() { load("spring.kafka.template.default-topic=testTopic", - "spring.kafka.listener.ack-mode=MANUAL", "spring.kafka.listener.ack-count=123", "spring.kafka.listener.ack-time=456", diff --git a/spring-boot-docs/src/main/asciidoc/spring-boot-features.adoc b/spring-boot-docs/src/main/asciidoc/spring-boot-features.adoc index 9d3acc52d6..eb1ebf2db6 100644 --- a/spring-boot-docs/src/main/asciidoc/spring-boot-features.adoc +++ b/spring-boot-docs/src/main/asciidoc/spring-boot-features.adoc @@ -4373,6 +4373,8 @@ used to declare a corresponding queue on the RabbitMQ instance if necessary. You can enable retries on the `AmqpTemplate` to retry operations, for example in the event the broker connection is lost. Retries are disabled by default. + + [[boot-features-using-amqp-receiving]] ==== Receiving a message When the Rabbit infrastructure is present, any bean can be annotated with @@ -4455,9 +4457,7 @@ reached. [[boot-features-kafka]] - === Apache Kafka Support - http://kafka.apache.org/[Apache Kafa] is supported by providing auto-configuration of the `spring-kafka` project. @@ -4476,8 +4476,8 @@ for more of the supported options. +[[boot-features-kafka-sending-a-message]] === Sending a Message - Spring's `KafkaTemplate` is auto-configured and you can autowire them directly in your own beans: @@ -4500,8 +4500,8 @@ public class MyBean { +[[boot-features-kafka-receiving-a-message]] === Receiving a Message - When the Apache Kafka infrastructure is present, any bean can be annotated with `@KafkaListener` to create a listener endpoint. If no `KafkaListenerContainerFactory` has been defined, a default one is configured automatically with keys defined in @@ -4509,7 +4509,6 @@ has been defined, a default one is configured automatically with keys defined in The following component creates a listener endpoint on the `someTopic` topic: - [source,java,indent=0] ---- @Component @@ -4525,9 +4524,8 @@ The following component creates a listener endpoint on the `someTopic` topic: -[[kafka-extra-props]] +[[boot-features-kafka-extra-props]] === Additional Kafka Properties - The properties supported by auto configuration are shown in <>. Note that these properties (hyphenated or camelCase) map directly to the Apache Kafka dotted properties for the most part, refer to the Apache @@ -4616,6 +4614,8 @@ Lastly, the most extreme (and rarely used) option is to create your own `RestTemplateBuilder` bean. This will switch off the auto-configuration of a `RestTemplateBuilder` and will prevent any `RestTemplateCustomizer` beans from being used. + + [[boot-features-email]] == Sending email The Spring Framework provides an easy abstraction for sending email using the