lm-sistemi-software-distrib.../src/main/kotlin/drills/drill07/exercise3/replier/AbstarctReplier.kt

57 lines
1.7 KiB
Kotlin

package drills.drill07.exercise3.replier
import javax.jms.Message
import javax.jms.Queue
import javax.jms.QueueConnectionFactory
import javax.jms.Session
import javax.jms.ObjectMessage
import javax.jms.TextMessage
abstract class AbstarctReplier(
queueName: String,
private val shared: Boolean = false
) : Replier {
private val factory: QueueConnectionFactory = this.getFactory()
private val connection = factory.createQueueConnection()
private val session = connection.createQueueSession(
false,
Session.AUTO_ACKNOWLEDGE
)
private val mainQueue = session.createQueue(queueName)
private val receiver = session.createReceiver(mainQueue)
private val secondarySession = connection.createQueueSession(
false,
Session.AUTO_ACKNOWLEDGE
)
override fun onRequest(buildResponse: (Message) -> Message) {
receiver.setMessageListener {
val replyQueue = it.jmsReplyTo as Queue
val sender = secondarySession.createSender(replyQueue)
val replyMessage = buildResponse(it)
if (shared)
replyMessage.jmsCorrelationID = it.jmsMessageID
sender.send(replyMessage)
}
}
override fun createTextMessage(text: String): TextMessage = session.createTextMessage(text)
override fun createObjectMessage(): ObjectMessage = session.createObjectMessage()
override fun createMessage(): Message = session.createMessage()
override fun start() {
connection.start()
}
override fun close() {
session.close()
connection.close()
}
abstract fun getFactory(uri: String = "tcp://localhost:61616"): QueueConnectionFactory
}