I wrote this program to help me explore and understand JMS-Queue
(javax.jms.Queue). I was working with OpenJMS which comes bundled with
the GlassFish application server (running on Windows). In addition to
installing JDK-EE 1.5+GlassFish, you will need to include the
following jars in your Clojure classpath, to get this program to work:

set ssdk_lib=C:\Sun\SDK\lib
set jms_lib=%ssdk_lib%\install\applications\jmsra\imqjmsra.jar;
%ssdk_lib%\appserv-rt.jar;%ssdk_lib%\javaee.jar;%ssdk_lib%\appserv-
admin.jar

You will also need to define the following JMS resources -
"QueueConnectionFactory"(javax.jms.QueueConnectionFactory) and
"TestQueue" (javax.jms.Queue). I call the main function this way:
user=> (jms.jms-test/main)

Next, I will be writing some more code to understand JMS-Topic
(javax.jms.Topic). I will post that as well.

Regards,
John

Here is the code:

(ns jms.jms-test
  (:import (javax.naming InitialContext))
  (:import (java.util Properties))
  (:import (javax.jms Session QueueRequestor
                      MessageListener)))

(defn get-initial-context []
  (let [props (Properties.)]
    (doto props
      (. setProperty "java.naming.factory.initial"
         "com.sun.enterprise.naming.SerialInitContextFactory")
      (. setProperty "org.omg.CORBA.ORBInitialHost"
         "localhost")
      (. setProperty "org.omg.CORBA.ORBInitialPort"
         "3700"))
    (InitialContext. props)))

(defn get-message-text []
  (format "This is a test message: %d" (rand-int (int (* (rand)
10000)))))

(defn send-message-to-queue [qSender qSession]
  (let [message (.createTextMessage qSession)]
    (.setText message (get-message-text))
    (.send qSender message)))

(defn send-term-message-to-queue [qSender qSession]
  (.send qSender (.createMessage qSession)))

(defn send-n-messages-to-queue [qSender qSession num-messages]
  (loop [n num-messages]
    (if (zero? n)
      (do
        (send-term-message-to-queue qSender qSession)
        (println "*Done putting messages on queue!*"))
      (recur (do
               (send-message-to-queue qSender qSession)
               (dec n))))))

(defn process-queue-messages [qReceiver qConnection]
  (let [done-processing (ref false)]
    (.setMessageListener qReceiver
                         (proxy [MessageListener][]
                           (onMessage [message]
                                      (if (instance?
javax.jms.TextMessage message)
                                        (println (format "Read
message: %s" (.getText message)))
                                        (dosync (ref-set done-
processing true))))))
    (.start qConnection)
    (while (false? @done-processing)
           (Thread/sleep 1000)))
  (.close qConnection)
  (println "==Read all messages off the queue!!=="))

(defn main []
  (let [ctx (get-initial-context)
        qConFactory (.lookup ctx "QueueConnectionFactory")
        qConnection (.createQueueConnection qConFactory)
        qSession (.createQueueSession qConnection false Session/
AUTO_ACKNOWLEDGE)
        queue (.createQueue qSession "TestQueue")
        qSender (.createSender qSession queue)
        qReceiver (.createReceiver qSession queue)]
    (.start (Thread. (fn[] (send-n-messages-to-queue qSender qSession
10))))
    (.start (Thread. (fn[] (process-queue-messages qReceiver
qConnection))))))

-- 
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
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en

To unsubscribe from this group, send email to 
clojure+unsubscribegooglegroups.com or reply to this email with the words 
"REMOVE ME" as the subject.

Reply via email to