Browse Source

Polish "Add PoolingOptions to CasandraProperties"

Closes gh-7946
pull/4501/merge
Stephane Nicoll 9 years ago
parent
commit
ba1bc45a53
  1. 13
      spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cassandra/CassandraAutoConfiguration.java
  2. 117
      spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cassandra/CassandraProperties.java
  3. 41
      spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/cassandra/CassandraAutoConfigurationTests.java
  4. 4
      spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc

13
spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cassandra/CassandraAutoConfiguration.java

@ -17,10 +17,8 @@ @@ -17,10 +17,8 @@
package org.springframework.boot.autoconfigure.cassandra;
import java.util.List;
import java.util.Map;
import com.datastax.driver.core.Cluster;
import com.datastax.driver.core.HostDistance;
import com.datastax.driver.core.PoolingOptions;
import com.datastax.driver.core.QueryOptions;
import com.datastax.driver.core.SocketOptions;
@ -133,12 +131,13 @@ public class CassandraAutoConfiguration { @@ -133,12 +131,13 @@ public class CassandraAutoConfiguration {
}
private PoolingOptions getPoolingOptions() {
CassandraProperties.Pool pool = this.properties.getPool();
PoolingOptions options = new PoolingOptions();
options.setHeartbeatIntervalSeconds(this.properties.getHeartbeatIntervalSeconds());
options.setMaxQueueSize(this.properties.getMaxQueueSize());
for (Map.Entry<HostDistance, Integer> entry : this.properties.getMaxRequestsPerConnection().entrySet()) {
options.setMaxRequestsPerConnection(entry.getKey(), entry.getValue());
}
options.setIdleTimeoutSeconds(pool.getIdleTimeout());
options.setPoolTimeoutMillis(pool.getPoolTimeout());
options.setHeartbeatIntervalSeconds(pool.getHeartbeatInterval());
options.setMaxQueueSize(pool.getMaxQueueSize());
return options;
}
}

117
spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/cassandra/CassandraProperties.java

@ -1,5 +1,5 @@ @@ -1,5 +1,5 @@
/*
* Copyright 2012-2016 the original author or authors.
* Copyright 2012-2017 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -16,12 +16,7 @@ @@ -16,12 +16,7 @@
package org.springframework.boot.autoconfigure.cassandra;
import java.util.HashMap;
import java.util.Map;
import com.datastax.driver.core.ConsistencyLevel;
import com.datastax.driver.core.HostDistance;
import com.datastax.driver.core.PoolingOptions;
import com.datastax.driver.core.ProtocolOptions;
import com.datastax.driver.core.ProtocolOptions.Compression;
import com.datastax.driver.core.QueryOptions;
@ -38,6 +33,7 @@ import org.springframework.boot.context.properties.ConfigurationProperties; @@ -38,6 +33,7 @@ import org.springframework.boot.context.properties.ConfigurationProperties;
* @author Julien Dubois
* @author Phillip Webb
* @author Mark Paluch
* @author Stephane Nicoll
* @since 1.3.0
*/
@ConfigurationProperties(prefix = "spring.data.cassandra")
@ -118,21 +114,6 @@ public class CassandraProperties { @@ -118,21 +114,6 @@ public class CassandraProperties {
*/
private int readTimeoutMillis = SocketOptions.DEFAULT_READ_TIMEOUT_MILLIS;
/**
* Pooling option: heartbeat interval.
*/
private int heartbeatIntervalSeconds = PoolingOptions.DEFAULT_HEARTBEAT_INTERVAL_SECONDS;
/**
* Pooling option: max queue size.
*/
private int maxQueueSize = PoolingOptions.DEFAULT_MAX_QUEUE_SIZE;
/**
* Pooling option: max requests per connection.
*/
private Map<HostDistance, Integer> maxRequestsPerConnection = new HashMap<HostDistance, Integer>();
/**
* Schema action to take at startup.
*/
@ -143,6 +124,11 @@ public class CassandraProperties { @@ -143,6 +124,11 @@ public class CassandraProperties {
*/
private boolean ssl = false;
/**
* Pool configuration.
*/
private final Pool pool = new Pool();
public String getKeyspaceName() {
return this.keyspaceName;
}
@ -265,30 +251,6 @@ public class CassandraProperties { @@ -265,30 +251,6 @@ public class CassandraProperties {
this.readTimeoutMillis = readTimeoutMillis;
}
public int getHeartbeatIntervalSeconds() {
return this.heartbeatIntervalSeconds;
}
public void setHeartbeatIntervalSeconds(int heartbeatIntervalSeconds) {
this.heartbeatIntervalSeconds = heartbeatIntervalSeconds;
}
public int getMaxQueueSize() {
return this.maxQueueSize;
}
public void setMaxQueueSize(int maxQueueSize) {
this.maxQueueSize = maxQueueSize;
}
public Map<HostDistance, Integer> getMaxRequestsPerConnection() {
return this.maxRequestsPerConnection;
}
public void setMaxRequestsPerConnection(Map<HostDistance, Integer> maxRequestsPerConnection) {
this.maxRequestsPerConnection = maxRequestsPerConnection;
}
public boolean isSsl() {
return this.ssl;
}
@ -305,4 +267,69 @@ public class CassandraProperties { @@ -305,4 +267,69 @@ public class CassandraProperties {
this.schemaAction = schemaAction;
}
public Pool getPool() {
return this.pool;
}
/**
* Pool properties.
*/
public static class Pool {
/**
* Idle timeout (in seconds) before an idle connection is removed.
*/
private int idleTimeout = 120;
/**
* Pool timeout (in milliseconds) when trying to acquire a connection from a
* host's pool.
*/
private int poolTimeout = 5000;
/**
* Heartbeat interval (in seconds) after which a message is sent on an idle
* connection to make sure it's still alive.
*/
private int heartbeatInterval = 30;
/**
* Maximum number of requests that get enqueued if no connection is available.
*/
private int maxQueueSize = 256;
public int getIdleTimeout() {
return this.idleTimeout;
}
public void setIdleTimeout(int idleTimeout) {
this.idleTimeout = idleTimeout;
}
public int getPoolTimeout() {
return this.poolTimeout;
}
public void setPoolTimeout(int poolTimeout) {
this.poolTimeout = poolTimeout;
}
public int getHeartbeatInterval() {
return this.heartbeatInterval;
}
public void setHeartbeatInterval(int heartbeatInterval) {
this.heartbeatInterval = heartbeatInterval;
}
public int getMaxQueueSize() {
return this.maxQueueSize;
}
public void setMaxQueueSize(int maxQueueSize) {
this.maxQueueSize = maxQueueSize;
}
}
}

41
spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/cassandra/CassandraAutoConfigurationTests.java

@ -17,7 +17,7 @@ @@ -17,7 +17,7 @@
package org.springframework.boot.autoconfigure.cassandra;
import com.datastax.driver.core.Cluster;
import com.datastax.driver.core.HostDistance;
import com.datastax.driver.core.PoolingOptions;
import org.junit.After;
import org.junit.Test;
@ -82,27 +82,34 @@ public class CassandraAutoConfigurationTests { @@ -82,27 +82,34 @@ public class CassandraAutoConfigurationTests {
}
@Test
public void heartbeatInterval() {
load("spring.data.cassandra.heartbeat-interval-seconds=60");
assertThat(this.context.getBeanNamesForType(Cluster.class).length).isEqualTo(1);
Cluster cluster = this.context.getBean(Cluster.class);
assertThat(cluster.getConfiguration().getPoolingOptions().getHeartbeatIntervalSeconds()).isEqualTo(60);
}
@Test
public void maxQueueSize() {
load("spring.data.cassandra.max-queue-size=1024");
public void defaultPoolOptions() {
load();
assertThat(this.context.getBeanNamesForType(Cluster.class).length).isEqualTo(1);
Cluster cluster = this.context.getBean(Cluster.class);
assertThat(cluster.getConfiguration().getPoolingOptions().getMaxQueueSize()).isEqualTo(1024);
PoolingOptions poolingOptions = this.context.getBean(Cluster.class)
.getConfiguration().getPoolingOptions();
assertThat(poolingOptions.getIdleTimeoutSeconds())
.isEqualTo(PoolingOptions.DEFAULT_IDLE_TIMEOUT_SECONDS);
assertThat(poolingOptions.getPoolTimeoutMillis())
.isEqualTo(PoolingOptions.DEFAULT_POOL_TIMEOUT_MILLIS);
assertThat(poolingOptions.getHeartbeatIntervalSeconds())
.isEqualTo(PoolingOptions.DEFAULT_HEARTBEAT_INTERVAL_SECONDS);
assertThat(poolingOptions.getMaxQueueSize())
.isEqualTo(PoolingOptions.DEFAULT_MAX_QUEUE_SIZE);
}
@Test
public void maxRequestsPerConnection() {
load("spring.data.cassandra.max-requests-per-connection.local=100");
public void customizePoolOptions() {
load("spring.data.cassandra.pool.idle-timeout=42",
"spring.data.cassandra.pool.pool-timeout=52",
"spring.data.cassandra.pool.heartbeat-interval=62",
"spring.data.cassandra.pool.max-queue-size=72");
assertThat(this.context.getBeanNamesForType(Cluster.class).length).isEqualTo(1);
Cluster cluster = this.context.getBean(Cluster.class);
assertThat(cluster.getConfiguration().getPoolingOptions().getMaxRequestsPerConnection(HostDistance.LOCAL)).isEqualTo(100);
PoolingOptions poolingOptions = this.context.getBean(Cluster.class)
.getConfiguration().getPoolingOptions();
assertThat(poolingOptions.getIdleTimeoutSeconds()).isEqualTo(42);
assertThat(poolingOptions.getPoolTimeoutMillis()).isEqualTo(52);
assertThat(poolingOptions.getHeartbeatIntervalSeconds()).isEqualTo(62);
assertThat(poolingOptions.getMaxQueueSize()).isEqualTo(72);
}
private void load(String... environment) {

4
spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc

@ -595,6 +595,10 @@ content into your application; rather pick only the properties that you need. @@ -595,6 +595,10 @@ content into your application; rather pick only the properties that you need.
spring.data.cassandra.max-queue-size= # Pooling option: max queue size.
spring.data.cassandra.port= # Port of the Cassandra server.
spring.data.cassandra.password= # Login password of the server.
spring.data.cassandra.pool.heartbeat-interval=30 # Heartbeat interval (in seconds) after which a message is sent on an idle connection to make sure it's still alive.
spring.data.cassandra.pool.idle-timeout=120 # Idle timeout (in seconds) before an idle connection is removed.
spring.data.cassandra.pool.max-queue-size=256 # Maximum number of requests that get enqueued if no connection is available.
spring.data.cassandra.pool.pool-timeout=5000 # Pool timeout (in milliseconds) when trying to acquire a connection from a host's pool.
spring.data.cassandra.reactive-repositories.enabled=true # Enable Cassandra reactive repositories.
spring.data.cassandra.read-timeout-millis= # Socket option: read time out.
spring.data.cassandra.reconnection-policy= # Reconnection policy class.

Loading…
Cancel
Save