Rohan Sircar
4 years ago
2 changed files with 138 additions and 1 deletions
-
32README.md
-
107stompTest.sc
@ -1,2 +1,32 @@ |
|||||
# scala-stomp-client-demo |
|
||||
|
# Scala Stomp Client Demo |
||||
|
|
||||
|
A demo of using a stomp client in Scala with an Ammonite script. Makes use of the java library [java-stomp-ws](https://github.com/gim-/java-stomp-ws) and provides two convenience extension methods. By default the script queries the websocket endpoints of [Chatto](https://git.arcusiridis.com/nova/Chatto). |
||||
|
|
||||
|
## Usage |
||||
|
|
||||
|
You need to have [ammonite](https://ammonite.io) installed. |
||||
|
|
||||
|
Once you have done that, start a local instance of Chatto, and run the command - |
||||
|
|
||||
|
``` |
||||
|
amm stompTest.sc --username yourusername --password yourpassword |
||||
|
``` |
||||
|
|
||||
|
or |
||||
|
|
||||
|
``` |
||||
|
./stompTest.sc --username yourusername --password yourpassword |
||||
|
``` |
||||
|
|
||||
|
Sample output - |
||||
|
|
||||
|
``` |
||||
|
Success(true) |
||||
|
Connected |
||||
|
Server message: pong |
||||
|
Server message: {"toUser":"admin","fromUser":"nova","messageContent":"hello"} |
||||
|
``` |
||||
|
|
||||
|
## License |
||||
|
|
||||
|
Licensed under [The Unlicense](https://unlicense.org/) |
@ -0,0 +1,107 @@ |
|||||
|
#!/usr/bin/env amm |
||||
|
|
||||
|
import $repo.`https://jitpack.io` |
||||
|
|
||||
|
import $ivy.`com.github.gim-.java-stomp-ws:stomp-client-ws:v1.0` |
||||
|
|
||||
|
import eu.mivrenik.stomp.StompFrame |
||||
|
import eu.mivrenik.stomp.client.StompClient |
||||
|
import eu.mivrenik.stomp.client.listener.StompMessageListener |
||||
|
import java.net.URI |
||||
|
import scala.util.Try |
||||
|
import scala.util.Success |
||||
|
import scala.util.Failure |
||||
|
import scala.collection.JavaConverters._ |
||||
|
import org.java_websocket.drafts.Draft._ |
||||
|
import org.java_websocket.drafts.Draft_6455 |
||||
|
import java.{util => ju} |
||||
|
import ju.HashMap |
||||
|
import scala.concurrent.Future |
||||
|
import scala.concurrent.ExecutionContext.Implicits._ |
||||
|
|
||||
|
@main |
||||
|
def run( |
||||
|
username: String = "user", |
||||
|
password: String = "password", |
||||
|
host: String = "localhost", |
||||
|
port: Int = 8080, |
||||
|
endpoint: String = "ws" |
||||
|
) = { |
||||
|
val msg = |
||||
|
s"""{"toUser":"admin","fromUser":"$username","messageContent":"hello"}""" |
||||
|
val usernameAndPassword = s"$username:$password" |
||||
|
val encoded = |
||||
|
ju.Base64.getEncoder.encodeToString(usernameAndPassword.getBytes()) |
||||
|
|
||||
|
val headers = new ju.HashMap[String, String] |
||||
|
headers.put("Authorization", s"Basic $encoded") |
||||
|
|
||||
|
val stompSocket = new StompClient( |
||||
|
URI.create(s"ws://$host:$port/$endpoint"), |
||||
|
new Draft_6455(), |
||||
|
headers, |
||||
|
60 |
||||
|
) |
||||
|
|
||||
|
val t = new Thread(() => { |
||||
|
val res = Try(stompSocket.connectBlocking()) |
||||
|
|
||||
|
println(res) |
||||
|
|
||||
|
res match { |
||||
|
case Success(value) => { |
||||
|
println("Connected") |
||||
|
stompSocket ? ( |
||||
|
"/user/queue/ping", |
||||
|
(stompFrame: StompFrame) => { |
||||
|
println("Server message: " + stompFrame.getBody()) |
||||
|
} |
||||
|
) |
||||
|
|
||||
|
val x = stompSocket ? ( |
||||
|
"/user/queue/reply", |
||||
|
(stompFrame: StompFrame) => { |
||||
|
println("Server message: " + stompFrame.getBody()) |
||||
|
stompSocket.close() |
||||
|
} |
||||
|
) |
||||
|
|
||||
|
stompSocket ! "/app/ping" |
||||
|
stompSocket ! ("/app/message-test", Some(msg)) |
||||
|
|
||||
|
} |
||||
|
case Failure(exception) => { println(exception.getMessage()) } |
||||
|
} |
||||
|
}) |
||||
|
|
||||
|
t.start() |
||||
|
Thread.sleep(1000) |
||||
|
t.stop() |
||||
|
} |
||||
|
|
||||
|
/** |
||||
|
* Extension methods for Java Stomp Client |
||||
|
* |
||||
|
* @param client |
||||
|
*/ |
||||
|
implicit class RichStompClient(client: StompClient) { |
||||
|
|
||||
|
/** |
||||
|
* alias for send |
||||
|
* |
||||
|
* @param dest |
||||
|
* @param message |
||||
|
*/ |
||||
|
def !(dest: String, message: Option[String] = None) = |
||||
|
message.fold(client.send(dest, ""))(m => client.send(dest, m)) |
||||
|
|
||||
|
/** |
||||
|
* alias for subscribe |
||||
|
* |
||||
|
* @param route |
||||
|
* @param listener |
||||
|
* @return StompSubscription |
||||
|
*/ |
||||
|
def ?(route: String, listener: StompMessageListener) = |
||||
|
client.subscribe(route, listener) |
||||
|
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue