Spring Framework 提供了与消息系统集成的广泛支持,从使用
当 ActiveMQ 在类路径上可用时,Spring Boot 可以配置
ActiveMQ 配置由 Spring 中的外部配置属性 spring.activemq.broker-url=tcp://192.168.1.210:9876 spring.activemq.user=admin spring.activemq.password=secret
默认情况下, spring.jms.cache.session-cache-size=5
如果你愿意使用本地池,可以通过向 spring.activemq.pool.enabled=true spring.activemq.pool.max-connections=50
默认情况下,ActiveMQ 创建一个目的地,如果它还不存在,那么目的地是根据其提供的名称来解决的。
当 Spring Boot 检测到 Artemis 在类路径上可用时,它会自动配置
Artemis 配置由 spring.artemis.mode=native spring.artemis.host=192.168.1.210 spring.artemis.port=9876 spring.artemis.user=admin spring.artemis.password=secret
在嵌入代理时,可以选择是否启用持久性,并列出应该使用的目的地。这些可以被指定为逗号分隔的列表,用默认选项创建它们,或者可以定义
默认情况下, spring.jms.cache.session-cache-size=5
如果你愿意使用本地池,可以通过向 spring.artemis.pool.enabled=true spring.artemis.pool.max-connections=50
更多支持的选项请参阅
不涉及 JNDI 查找,并且使用 Artemis 配置中的
如果在应用服务器中运行应用程序,Spring Boot 将尝试使用 JNDI 定位 JMS spring.jms.jndi-name=java:/MyConnectionFactory
Spring 的 import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jms.core.JmsTemplate; import org.springframework.stereotype.Component; @Component public class MyBean { private final JmsTemplate jmsTemplate; @Autowired public MyBean(JmsTemplate jmsTemplate) { this.jmsTemplate = jmsTemplate; } // ... }
当 JMS 基础结构存在时,任何 bean 都可以用
默认情况下,默认的工厂是事务性的。如果运行在存在
下面的组件在 @Component public class MyBean { @JmsListener(destination = "someQueue") public void processMessage(String content) { // ... } }
如果你需要创建更多的
例如,下面的示例使用特定 @Configuration static class JmsConfiguration { @Bean public DefaultJmsListenerContainerFactory myFactory( DefaultJmsListenerContainerFactoryConfigurer configurer) { DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory(); configurer.configure(factory, connectionFactory()); factory.setMessageConverter(myMessageConverter()); return factory; } }
然后,你可以在任何 @Component public class MyBean { @JmsListener(destination = "someQueue", containerFactory="myFactory") public void processMessage(String content) { // ... } }
高级消息队列协议(AMQP)是一个平台无关的、有线级协议的面向消息的中间件。Spring AMQP 项目将核心 Spring 概念应用于开发基于 AMQP 的消息解决方案。Spring Boot 通过 RabbitMQ 为 AMQP 提供了许多便利,包括
RabbitMQ 是基于 AMQP 协议的轻量级的、可靠的、可扩展的、可移植的消息代理。Spring 使用
RabbitMQ 配置是由外部配置 spring.rabbitmq.host=localhost spring.rabbitmq.port=5672 spring.rabbitmq.username=admin spring.rabbitmq.password=secret
如果上下文中存在一个
Spring 的 import org.springframework.amqp.core.AmqpAdmin; import org.springframework.amqp.core.AmqpTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component public class MyBean { private final AmqpAdmin amqpAdmin; private final AmqpTemplate amqpTemplate; @Autowired public MyBean(AmqpAdmin amqpAdmin, AmqpTemplate amqpTemplate) { this.amqpAdmin = amqpAdmin; this.amqpTemplate = amqpTemplate; } // ... }
如果需要,任何定义为 bean 的
若要重试操作,你可以在
当 Rabbit 基础设施存在时,任何 bean 都可以使用
下面的示例组件在 @Component public class MyBean { @RabbitListener(queues = "someQueue") public void processMessage(String content) { // ... } }
如果你需要创建更多的
例如,下面的配置类使用特定的 @Configuration static class RabbitConfiguration { @Bean public SimpleRabbitListenerContainerFactory myFactory( SimpleRabbitListenerContainerFactoryConfigurer configurer) { SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory(); configurer.configure(factory, connectionFactory); factory.setMessageConverter(myMessageConverter()); return factory; } }
然后,你可以在任何 @Component public class MyBean { @RabbitListener(queues = "someQueue", containerFactory="myFactory") public void processMessage(String content) { // ... } }
你可以启用重试来处理监听器抛出异常的情况。默认情况下,使用
Apache Kafka 是通过
Kafka 配置是由 spring.kafka.bootstrap-servers=localhost:9092 spring.kafka.consumer.group-id=myGroup
更多支持的选项请参阅
Spring 的 @Component public class MyBean { private final KafkaTemplate kafkaTemplate; @Autowired public MyBean(KafkaTemplate kafkaTemplate) { this.kafkaTemplate = kafkaTemplate; } // ... }
当 Apache Kafka 基础结构存在时,任何 bean 都可以用
下面的组件在 @Component public class MyBean { @KafkaListener(topics = "someTopic") public void processMessage(String content) { // ... } } 由自动配置支持的属性在附录 A, 常见的应用程序属性中展示。请注意,在大多数情况下,这些属性(连接符的或驼峰式)直接映射到 Apache Kafka 点属性。更多详细信息请参阅 Apache Kafka 文档。 这些属性中的前几个应用于生产者和消费者,但如果希望对每个用户使用不同的值,则可以在生产者或消费者级别指定。Apache Kafka 指定具有 HIGH, MEDIUM, 或 LOW 的重要性的属性。Spring Boot 自动配置支持所有 HIGH 重要性的属性,一些选定的 MEDIUM 和 LOW 的属性,以及任何没有默认值的属性。
只有 Kafka 支持的属性子集可以通过 spring.kafka.properties.prop.one=first spring.kafka.admin.properties.prop.two=second spring.kafka.consumer.properties.prop.three=third spring.kafka.producer.properties.prop.four=fourth
这就设置了,公共
你还可以配置 Spring Kafka spring.kafka.consumer.value-deserializer=org.springframework.kafka.support.serializer.JsonDeserializer spring.kafka.consumer.properties.spring.json.value.default.type=com.example.Invoice spring.kafka.consumer.properties.spring.json.trusted.packages=com.example,org.acme
类似的,你可以在头文件中发送类型信息时禁用 spring.kafka.producer.value-serializer=org.springframework.kafka.support.serializer.JsonSerializer spring.kafka.producer.properties.spring.json.add.type.headers=false
如果你需要从应用程序调用远程 REST 服务,可以使用 Spring Framework 的 下面的代码展示了一个典型的例子: @Service public class MyService { private final RestTemplate restTemplate; public MyService(RestTemplateBuilder restTemplateBuilder) { this.restTemplate = restTemplateBuilder.build(); } public Details someRestCall(String name) { return this.restTemplate.getForObject("/{name}/details", Details.class, name); } }
定制
为了使任何自定义的范围尽可能窄,注入自动配置的
为了在应用程序范围内进行广泛的定制,使用
下面的示例展示了一个定制器,它配置除了 static class ProxyCustomizer implements RestTemplateCustomizer { @Override public void customize(RestTemplate restTemplate) { HttpHost proxy = new HttpHost("proxy.example.com"); HttpClient httpClient = HttpClientBuilder.create() .setRoutePlanner(new DefaultProxyRoutePlanner(proxy) { @Override public HttpHost determineProxy(HttpHost target, HttpRequest request, HttpContext context) throws HttpException { if (target.getHostName().equals("192.168.0.5")) { return null; } return super.determineProxy(target, request, context); } }).build(); restTemplate.setRequestFactory( new HttpComponentsClientHttpRequestFactory(httpClient)); } }
最后,最极端的(也是很少使用的)选项是创建自己的
如果你的类路径上有 Spring WebFlux,也可以选择使用 Spring Boot 为你创建并预先配置这样的生成器。例如,客户端 HTTP 编码器以与服务器相同的方式配置(详见 WebFlux HTTP 编码器自动配置)。 下面的代码展示了一个典型的例子: @Service public class MyService { private final WebClient webClient; public MyService(WebClient.Builder webClientBuilder) { this.webClient = webClientBuilder.baseUrl("http://example.org").build(); } public Mono<Details> someRestCall(String name) { return this.webClient.get().url("/{name}/details", name) .retrieve().bodyToMono(Details.class); } }
为了使任何自定义的范围尽可能窄,注入自动配置的
为了对所有
最后,你可以回到原来的 API 并使用
只要一个 JSR-303 实现(如 Hibernate 验证器)在类路径上,Bean Validation 1.1 所支持的方法验证功能就会自动启用。这让 bean 中使用 例如,下面的服务触发第一个参数的验证,确保其大小在8到10之间: @Service @Validated public class MyBean { public Archive findByCodeAndAuthor(@Size(min = 8, max = 10) String code, Author author) { ... } }
Spring Framework 通过
如果 特别是,某些默认的超时值是无限的,并且你可能希望改变这一点,以避免由未响应邮件服务器阻塞线程,如下面的示例所示: spring.mail.properties.mail.smtp.connectiontimeout=5000 spring.mail.properties.mail.smtp.timeout=3000 spring.mail.properties.mail.smtp.writetimeout=5000
还可以从 JNDI 配置 spring.mail.jndi-name=mail/Session
当设置 Spring Boot 通过使用 Atomikos 或 Bitronix 嵌入式事务管理器来支持跨多个 XA 资源的分布式 JTA 事务。JTA 事务在部署到合适的 Java EE 应用服务器时也得到支持。
当检测到 JTA 环境时,Spring 的
Atomikos 是一种流行的开源事务管理器,可以嵌入到 Spring Boot 应用程序中。你可以使用
默认情况下,Atomikos 事务日志被写入应用程序的主目录(你应用程序 jar 文件驻留的目录)中的事务日志目录。通过在
Bitronix 是一个流行的开源 JTA 事务管理器实现。可以使用
默认情况下,Bitronix 事务日志文件(
Narayana 是一个流行的开源 JTA 事务管理器实现,由 JBoss 支持。你可以使用
默认情况下,Narayana 事务日志将写入应用程序主目录(你的应用程序 jar 文件驻留的目录)中的
如果将 Spring Boot 应用程序打包为
当使用 JTA 时,主 JMS
如果你想使用 non-XA
下面的示例展示了如何注入 // Inject the primary (XA aware) ConnectionFactory @Autowired private ConnectionFactory defaultConnectionFactory; // Inject the XA aware ConnectionFactory (uses the alias and injects the same as above) @Autowired @Qualifier("xaJmsConnectionFactory") private ConnectionFactory xaConnectionFactory; // Inject the non-XA aware ConnectionFactory @Autowired @Qualifier("nonXaJmsConnectionFactory") private ConnectionFactory nonXaConnectionFactory;
BitronixXAConnectionFactoryWrapper 和 BitronixXADataSourceWrapper 提供了如何编写 XA包装器的很好的例子。
如果 Hazelcast 在类路径上,并且找到了合适的配置,Spring Boot 会自动配置一个可以在你的应用程序中注入的
如果你定义了
你还可以指定配置使用的 spring.hazelcast.config=classpath:config/my-hazelcast.xml
否则,Spring Boot 尝试从默认位置查找 Hazelcast 配置:工作目录或类路径的根中的
如果
Spring Boot 为使用 Quartz 调度程序提供了许多便利,包括
以下类型的 bean 将被自动拾取并与
默认情况下,使用内存中的 spring.quartz.job-store-type=jdbc
当使用 JDBC 存储时,可以在启动时初始化该架构,如下面的示例所示: spring.quartz.jdbc.initialize-schema=always
Quartz 调度程序配置可以通过使用 Quartz 配置属性(
作业可以定义设置程序以注入数据映射属性。常规 bean 也可以以类似的方式注入,如下面的例子所示: public class SampleJob extends QuartzJobBean { private MyService myService; private String name; // Inject "MyService" bean public void setMyService(MyService myService) { ... } // Inject the "name" job data property public void setName(String name) { ... } @Override protected void executeInternal(JobExecutionContext context) throws JobExecutionException { ... } }
Spring Boot 为使用 Spring 集成提供了许多便利,包括
Spring Boot 还配置了有附加的 Spring 集成模块触发的一些特性。如果 spring.integration.jdbc.initialize-schema=always
更多细节请参阅
默认情况下,如果一个 Micrometer Spring Boot 为广泛的数据存储提供了 Spring 会话自动配置。在构建 Servlet web 应用程序时,可以自动配置以下存储区:
当构建一个响应式 Web 应用程序时,可以自动配置下列存储区:
如果一个单一的 Spring 会话模块出现在类路径上,Spring Boot 会自动使用该存储实现。如果有多个实现,则必须选择要用来存储会话的 spring.session.store-type=jdbc
每个存储都有特定的附加设置。例如,可以自定义 JDBC 存储的表名称,如下面的示例所示: spring.session.jdbc.table-name=SESSIONS
若要设置会话的超时,可以使用
Java 管理扩展(JMX)提供了一种监控和管理应用程序的标准机制。默认情况下,Spring Boot 创建具有
更多细节请参阅 |