package util.jms.replier import java.io.Serializable 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 mainSession = connection.createQueueSession( false, Session.AUTO_ACKNOWLEDGE ) private val mainQueue = mainSession.createQueue(queueName) private val receiver = mainSession.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 = mainSession.createTextMessage(text) override fun createObjectMessage(obj: Serializable?): ObjectMessage = mainSession.createObjectMessage(obj) override fun createMessage(): Message = mainSession.createMessage() override fun start() { connection.start() } override fun close() { mainSession.close() connection.close() } abstract fun getFactory(uri: String = "tcp://localhost:61616"): QueueConnectionFactory }