diff --git a/webapp/src/main/java/edu/si/trellis/CassandraContext.java b/webapp/src/main/java/edu/si/trellis/CassandraContext.java index b370fd0..07344eb 100644 --- a/webapp/src/main/java/edu/si/trellis/CassandraContext.java +++ b/webapp/src/main/java/edu/si/trellis/CassandraContext.java @@ -109,6 +109,36 @@ public ConsistencyLevel rdfWriteConsistency() { return rdfWriteConsistency; } + @Inject + @Config(value = { "cassandra.connectionTimeout", "CASSANDRA_CONNECTION_TIMEOUT" }, defaultValue = "5000") + private int connectTimeoutMillis; + + @Inject + @Config(value = { "cassandra.readTimeout", "CASSANDRA_READ_TIMEOUT" }, defaultValue = "12000") + private int readTimeoutMillis; + + /** + * The timeout for making a connection to Cassandra, in ms. * + * + * @see SocketOptions#setReadTimeoutMillis(int) + */ + @Produces + @ConnectionTimeout + private int connectTimeoutMillis() { + return connectTimeoutMillis; + } + + /** + * The timeout for reading from a connection to Cassandra, in ms. + * + * @see SocketOptions#setConnectTimeoutMillis(int) + */ + @Produces + @ReadTimeout + private int readTimeoutMillis() { + return readTimeoutMillis; + } + private Cluster cluster; private Session session; @@ -129,10 +159,13 @@ public ConsistencyLevel rdfWriteConsistency() { @PostConstruct public void connect() { log.info("Using Cassandra node address: {} and port: {}", contactAddress, contactPort); + log.info("Using connection timeout: {} and read timeout: { in ms.}", connectTimeoutMillis, readTimeoutMillis); log.debug("Looking for connection..."); + SocketOptions socketOptions = new SocketOptions().setConnectTimeoutMillis(connectTimeoutMillis) + .setReadTimeoutMillis(readTimeoutMillis); this.cluster = Cluster.builder().withTimestampGenerator(new AtomicMonotonicTimestampGenerator()) .withoutJMXReporting().withoutMetrics().addContactPoint(contactAddress) - .withPort(parseInt(contactPort)).build(); + .withPort(parseInt(contactPort)).withSocketOptions(socketOptions).build(); if (log.isDebugEnabled()) cluster.register(QueryLogger.builder().build()); cluster.getConfiguration().getCodecRegistry().register(STANDARD_CODECS); Timer connector = new Timer("Cassandra Connection Maker", true); diff --git a/webapp/src/main/java/edu/si/trellis/ConnectionTimeout.java b/webapp/src/main/java/edu/si/trellis/ConnectionTimeout.java new file mode 100644 index 0000000..58f6ec9 --- /dev/null +++ b/webapp/src/main/java/edu/si/trellis/ConnectionTimeout.java @@ -0,0 +1,16 @@ +package edu.si.trellis; + +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; + +import javax.inject.Qualifier; + +/** + * The timeout for making a connection to Cassandra, in ms. + */ +@Documented +@Retention(RUNTIME) +@Qualifier +public @interface ConnectionTimeout {} diff --git a/webapp/src/main/java/edu/si/trellis/ReadTimeout.java b/webapp/src/main/java/edu/si/trellis/ReadTimeout.java new file mode 100644 index 0000000..9e7b24a --- /dev/null +++ b/webapp/src/main/java/edu/si/trellis/ReadTimeout.java @@ -0,0 +1,18 @@ +package edu.si.trellis; + +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; + +import javax.inject.Qualifier; + +/** + * The timeout for reading from a connection to Cassandra, in ms. + */ +@Documented +@Retention(RUNTIME) +@Qualifier +public @interface ReadTimeout { + +}