Re: JMS and Clojure?
Looks interesting. I would try to limit external dependencies by taking out Spring. I have a tiny abstraction layer for JMS written in Java (and another in JavaFX), where I feed in a Properties object with all the parameters (server location, authentication, etc.) and get quick access to various topic consumers and producers. I suspect that involving the properties object is not going to be very idiomatic clojure. On Nov 24, 8:50 pm, Luc Prefontaine [EMAIL PROTECTED] wrote: We use a synchronous layer to JMS queues implemented in Java to hook our Clojure code to the messaging world. Two Java classes to implement a consumer and a producer with some common inheritance are used. We had already some Java implementation so we just beefed it up a bit to make more robust. We use Spring to load beans so loading a consumer look like this: (defn create-producer-consumer [name] (get-bean name) ) The Spring bean being something similar to this: bean id=connectionFactoryBean class=org.apache.activemq.pool.PooledConnectionFactory property name=connectionFactory ref=connectionSimpleFactoryBean / /bean bean id=busMessageQConsumer class=com.softaddicts.products.higiebus.tools.jms.Consumer property name=subject value=HIGIEBUS.QUEUES.BUS_DATA?consumer.exclusive=true / property name=connectionFactory ref=connectionFactoryBean / property name=transacted value=true / property name=name value=HIGIEBUSRouting / property name=ackMode value=CLIENT_ACKNOWLEDGE / /bean Now we have small wrappers in Clojure like these: (defn read-message Consume messages [consumer] (. consumer receive) ) (deftrace send-message ;; Send messages [producer msg] (. producer send msg) ) (defn peek-text-message Peek at messages [consumer] (let [message (. consumer browse)] (if (not (nil? message)) (. message getText)) ) ) and so on for commits, rollbacks, . The Java classes handle connection/release of resources, cleanup when the JVM exits, We use the wrappers to protect ourselves from later changes in the implementation. We use ActiveMq 5.1 with master slave redundancy. Eventually we want to create a wrapper to allow Clojure functions to be called asynchronously but we are not there yet, mainly because we have other priorities. Using the Spring framework is certainly is a viable option, we look at to reuse existing code and getting Clojure code called directly in an asynchronous fashion. We start the consumers in separate thread. polling for messages through read-message and consort. This at least gives us some asynchronous processing illusion for the moment. We expect to shrink the Java code down to a certain size in the next months and shift more stuff to Clojure but meanwhile we had to take the shortest path and that implied reusing existing stuff from the first stage prototype. We are scheduled to be in production in the next 8 weeks. Clojure was targeted for the routing layer in our message bus, that's were the immediate benefits are (dispatch logic, message cloning, ...) For now we have a resilient implementation ready for production so it's satisfactory considering I heard about Clojure in September... Since the beta book is in progress, i am also catching up rapidly about the language and expect to spit out more elegant code in the near future :))) Luc On Mon, 2008-11-24 at 16:36 -0800, falcon wrote: What is the best way of accessing Java Messaging Service though Clojure? Sounds like Rich has already experimented, with good results: rhickey: I did some playing (in Clojure) with JMS and OpenMQ and it was awesome, easy, fun and vert fast, with pro level docs from Sun (http://clojure-log.n01se.net/date/2008-09-08.html) Thanks --~--~-~--~~~---~--~~ You received this message because you are subscribed to the Google Groups Clojure group. To post to this group, send email to clojure@googlegroups.com To unsubscribe from this group, send email to [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/clojure?hl=en -~--~~~~--~~--~--~---
JMS and Clojure?
What is the best way of accessing Java Messaging Service though Clojure? Sounds like Rich has already experimented, with good results: rhickey: I did some playing (in Clojure) with JMS and OpenMQ and it was awesome, easy, fun and vert fast, with pro level docs from Sun (http://clojure-log.n01se.net/date/2008-09-08.html) Thanks --~--~-~--~~~---~--~~ You received this message because you are subscribed to the Google Groups Clojure group. To post to this group, send email to clojure@googlegroups.com To unsubscribe from this group, send email to [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/clojure?hl=en -~--~~~~--~~--~--~---
Re: JMS and Clojure?
We use a synchronous layer to JMS queues implemented in Java to hook our Clojure code to the messaging world. Two Java classes to implement a consumer and a producer with some common inheritance are used. We had already some Java implementation so we just beefed it up a bit to make more robust. We use Spring to load beans so loading a consumer look like this: (defn create-producer-consumer [name] (get-bean name) ) The Spring bean being something similar to this: bean id=connectionFactoryBean class=org.apache.activemq.pool.PooledConnectionFactory property name=connectionFactory ref=connectionSimpleFactoryBean / /bean bean id=busMessageQConsumer class=com.softaddicts.products.higiebus.tools.jms.Consumer property name=subject value=HIGIEBUS.QUEUES.BUS_DATA?consumer.exclusive=true / property name=connectionFactory ref=connectionFactoryBean / property name=transacted value=true / property name=name value=HIGIEBUSRouting / property name=ackMode value=CLIENT_ACKNOWLEDGE / /bean Now we have small wrappers in Clojure like these: (defn read-message Consume messages [consumer] (. consumer receive) ) (deftrace send-message ;;Send messages [producer msg] (. producer send msg) ) (defn peek-text-message Peek at messages [consumer] (let [message (. consumer browse)] (if (not (nil? message)) (. message getText)) ) ) and so on for commits, rollbacks, . The Java classes handle connection/release of resources, cleanup when the JVM exits, We use the wrappers to protect ourselves from later changes in the implementation. We use ActiveMq 5.1 with master slave redundancy. Eventually we want to create a wrapper to allow Clojure functions to be called asynchronously but we are not there yet, mainly because we have other priorities. Using the Spring framework is certainly is a viable option, we look at to reuse existing code and getting Clojure code called directly in an asynchronous fashion. We start the consumers in separate thread. polling for messages through read-message and consort. This at least gives us some asynchronous processing illusion for the moment. We expect to shrink the Java code down to a certain size in the next months and shift more stuff to Clojure but meanwhile we had to take the shortest path and that implied reusing existing stuff from the first stage prototype. We are scheduled to be in production in the next 8 weeks. Clojure was targeted for the routing layer in our message bus, that's were the immediate benefits are (dispatch logic, message cloning, ...) For now we have a resilient implementation ready for production so it's satisfactory considering I heard about Clojure in September... Since the beta book is in progress, i am also catching up rapidly about the language and expect to spit out more elegant code in the near future :))) Luc On Mon, 2008-11-24 at 16:36 -0800, falcon wrote: What is the best way of accessing Java Messaging Service though Clojure? Sounds like Rich has already experimented, with good results: rhickey: I did some playing (in Clojure) with JMS and OpenMQ and it was awesome, easy, fun and vert fast, with pro level docs from Sun (http://clojure-log.n01se.net/date/2008-09-08.html) Thanks --~--~-~--~~~---~--~~ You received this message because you are subscribed to the Google Groups Clojure group. To post to this group, send email to clojure@googlegroups.com To unsubscribe from this group, send email to [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/clojure?hl=en -~--~~~~--~~--~--~---