summaryrefslogtreecommitdiff
path: root/extlib/Stomp.php
diff options
context:
space:
mode:
Diffstat (limited to 'extlib/Stomp.php')
-rw-r--r--extlib/Stomp.php124
1 files changed, 53 insertions, 71 deletions
diff --git a/extlib/Stomp.php b/extlib/Stomp.php
index c9e90629c..abd9cba62 100644
--- a/extlib/Stomp.php
+++ b/extlib/Stomp.php
@@ -26,7 +26,7 @@ require_once 'Stomp/Frame.php';
*
* @package Stomp
* @author Hiram Chirino <hiram@hiramchirino.com>
- * @author Dejan Bosanac <dejan@nighttale.net>
+ * @author Dejan Bosanac <dejan@nighttale.net>
* @author Michael Caplan <mcaplan@labnet.net>
* @version $Revision: 43 $
*/
@@ -44,15 +44,15 @@ class Stomp
*
* @var int
*/
- public $prefetchSize = 1;
-
- /**
+ public $prefetchSize = 1;
+
+ /**
* Client id used for durable subscriptions
*
* @var string
*/
- public $clientId = null;
-
+ public $clientId = null;
+
protected $_brokerUri = null;
protected $_socket = null;
protected $_hosts = array();
@@ -66,7 +66,7 @@ class Stomp
protected $_sessionId;
protected $_read_timeout_seconds = 60;
protected $_read_timeout_milliseconds = 0;
-
+
/**
* Constructor
*
@@ -134,10 +134,10 @@ class Stomp
require_once 'Stomp/Exception.php';
throw new Stomp_Exception("No broker defined");
}
-
+
// force disconnect, if previous established connection exists
$this->disconnect();
-
+
$i = $this->_currentHost;
$att = 0;
$connected = false;
@@ -190,11 +190,11 @@ class Stomp
if ($password != '') {
$this->_password = $password;
}
- $headers = array('login' => $this->_username , 'passcode' => $this->_password);
- if ($this->clientId != null) {
- $headers["client-id"] = $this->clientId;
- }
- $frame = new Stomp_Frame("CONNECT", $headers);
+ $headers = array('login' => $this->_username , 'passcode' => $this->_password);
+ if ($this->clientId != null) {
+ $headers["client-id"] = $this->clientId;
+ }
+ $frame = new Stomp_Frame("CONNECT", $headers);
$this->_writeFrame($frame);
$frame = $this->readFrame();
if ($frame instanceof Stomp_Frame && $frame->command == 'CONNECTED') {
@@ -209,7 +209,7 @@ class Stomp
}
}
}
-
+
/**
* Check if client session has ben established
*
@@ -229,7 +229,7 @@ class Stomp
return $this->_sessionId;
}
/**
- * Send a message to a destination in the messaging system
+ * Send a message to a destination in the messaging system
*
* @param string $destination Destination queue
* @param string|Stomp_Frame $msg Message
@@ -237,7 +237,7 @@ class Stomp
* @param boolean $sync Perform request synchronously
* @return boolean
*/
- public function send ($destination, $msg, $properties = array(), $sync = null)
+ public function send ($destination, $msg, $properties = null, $sync = null)
{
if ($msg instanceof Stomp_Frame) {
$msg->headers['destination'] = $destination;
@@ -319,12 +319,10 @@ class Stomp
public function subscribe ($destination, $properties = null, $sync = null)
{
$headers = array('ack' => 'client');
- // FIXME: this seems to be activemq specific, but not hurting rabbitmq?
- $headers['activemq.prefetchSize'] = $this->prefetchSize;
- if ($this->clientId != null) {
- // FIXME: this seems to be activemq specific, but not hurting rabbitmq?
- $headers["activemq.subcriptionName"] = $this->clientId;
- }
+ $headers['activemq.prefetchSize'] = $this->prefetchSize;
+ if ($this->clientId != null) {
+ $headers["activemq.subcriptionName"] = $this->clientId;
+ }
if (isset($properties)) {
foreach ($properties as $name => $value) {
$headers[$name] = $value;
@@ -426,7 +424,7 @@ class Stomp
}
/**
* Acknowledge consumption of a message from a subscription
- * Note: This operation is always asynchronous
+ * Note: This operation is always asynchronous
*
* @param string|Stomp_Frame $messageMessage ID
* @param string $transactionId
@@ -435,26 +433,20 @@ class Stomp
*/
public function ack ($message, $transactionId = null)
{
- // Handle the headers,
- $headers = array();
-
if ($message instanceof Stomp_Frame) {
- // Copy headers from the object
- // FIXME: at least content-length can be wrong here (set to 3 sometimes).
- $headers = $message->headers;
+ $frame = new Stomp_Frame('ACK', $message->headers);
+ $this->_writeFrame($frame);
+ return true;
} else {
+ $headers = array();
if (isset($transactionId)) {
$headers['transaction'] = $transactionId;
}
$headers['message-id'] = $message;
+ $frame = new Stomp_Frame('ACK', $headers);
+ $this->_writeFrame($frame);
+ return true;
}
- // An ACK has no content
- $headers['content-length'] = 0;
-
- // Create it and write it out
- $frame = new Stomp_Frame('ACK', $headers);
- $this->_writeFrame($frame);
- return true;
}
/**
* Graceful disconnect from the server
@@ -462,11 +454,11 @@ class Stomp
*/
public function disconnect ()
{
- $headers = array();
+ $headers = array();
- if ($this->clientId != null) {
- $headers["client-id"] = $this->clientId;
- }
+ if ($this->clientId != null) {
+ $headers["client-id"] = $this->clientId;
+ }
if (is_resource($this->_socket)) {
$this->_writeFrame(new Stomp_Frame('DISCONNECT', $headers));
@@ -498,19 +490,19 @@ class Stomp
$this->_writeFrame($stompFrame);
}
}
-
+
/**
* Set timeout to wait for content to read
*
* @param int $seconds_to_wait Seconds to wait for a frame
* @param int $milliseconds Milliseconds to wait for a frame
*/
- public function setReadTimeout($seconds, $milliseconds = 0)
+ public function setReadTimeout($seconds, $milliseconds = 0)
{
$this->_read_timeout_seconds = $seconds;
$this->_read_timeout_milliseconds = $milliseconds;
}
-
+
/**
* Read responce frame from server
*
@@ -521,29 +513,19 @@ class Stomp
if (!$this->hasFrameToRead()) {
return false;
}
-
+
$rb = 1024;
$data = '';
- do {
- $read = fread($this->_socket, $rb);
- if ($read === false) {
- $this->_reconnect();
- return $this->readFrame();
- }
- $data .= $read;
- $len = strlen($data);
-
- $continue = true;
- // ActiveMq apparently add \n after 0 char
- if($data[$len - 2] == "\x00" && $data[$len - 1] == "\n") {
- $continue = false;
- }
-
- // RabbitMq does not
- if($data[$len - 1] == "\x00") {
- $continue = false;
- }
- } while ( $continue );
+ do {
+ $read = fgets($this->_socket, $rb);
+ if ($read === false) {
+ $this->_reconnect();
+ return $this->readFrame();
+ }
+ $data .= $read;
+ $len = strlen($data);
+ } while (($len < 2 || ! ($data[$len - 2] == "\x00" && $data[$len - 1] == "\n")));
+
list ($header, $body) = explode("\n\n", $data, 2);
$header = explode("\n", $header);
$headers = array();
@@ -564,7 +546,7 @@ class Stomp
return $frame;
}
}
-
+
/**
* Check if there is a frame to read
*
@@ -575,7 +557,7 @@ class Stomp
$read = array($this->_socket);
$write = null;
$except = null;
-
+
$has_frame_to_read = stream_select($read, $write, $except, $this->_read_timeout_seconds, $this->_read_timeout_milliseconds);
if ($has_frame_to_read === false) {
@@ -583,18 +565,18 @@ class Stomp
} else if ($has_frame_to_read > 0) {
return true;
} else {
- return false;
+ return false;
}
}
-
+
/**
* Reconnects and renews subscriptions (if there were any)
- * Call this method when you detect connection problems
+ * Call this method when you detect connection problems
*/
protected function _reconnect ()
{
$subscriptions = $this->_subscriptions;
-
+
$this->connect($this->_username, $this->_password);
foreach ($subscriptions as $dest => $properties) {
$this->subscribe($dest, $properties);