stomp-rs Travis CI Build Status

stomp-rs provides a full STOMP 1.2 client implementation for the Rust programming language. This allows programs written in Rust to interact with message queueing services like ActiveMQ and RabbitMQ.

The APIs for stomp-rs are not yet stable and are likely to fluctuate before v1.0.

Examples

Connect / Subscribe / Send

```rust extern crate stomp; use stomp::frame::Frame; use stomp::header::Header; use stomp::subscription::AckOrNack::Ack; use stomp::subscription::AckMode::Client;

fn main() {

let destination = "/topic/messages"; let acknowledgemode = Client; let mut messagecount: u64 = 0;

let mut session = match stomp::session("127.0.0.1", 61613).start() { Ok(session) => session, Err(error) => panic!("Could not connect to the server: {}", error) };

session.subscribe(destination, acknowledgemode, |frame: &Frame| { messagecount += 1; println!("Received message #{}:\n{}", message_count, frame); Ack });

// Send arbitrary bytes with a specified MIME type session.sendbytes(topic, "text/plain", "Animal".asbytes());

// Send UTF-8 text with an assumed MIME type of 'text/plain' session.sendtext(topic, "Vegetable"); session.sendtext(topic, "Mineral");

session.listen(); // Loops infinitely, awaiting messages

session.disconnect(); } ```

Session Settings

rust let mut session = match stomp::session("127.0.0.1", 61613) .with(Credentials("sullivan", "m1k4d0")) .with(HeartBeat(5000, 2000)) .with(Header::new("custom-client-id", "hmspna4")) .start() { Ok(session) => session, Err(error) => panic!("Could not connect to the server: {}", error) };

Message Settings

rust session.message(destination, "text/plain", "Hypoteneuse".as_bytes()) .with(Header::new("persistent", "true")) .with(SuppressedHeader("content-length") .send();

Subscription Settings

rust let id = session.subscription(destination, |frame: &Frame| { message_count += 1; println!("Received message #{}:\n{}", message_count, frame); Ack }) .with(AckMode::Client) .with(Header::new("custom-subscription-header", "lozenge")) .create();

Transactions

```rust let mut tx = match session.begin_transaction() { Ok(tx) => tx, Err(error) => panic!("Could not begin new transaction: {}", error) };

tx.sendtext(topic, "Animal"); tx.sendtext(topic, "Vegetable"); tx.send_text(topic, "Mineral");

tx.commit(); // Or tx.abort(); ```

Receipts

rust session.send_text_with_receipt(topic, "Modern Major General"); debug!("Oustanding Receipt IDs: {}", session.oustanding_receipts());

Handling RECEIPT frames

rust let handler = |frame: &Frame| debug!("Received receipt for 'Hypoteneuse'", frame); session.message(destination, "text/plain", "Hypoteneuse".as_bytes()) .with(ReceiptHandler(handler)) .send(); NOTE: Due to upstream Rust issue #20174, the compiler will ICE if you attempt to declare the handler inside the ReceiptHandler struct in-line. Until this is fixed, the handler must be defined in advance.

Handling ERROR frames

rust session.on_error(|frame: &Frame| { panic!("ERROR frame received:\n{}", frame); });

Cargo.toml

```toml [package]

name = "stomptest" version = "0.0.1" authors = ["yourname_here"]

[[bin]]

name = "stomp_test"

[dependencies.stomp]

stomp = "*" ```

keywords: Stomp, Rust, rust-lang, rustlang, cargo, ActiveMQ, RabbitMQ, Message Queue, MQ