Let's start with Java 8.
First the definition of two functional interfaces:
import javax.jms.Session; @FunctionalInterface public interface MessagingSession { void withSession(final Session session); }and import javax.jms.MessageProducer;
@FunctionalInterface public interface MessagingProducer { void produce(final MessageProducer producer); }The main class:
import javax.jms.Connection; import javax.jms.ConnectionFactory; import javax.jms.Destination; import javax.jms.Session; import javax.jms.TextMessage; import org.apache.activemq.ActiveMQConnectionFactory; public class Messaging { private final boolean transacted = false; private final int ackMode = Session.AUTO_ACKNOWLEDGE; private final ConnectionFactory connectionFactory; private final Connection connection; private Session session = null; public Messaging() throws Exception { this.connectionFactory = new ActiveMQConnectionFactory("vm://localhost"); this.connection = connectionFactory.createConnection(); connection.start(); } public Destination createQueue(final String qn) throws Exception { return session.createQueue(qn); } public TextMessage createTextMessage(final String text) throws Exception { return session.createTextMessage(text); } public void withSession(final MessagingSession messagingSession) throws Exception { session = connection.createSession(transacted, ackMode); messagingSession.withSession(session); } public void withProducer(final Destination destination, final MessagingProducer messagingProducer) throws Exception { messagingProducer.produce(session.createProducer(destination)); } }And a demo class - how to use the above:
import javax.jms.Destination; import javax.jms.TextMessage; public class JavaMessagingDemo { public static void main(String[] args) throws Exception { final Messaging messaging = new Messaging(); messaging.withSession((session) -> { try { final Destination destination = messaging.createQueue("ANOTHER.QUEUE"); messaging.withProducer(destination, (producer) -> { try { final TextMessage message = messaging.createTextMessage("MY.MESSAGE"); producer.send(message); } catch (Exception e) { e.printStackTrace(); } }); } catch (Exception e) { e.printStackTrace(); } }); } }
In Scala 2.11:
import javax.jms.Session import org.apache.activemq.ActiveMQConnectionFactory import javax.jms.Destination import javax.jms.MessageProducer object Messaging { val transacted = false val ackMode = Session.AUTO_ACKNOWLEDGE val connectionFactory = new ActiveMQConnectionFactory("vm://localhost") val connection = connectionFactory.createConnection connection.start implicit def jms2richsession(session: Session) = new EnrichedJMSSession(session) def withSession(f: Session => Unit) = f(connection.createSession(transacted, ackMode)) class EnrichedJMSSession(val session: Session) { def withProducer(dest: Destination)(f: MessageProducer => Unit) = f(session.createProducer(dest)) } } object ScalaDemo { import Messaging._ def main(args: Array[String]): Unit = { withSession { session => val dest = session.createQueue("MY.QUEUE") session.withProducer(dest) { producer => val message = session.createTextMessage("Some message") producer.send(message) } } } }
No comments:
Post a Comment