Easing simple Message-oriented Middleware (MoM) Tasks with Clojure (and Java)
HTML Clojure Other
Permalink
Failed to load latest commit information.
benchmark
dist
ghpages
src-java/bowerick
src/bowerick
test
.gitignore
.travis.yml
README.md
project.clj

README.md

bowerick

Easing Simple Message-oriented Middleware Tasks with Clojure (and Java)

Status

Latest Available Version

Clojars Project

Continuous Integration

Build Status

Test Coverage

Coverage Status

Detailed Test Results

Detailed test results are available as well: http://ruedigergad.github.io/bowerick/test-results/html/

Blog Posts

On my website, I wrote some blog posts about bowerick:

https://ruedigergad.com/category/libs/bowerick/

In these blog posts, I make announcements about bowerick and discuss selected aspects of bowerick in more detail.

Documentation

Examples

Minimal Working Example

; Can also be run in: lein repl
(require '[bowerick.jms :as jms])
(def url "tcp://127.0.0.1:61616")
(def destination "/topic/my.test.topic")
(def brkr (jms/start-broker url))
(def consumer (jms/create-json-consumer url destination (fn [data] (println "Received:" data))))
(def producer (jms/create-json-producer url destination))
(producer "foo")
; nilReceived: foo
(producer '(1 7 0 1))
; nilReceived: (1 7 0 1)
(jms/close producer)
(jms/close consumer)
(jms/stop brkr)
; (quit)

Multiple Transports

; Can also be run in: lein repl
(require '[bowerick.jms :as jms])
(def urls ["tcp://127.0.0.1:61616" "stomp://127.0.0.1:61617" "ws://127.0.0.1:61618" "mqtt://127.0.0.1:61619"])
(def destination "/topic/my.test.topic")
(def brkr (jms/start-broker urls))
(def consumers (doall (map-indexed (fn [idx url] (jms/create-json-consumer url destination (fn [data] (Thread/sleep (* 100 idx)) (println "Received" url data)))) urls)))
(def producer (jms/create-json-producer (first urls) destination))
(producer "foo")
; Received tcp://127.0.0.1:61616 foo
; Received stomp://127.0.0.1:61617 foo
; Received ws://127.0.0.1:61618 foo
; Received mqtt://127.0.0.1:61619 foo
(jms/close producer)
(doseq [consumer consumers] (jms/close consumer))
(jms/stop brkr)
; (quit)

Pooled Operation

; Can also be run in: lein repl
(require '[bowerick.jms :as jms])
(def url "tcp://127.0.0.1:61616")
(def destination "/topic/my.test.topic")
(def brkr (jms/start-broker url))
(def pool-size 3)
(def consumer (jms/create-json-consumer url destination (fn [data] (println "Received:" data)) pool-size))
(def producer (jms/create-json-producer url destination pool-size))
(producer "foo")
(producer [1 7 0 1])
(producer 42.0)
; nilReceived: foo
; Received: [1 7 0 1]
; Received: 42.0
(jms/close producer)
(jms/close consumer)
(jms/stop brkr)
; (quit)

API Docs

API docs are available: http://ruedigergad.github.io/bowerick/doc/

Cheat Sheet

Transport Connections

  • Encrypted

    • OpenWire via TCP (with optional client authentication)

      ssl://127.0.0.1:42425

      ssl://127.0.0.1:42425?needClientAuth=true

    • STOMP via TCP (with optional client authentication)

      stomp+ssl://127.0.0.1:42423

      stomp+ssl://127.0.0.1:42423?needClientAuth=true

    • STOMP via WebSockets (with optional client authentication)

      wss://127.0.0.1:42427

      wss://127.0.0.1:42427?needClientAuth=true

    • MQTT via TCP (with optional client authentication)

      mqtt+ssl://127.0.0.1:42429

      mqtt+ssl://127.0.0.1:42429?needClientAuth=true

  • Unencrypted

    • OpenWire via TCP

      tcp://127.0.0.1:42424

    • OpenWire via UDP

      udp://127.0.0.1:42426

    • STOMP via TCP

      stomp://127.0.0.1:42422

    • STOMP via WebSocket

      ws://127.0.0.1:42428

    • MQTT via TCP

      mqtt://127.0.0.1:42430

Serialization, Compression, and Pooling

Placeholders Used in the Cheat Sheet Examples

(def server-url "tcp://127.0.0.1:42424")
(def destination-description "/topic/my.topic.name")
(def pool-size 10)
(defn callback-fn [data] (println data))
  • Default Serialization

    (create-producer server-url destination-description pool-size)

    (create-consumer server-url destination-description callback-fn pool-size)

  • JSON Serialization (Using Cheshire)

    (create-json-producer server-url destination-description pool-size)

    (create-json-consumer server-url destination-description callback-fn pool-size)

  • Carbonite (Kryo) Serialization

    (create-carbonite-producer server-url destination-description pool-size)

    (create-carbonite-consumer server-url destination-description callback-fn pool-size)

  • Carbonite (Kryo) Serialization with LZF Compression

    (create-carbonite-lzf-producer server-url destination-description pool-size)

    (create-carbonite-lzf-consumer server-url destination-description callback-fn pool-size)

  • Nippy Serialization

    (create-nippy-producer server-url destination-description pool-size)

    (create-nippy-consumer server-url destination-description callback-fn pool-size)

  • Nippy Serialization with Compression (LZ4, Snappy, LZMA2)

    (create-nippy-producer server-url destination-description pool-size {:compressor taoensso.nippy/lz4-compressor})

    (create-nippy-producer server-url destination-description pool-size {:compressor taoensso.nippy/snappy-compressor})

    (create-nippy-producer server-url destination-description pool-size {:compressor taoensso.nippy/lzma2-compressor})

  • Nippy Serialization with LZF Compression

    (create-nippy-lzf-producer server-url destination-description pool-size)

    (create-nippy-lzf-consumer server-url destination-description callback-fn pool-size)

License

Copyright © 2016 Ruediger Gad

Copyright © 2014, 2015 Frankfurt University of Applied Sciences

Distributed under the Eclipse Public License either version 1.0 or (at your option) any later version.