|Did you know ...||Search Documentation:|
|STOMP -- a SWI-Prolog STOMP client|
This module provides a STOMP (Simple (or Streaming) Text Orientated Messaging Protocol) client. This client is based on work by Hongxin Liang. The current version is a major rewrite, both changing the API and the low-level STOMP frame (de)serialization.
The predicate stomp_connection/5 is used to register a connection. The connection is established by stomp_connect/1, which is lazily called from any of the predicates that send a STOMP frame. After establishing the connection two threads are created. One receives STOMP frames and the other manages and watches the heart beat.
Upon receiving a frame the callback registered with stomp_connection/5 is called in the context of the receiving thread. More demanding applications may decide to send incomming frames to a SWI-Prolog message queue and have one or more worker threads processing the input. Alternatively, frames may be inspected by the receiving thread and either processed immediately or be dispatched to either new or running threads. The best scenario depends on the message rate, processing time and concurrency of the Prolog application.
All message sending predicates of this library are thread safe. If two threads send a frame to the same connection the library ensures that both frames are properly serialized.
By default this library tries to establish the connection and the
user gets notified by means of a
disconnected pseudo frame
that the connection is lost. Using the Options argument of stomp_connection/6
the system can be configured to try and keep connecting if the server is
not available and reconnect if the connection is lost. See the
call(Callback, Command, Connection, Header, Body)
Where command is one of the commands below. Header is a
dict holding the STOMP frame header, where all values are strings except
'content-length' key value which is passed as an
Body is a string or, if the data is of the type
application/json, a dict.
content-typeof the message is
application/jsonand a string otherwise.
application/jsoncontent to Prolog. Default is
|Address||is a valid address for tcp_connect/3.
Normally a term
Host:Port, e.g., |
|Host||is a path denoting the STOMP host.
Often just |
|Headers||is a dict with STOMP headers used
for the |
|Connection||is an opaque ground term that identifies the connection.|
infinite, keep retrying forever.
CONNECTframe. Protocol version and heartbeat negotiation will be handled.
STOMPframe is not used for backward compatibility.
This predicate waits for the connection handshake to have completed. Currently it waits for a maximum of 10 seconds after establishing the socket for the server reply.
Calling this on an established connection has no effect.
stomp_error(connect, Connection, Detail)if no connection could be established.
content-typeis not provided,
text/plainwill be used.
content-lengthwill be filled in automatically.
JSONcan be either a JSON term or a dict.
content-typeis filled in automatically as
content-lengthwill be filled in automatically as well.
ACKframe. See stomp_ack/2 for simply passing the header received with the message we acknowledge.
NACKframe. See stomp_nack/2 for simply passing the header received with the message we acknowledge.
ackfield in the header and reply with an
id. For STOMP 1.2 we reply with the
subscriptionthat we received with the message.
BEGINframe. @see http://stomp.github.io/stomp-specification-1.2.html\#BEGIN
SENDmessages inside the transaction with the transaction id. If Goal fails or raises an exception the transaction is aborted. Failure or exceptions cause the transaction to be aborted using stomp_abort/2, after which the result is forwarded.
DISCONNECTframe. If the connection has the
reconnectproperty set to
true, this will be reset to
disconnectedto avoid reconnecting. A subsequent stomp_connect/2 resets the reconnect status.