diff --git a/akka-docs/src/main/paradox/serialization-jackson.md b/akka-docs/src/main/paradox/serialization-jackson.md index dabe78e28c..f7eaca74ce 100644 --- a/akka-docs/src/main/paradox/serialization-jackson.md +++ b/akka-docs/src/main/paradox/serialization-jackson.md @@ -288,7 +288,8 @@ than the following configuration are compressed with GZIP. @@snip [reference.conf](/akka-serialization-jackson/src/main/resources/reference.conf) { #compression } -TODO: The binary formats are currently also compressed. That may change since it might not be needed for those. +Compression can be disabled by setting this configuration property to `off`. It will still be able to decompress +payloads that were compressed when serialized, e.g. if this configuration is changed. ## Additional configuration diff --git a/akka-serialization-jackson/src/main/resources/reference.conf b/akka-serialization-jackson/src/main/resources/reference.conf index 5ada020353..664db178c6 100644 --- a/akka-serialization-jackson/src/main/resources/reference.conf +++ b/akka-serialization-jackson/src/main/resources/reference.conf @@ -27,7 +27,8 @@ akka.serialization.jackson { #//#compression akka.serialization.jackson { # The serializer will compress the payload when it's larger than this value. - compress-larger-than = 10 KiB + # Compression can be disabled with value 'off'. + compress-larger-than = 32 KiB } #//#compression diff --git a/akka-serialization-jackson/src/main/scala/akka/serialization/jackson/JacksonSerializer.scala b/akka-serialization-jackson/src/main/scala/akka/serialization/jackson/JacksonSerializer.scala index ea89b7bb92..a832900ca2 100644 --- a/akka-serialization-jackson/src/main/scala/akka/serialization/jackson/JacksonSerializer.scala +++ b/akka-serialization-jackson/src/main/scala/akka/serialization/jackson/JacksonSerializer.scala @@ -22,6 +22,7 @@ import akka.event.Logging import akka.serialization.BaseSerializer import akka.serialization.SerializationExtension import akka.serialization.SerializerWithStringManifest +import akka.util.Helpers.toRootLowerCase import com.fasterxml.jackson.databind.ObjectMapper import com.fasterxml.jackson.databind.jsontype.impl.SubTypeValidator import com.fasterxml.jackson.dataformat.cbor.CBORFactory @@ -141,7 +142,13 @@ import com.fasterxml.jackson.dataformat.smile.SmileFactory private val conf = JacksonObjectMapperProvider.configForBinding(bindingName, system.settings.config) private val isDebugEnabled = conf.getBoolean("verbose-debug-logging") && log.isDebugEnabled private final val BufferSize = 1024 * 4 - private val compressLargerThan: Long = conf.getBytes("compress-larger-than") + private val compressLargerThan: Long = { + val key = "compress-larger-than" + toRootLowerCase(conf.getString(key)) match { + case "off" => Long.MaxValue + case _ => conf.getBytes(key) + } + } private val migrations: Map[String, JacksonMigration] = { import scala.collection.JavaConverters._ conf.getConfig("migrations").root.unwrapped.asScala.toMap.map { @@ -175,7 +182,6 @@ import com.fasterxml.jackson.dataformat.smile.SmileFactory checkAllowedSerializationBindings() val startTime = if (isDebugEnabled) System.nanoTime else 0L val bytes = objectMapper.writeValueAsBytes(obj) - // FIXME investigate if compression should be used for the binary formats val result = if (bytes.length > compressLargerThan) compress(bytes) else bytes @@ -254,8 +260,8 @@ import com.fasterxml.jackson.dataformat.smile.SmileFactory "Deserialization of [{}] took [{}] µs, compressed size [{}] bytes, uncompressed size [{}] bytes", clazz.getName, durationMicros, - decompressBytes.length, - bytes.length) + bytes.length, + decompressBytes.length) } result