Skip to content

Commit a929651

Browse files
author
Adrian Mihai
committed
implemented timeout in queue::pop, adding tests
1 parent 256c103 commit a929651

File tree

4 files changed

+49
-10
lines changed

4 files changed

+49
-10
lines changed

readme.md

+1
Original file line numberDiff line numberDiff line change
@@ -17,5 +17,6 @@ Sample Configuration:
1717
'project' => 'your-project-id',
1818
'queue' => 'your-queue-name',
1919
'encrypt' => true,
20+
'timeout' => 60
2021
],
2122
```

src/Connectors/IronConnector.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,6 @@ public function connect(array $config)
6060
$iron->ssl_verifypeer = $config['ssl_verifypeer'];
6161
}
6262

63-
return new IronQueue($iron, $this->request, $config['queue'], $config['encrypt']);
63+
return new IronQueue($iron, $this->request, $config['queue'], $config['encrypt'], $config['timeout']);
6464
}
6565
}

src/IronQueue.php

+14-7
Original file line numberDiff line numberDiff line change
@@ -39,22 +39,29 @@ class IronQueue extends Queue implements QueueContract
3939
*/
4040
protected $shouldEncrypt;
4141

42+
/**
43+
* Number of seconds before the reservation_id times out on a newly popped message.
44+
*
45+
* @var int
46+
*/
47+
protected $timeout;
48+
4249
/**
4350
* Create a new IronMQ queue instance.
4451
*
45-
* @param \IronMQ\IronMQ $iron
52+
* @param \IronMQ\IronMQ $iron
4653
* @param \Illuminate\Http\Request $request
47-
* @param string $default
48-
* @param bool $shouldEncrypt
49-
*
50-
* @return void
54+
* @param string $default
55+
* @param bool $shouldEncrypt
56+
* @param int $timeout
5157
*/
52-
public function __construct(IronMQ $iron, Request $request, $default, $shouldEncrypt = false)
58+
public function __construct(IronMQ $iron, Request $request, $default, $shouldEncrypt = false, $timeout = 60)
5359
{
5460
$this->iron = $iron;
5561
$this->request = $request;
5662
$this->default = $default;
5763
$this->shouldEncrypt = $shouldEncrypt;
64+
$this->timeout = $timeout;
5865
}
5966

6067
/**
@@ -135,7 +142,7 @@ public function pop($queue = null)
135142
{
136143
$queue = $this->getQueue($queue);
137144

138-
$job = $this->iron->reserveMessage($queue);
145+
$job = $this->iron->reserveMessage($queue, $this->timeout);
139146

140147
// If we were able to pop a message off of the queue, we will need to decrypt
141148
// the message body, as all Iron.io messages are encrypted, since the push

tests/IronQueueTest.php

+33-2
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,21 @@ public function testPopProperlyPopsJobOffOfIron()
7575
$crypt = m::mock('Illuminate\Contracts\Encryption\Encrypter');
7676
$queue->setEncrypter($crypt);
7777
$queue->setContainer(m::mock('Illuminate\Container\Container'));
78-
$iron->shouldReceive('reserveMessage')->once()->with('default')->andReturn($job = m::mock('IronMQ_Message'));
78+
$iron->shouldReceive('reserveMessage')->once()->with('default', 60)->andReturn($job = m::mock('IronMQ_Message'));
79+
$job->body = 'foo';
80+
$crypt->shouldReceive('decrypt')->once()->with('foo')->andReturn('foo');
81+
$result = $queue->pop();
82+
83+
$this->assertInstanceOf('Collective\IronQueue\Jobs\IronJob', $result);
84+
}
85+
86+
public function testPopProperlyPopsJobOffOfIronWithCustomTimeout()
87+
{
88+
$queue = new Collective\IronQueue\IronQueue($iron = m::mock('IronMQ\IronMQ'), m::mock('Illuminate\Http\Request'), 'default', true, 120);
89+
$crypt = m::mock('Illuminate\Contracts\Encryption\Encrypter');
90+
$queue->setEncrypter($crypt);
91+
$queue->setContainer(m::mock('Illuminate\Container\Container'));
92+
$iron->shouldReceive('reserveMessage')->once()->with('default', 120)->andReturn($job = m::mock('IronMQ_Message'));
7993
$job->body = 'foo';
8094
$crypt->shouldReceive('decrypt')->once()->with('foo')->andReturn('foo');
8195
$result = $queue->pop();
@@ -89,14 +103,31 @@ public function testPopProperlyPopsJobOffOfIronWithoutEncryption()
89103
$crypt = m::mock('Illuminate\Contracts\Encryption\Encrypter');
90104
$queue->setEncrypter($crypt);
91105
$queue->setContainer(m::mock('Illuminate\Container\Container'));
92-
$iron->shouldReceive('reserveMessage')->once()->with('default')->andReturn($job = m::mock('IronMQ_Message'));
106+
$iron->shouldReceive('reserveMessage')->once()->with('default', 60)->andReturn($job = m::mock('IronMQ_Message'));
93107
$job->body = 'foo';
94108
$crypt->shouldReceive('decrypt')->never();
95109
$result = $queue->pop();
96110

97111
$this->assertInstanceOf('Collective\IronQueue\Jobs\IronJob', $result);
98112
}
99113

114+
public function testDeleteJobWithExpiredReservationIdThrowsAnException()
115+
{
116+
$queue = new Collective\IronQueue\IronQueue($iron = m::mock('IronMQ\IronMQ'), m::mock('Illuminate\Http\Request'), 'default', false, 30);
117+
//$crypt = m::mock('Illuminate\Contracts\Encryption\Encrypter');
118+
//$queue->setEncrypter($crypt);
119+
//$queue->setContainer(m::mock('Illuminate\Container\Container'));
120+
$iron->shouldReceive('deleteMessage')->with('default', 1, 'def456')->andThrow('IronCore\HttpException', '{"msg":"Reservation has timed out"}');
121+
122+
//$job->body = 'foo';
123+
//$crypt->shouldReceive('decrypt')->never();
124+
125+
// 'def456' refers to a reservation id that expired
126+
$queue->deleteMessage('default', 1, 'def456');
127+
128+
//$this->assertInstanceOf('Collective\IronQueue\Jobs\IronJob', $result);
129+
}
130+
100131
public function testPushedJobsCanBeMarshaled()
101132
{
102133
$queue = $this->getMock('Collective\IronQueue\IronQueue', ['createPushedIronJob'], [$iron = m::mock('IronMQ\IronMQ'), $request = m::mock('Illuminate\Http\Request'), 'default', true]);

0 commit comments

Comments
 (0)