Home > Archive > IPC DirQueue > January 2008 > usage question
You are viewing an archived Text-only version of the thread.
To view this thread in it's original format and/or if you want to reply to
this thread please [click here]
|
|
| Thomas J Pinkl 2007-03-03, 7:13 pm |
| I'm attempting to use IPC::DirQueue 0.08 for a project where messages
are queued for later processing. However, when dequeuing these
messages, it will be possible that a message cannot be processed
immediately, but could be processed later.
I thought I'd be able to use IPC::DirQueue like this:
my $dq = IPC::DirQueue->new( \%dq_opts );
while (1) {
my $job = $dq->pickup_queued_job();
last if (! $job);
my $rc = &process_job( $job );
if ($rc) {
$job->finish();
} else {
$job->return_to_queue();
}
}
But if, say, the first job is returned to the queue, then a subsequent
call to pickup_queued_job() returns that same job. Turning the loop
above into an infinite loop (absent an external event which suddenly
causes process_job() to return true).
I've read through the IPC::DirQueue and IPC::DirQueue::Job pod pages,
but I'm not seeing any way to iterate through the queue the way that I
need. The closest method I can see is visit_all_jobs(), but that only
provides read-only Job objects. I suppose I could play with the
read-only flag within the callback function, but that doesn't seem
right.
Does anyone have any suggestions?
--
Thomas J. Pinkl | T: 215-442-9300
Senior Systems Architect | 800-444-1427
Health Business Systems, Inc | F: 215-442-7555
An SXC Company |
738 Louis Drive | http://www.hbsrx.com/
Warminster, PA 18974 | http://www.sxc.com/
| |
|
|
hi Thomas --
an interesting use-case I hadn't considered! ;) The problem is that
when the queue is accessed in ordered mode, it's simply a lexical
sort by filename; and when accessed in unordered mode, it's simply
the OS-based ordering rather than in any way "random".
What about re-queueing the deferred jobs? ie.
my $dq = IPC::DirQueue->new( \%dq_opts );
while (1) {
my $job = $dq->pickup_queued_job();
last if (! $job);
my $rc = &process_job( $job );
if (!$rc) {
$job->enqueue_file($job->get_data_path());
}
$job->finish();
}
in other words, if a job is to be deferred, take it off the queue
and re-queue it under a new name.
Alternatively, I'd be happy to apply a patch that implements
a version of visit_all_jobs() which allows writes somehow, or
a way to access a job returned by visit_all_jobs() and render
it writable.
--j.
Thomas J Pinkl writes:
> I'm attempting to use IPC::DirQueue 0.08 for a project where messages
> are queued for later processing. However, when dequeuing these
> messages, it will be possible that a message cannot be processed
> immediately, but could be processed later.
>
> I thought I'd be able to use IPC::DirQueue like this:
>
> my $dq = IPC::DirQueue->new( \%dq_opts );
> while (1) {
> my $job = $dq->pickup_queued_job();
> last if (! $job);
>
> my $rc = &process_job( $job );
> if ($rc) {
> $job->finish();
> } else {
> $job->return_to_queue();
> }
> }
>
> But if, say, the first job is returned to the queue, then a subsequent
> call to pickup_queued_job() returns that same job. Turning the loop
> above into an infinite loop (absent an external event which suddenly
> causes process_job() to return true).
>
> I've read through the IPC::DirQueue and IPC::DirQueue::Job pod pages,
> but I'm not seeing any way to iterate through the queue the way that I
> need. The closest method I can see is visit_all_jobs(), but that only
> provides read-only Job objects. I suppose I could play with the
> read-only flag within the callback function, but that doesn't seem
> right.
>
> Does anyone have any suggestions?
>
> --
> Thomas J. Pinkl | T: 215-442-9300
> Senior Systems Architect | 800-444-1427
> Health Business Systems, Inc | F: 215-442-7555
> An SXC Company |
> 738 Louis Drive | http://www.hbsrx.com/
> Warminster, PA 18974 | http://www.sxc.com/
| |
| Thomas J Pinkl 2007-03-05, 7:28 pm |
| On Mon, Mar 05, 2007 at 11:24:07AM +0000, Justin Mason wrote:
> Alternatively, I'd be happy to apply a patch that implements
> a version of visit_all_jobs() which allows writes somehow, or
> a way to access a job returned by visit_all_jobs() and render
> it writable.
Justin, here's a patch which adds an optional "readonly" parameter
to visit_all_jobs(). If the parameter isn't passed, then it defaults
to true, thus maintaining backward compatibility. The patch
includes changes to the POD as well. It's against the current SVN
source.
--
Thomas J. Pinkl | T: 215-442-9300
Senior Systems Architect | 800-444-1427
Health Business Systems, Inc | F: 215-442-7555
An SXC Company |
738 Louis Drive | http://www.hbsrx.com/
Warminster, PA 18974 | http://www.sxc.com/
| |
| Thomas J Pinkl 2007-03-05, 7:28 pm |
| On Mon, Mar 05, 2007 at 11:28:03AM -0500, Thomas J Pinkl wrote:
> Justin, here's a patch which adds an optional "readonly" parameter
> to visit_all_jobs(). If the parameter isn't passed, then it defaults
> to true, thus maintaining backward compatibility. The patch
> includes changes to the POD as well. It's against the current SVN
> source.
Perhaps I whipped this up too quickly. The read-only flag works, as
far as it goes, but jobs are not considered "active" when read-only
is false.
If I understand the code correctly, then I'll also have to do
something to make the job "active" from within visit_all_jobs().
Is that correct?
--
Thomas J. Pinkl | T: 215-442-9300
Senior Systems Architect | 800-444-1427
Health Business Systems, Inc | F: 215-442-7555
An SXC Company |
738 Louis Drive | http://www.hbsrx.com/
Warminster, PA 18974 | http://www.sxc.com/
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| Cuckmysock 2008-01-27, 5:30 pm |
| Hilary Swank and Sarah M. Gellar ,Hot Lesbians On Floor!
[url]http://www.BestG Blog.com/Player.wmv?q=726071[/url] |
|
|
|
|