Alexey Soshin has a great blog post: Understanding Vert.x: Event Bus. In the blog post he explains how to extend MessageCodec
interface and start sending objects via Event Bus without paying anything for serialization.
SIP3 is a monitoring and troubleshooting platform that has to handle hundreds of thousands SIP packets and millions of RTP packets per second. That's why we've started using this approach from the very beginning. However, as a Kotlin users, we couldn't do not add some sugar 🍬🍭🍰.
Here is our recipe:
🍬 Register MessageCodec
Let's use Kotlin method extensions to define our local codec:
fun Vertx.registerLocalCodec() {
eventBus().unregisterCodec("local")
eventBus().registerCodec(object : MessageCodec<Any, Any> {
override fun decodeFromWire(pos: Int, buffer: Buffer?) = throw NotImplementedError()
override fun encodeToWire(buffer: Buffer?, s: Any?) = throw NotImplementedError()
override fun transform(s: Any?) = s
override fun name() = "local"
override fun systemCodecID(): Byte = -1
})
}
All is left is just to register our codec explicitly while initializing Vertx
object.
🍭 Extend EventBus
Kotlin has two great features - method extensions and named arguments. We decided to use a combination of those to introduce a custom method called localSend
:
object EventBusUtil {
val USE_LOCAL_CODEC = deliveryOptionsOf(codecName = "local", localOnly = true)
}
fun EventBus.localSend(address: String, message: Any, options: DeliveryOptions? = null) {
options?.apply {
codecName = "local"
isLocalOnly = true
}
send(address, message, options ?: USE_LOCAL_CODEC)
}
🍰 Just enjoy
Now we can start sending messages within the application without paying for serialization:
fun main() {
val vertx = Vertx.vertx()
vertx.registerLocalCodec()
val answer = BigDecimal(42)
vertx.eventBus().localSend("question", answer)
}
I hope you loved the approach and will start using it in your projects. If you have any questions, just leave me a message 😄
Happy coding...
Top comments (0)