Message.php
3.82 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
<?php
/**
* PHP OpenCloud library.
*
* @copyright 2014 Rackspace Hosting, Inc. See LICENSE for information.
* @license https://www.apache.org/licenses/LICENSE-2.0
* @author Jamie Hannaford <jamie.hannaford@rackspace.com>
*/
namespace OpenCloud\Queues\Resource;
use Guzzle\Http\Url;
use OpenCloud\Common\PersistentObject;
use OpenCloud\Queues\Exception\DeleteMessageException;
/**
* A message is a task, a notification, or any meaningful data that gets posted
* to the queue. A message exists until it is deleted by a recipient or
* automatically by the system based on a TTL (time-to-live) value.
*/
class Message extends PersistentObject
{
/**
* @var string
*/
private $id;
/**
* The number of seconds since ts, relative to the server's clock.
*
* @var int
*/
private $age;
/**
* Defines how long a message will be accessible. The message expires after
* ($ttl - $age) seconds.
*
* @var int
*/
private $ttl = 600;
/**
* The arbitrary document submitted along with the original request to post
* the message.
*
* @var mixed
*/
private $body;
/**
* An opaque relative URI that the client can use to uniquely identify a
* message resource, and interact with it.
*
* @var string
*/
private $href;
protected static $url_resource = 'messages';
protected static $json_collection_name = 'messages';
protected static $json_name = '';
/**
* Set href (and ID).
*
* @param string $href
* @return self
*/
public function setHref($href)
{
// We have to extract the ID out of the Href. Nice...
preg_match('#.+/([\w\d]+)\?claim_id\=.+$#', $href, $match);
if (!empty($match)) {
$this->setId($match[1]);
}
$this->href = $href;
return $this;
}
/**
* @return string
*/
public function getHref()
{
return $this->href;
}
public function createJson()
{
return (object) array(
'ttl' => $this->getTtl(),
'body' => $this->getBody()
);
}
public function create($params = array())
{
$this->getLogger()->alert('Please use Queue::createMessage() or Queue::createMessages()');
return $this->noCreate();
}
public function update($params = array())
{
return $this->noUpdate();
}
/**
* This operation immediately deletes the specified message.
*
* @param string $claimId Specifies that the message should be deleted
* only if it has the specified claim ID, and that claim has not expired.
* This is useful for ensuring only one agent processes any given
* message. Whenever a worker client's claim expires before it has a
* chance to delete a message it has processed, the worker must roll
* back any actions it took based on that message because another worker
* will now be able to claim and process the same message.
*
* If you do *not* specify $claimId, but the message is claimed, the
* operation fails. You can only delete claimed messages by providing
* an appropriate $claimId.
*
* @return bool
* @throws DeleteMessageException
*/
public function delete($claimId = null)
{
$url = $this->url(null, array('claim_id' => $claimId));
$this->getClient()
->delete($url)
->send();
return true;
}
/**
* If this message has been claimed, retrieve the claim id.
*
* @return string
*/
public function getClaimIdFromHref()
{
$url = Url::factory($this->href);
return $url->getQuery()->get('claim_id');
}
}