Retry using the waiting queue so as to preserve message ordering
This commit is contained in:
parent
8005bdb421
commit
9da2368383
|
@ -164,6 +164,7 @@ class IrcPlugin extends ImPlugin {
|
|||
false, 'PRI', null, null, true),
|
||||
new ColumnDef('data', 'blob', null, false),
|
||||
new ColumnDef('prioritise', 'tinyint', 1, false),
|
||||
new ColumnDef('attempts', 'integer', null, false),
|
||||
new ColumnDef('created', 'datetime', null, false),
|
||||
new ColumnDef('claimed', 'datetime')));
|
||||
|
||||
|
|
|
@ -10,6 +10,7 @@ class Irc_waiting_message extends Memcached_DataObject {
|
|||
public $id; // int primary_key not_null auto_increment
|
||||
public $data; // blob not_null
|
||||
public $prioritise; // tinyint(1) not_null
|
||||
public $attempts; // int not_null
|
||||
public $created; // datetime() not_null
|
||||
public $claimed; // datetime()
|
||||
|
||||
|
@ -111,6 +112,22 @@ class Irc_waiting_message extends Memcached_DataObject {
|
|||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Increment the attempts count
|
||||
*
|
||||
* @return void
|
||||
* @throws Exception
|
||||
*/
|
||||
public function incAttempts() {
|
||||
$orig = clone($this);
|
||||
$this->attempts++;
|
||||
$result = $this->update($orig);
|
||||
|
||||
if (!$result) {
|
||||
throw Exception(sprintf(_m("Could not increment attempts count for %d"), $this->id));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Release a claimed item.
|
||||
*/
|
||||
|
|
|
@ -101,19 +101,21 @@ class IrcManager extends ImManager {
|
|||
$this->messageWaiting = false;
|
||||
return;
|
||||
}
|
||||
|
||||
$data = unserialize($wm->data);
|
||||
$wm->incAttempts();
|
||||
|
||||
if (!$this->send_raw_message($data)) {
|
||||
$this->plugin->enqueue_outgoing_raw(
|
||||
array(
|
||||
'type' => 'message',
|
||||
'prioritise' => $data['prioritise'],
|
||||
'data' => $data['data']
|
||||
)
|
||||
);
|
||||
if ($this->send_raw_message($data)) {
|
||||
$wm->delete();
|
||||
} else {
|
||||
if ($wm->attempts <= common_config('queue', 'max_retries')) {
|
||||
// Try again next idle
|
||||
$wm->releaseClaim();
|
||||
} else {
|
||||
// Exceeded the maximum number of retries
|
||||
$wm->delete();
|
||||
}
|
||||
}
|
||||
|
||||
$wm->delete();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -276,6 +278,7 @@ class IrcManager extends ImManager {
|
|||
|
||||
$wm->data = serialize($data);
|
||||
$wm->prioritise = $data['prioritise'];
|
||||
$wm->attempts = 0;
|
||||
$wm->created = common_sql_now();
|
||||
$result = $wm->insert();
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user