package util.jms.requestor import java.io.Serializable import javax.jms.Message import javax.jms.QueueConnectionFactory import javax.jms.Session import javax.jms.ObjectMessage import javax.jms.TextMessage abstract class AbstractRequestor( queueName: String, private val shared: Boolean = false ) : Requestor { private val connectionFactory: QueueConnectionFactory = this.getFactory() private val connection = connectionFactory.createQueueConnection() .also { it.start() } private val mainSession = connection.createQueueSession( false, Session.AUTO_ACKNOWLEDGE ) private val queue = mainSession.createQueue(queueName) private val sender = mainSession.createSender(queue) private val secondarySession = connection.createQueueSession( false, Session.AUTO_ACKNOWLEDGE ) private val replyQueue = secondarySession.createTemporaryQueue() private var receiver = if (!shared) secondarySession.createReceiver(replyQueue) else null override fun request(message: Message): Message { message.jmsReplyTo = replyQueue sender.send(message) if (shared) receiver = secondarySession.createReceiver( replyQueue, "JMSCorrelationID = '${message.jmsMessageID}'" ) return receiver!!.receive() } override fun createTextMessage(text: String): TextMessage = mainSession.createTextMessage(text) override fun createObjectMessage(obj: Serializable?): ObjectMessage = mainSession.createObjectMessage(obj) override fun createMessage(): Message = mainSession.createMessage() override fun close() { mainSession.close() secondarySession.close() connection.close() } abstract fun getFactory(uri: String = "tcp://localhost:61616"): QueueConnectionFactory }