Hi Martin this is not proving an effective use of either of our time; I
am not sure you understand the design of Executor/Callable/Future. Many
of your questions seem focused on the technicalities of stopping a
process; rather than the responsibilities and relationships of the
objects involved.
Basically if you are waiting for me to come up with a design that says
"Process extends Callable" I have already provided it; It does not look
exactly like what you are expecting to see so I am worried that it is
not being considered for what it is.
I need to make sure; am I being understood about the requirements for a
Process interface? If not we should get out of the details and return to
the goals.
I have commented a bit more inline, but we need another way to discuss this.
Jody
Martin Desruisseaux wrote:
> But we don't need a point of contact!
>
> We would need a point of contact if a call to Thread.interrupt() was
> the only way to stop a process, i.e. if the process has no build-in
> support for cancelation. But if you require a process to implement the
> Process interface and if this interface requires to implement a
> cancel() method, then implementors are required to support cancelation
> in the way recommanded by the link above (or something similar). This
> is what Image I/O does and it work well (I use it).
>
> The Future.cancel() method could be seen as more aggresive way to
> cancel a progress for the waiting thread only. This is not the only
> way and not necessarly the preferred one since the approach in the
> above link would leave the system in a cleaner state.
I need a better word than "point of contact". This comes down to design
and responsibility ... if I am defining a Process API it is a contract
between the "Executor" (or Process Engine) and the bit of code being
run. You are asking me to open up this relationship to others (a list of
listeners), and I find that a poor choice that is in fact limiting (I
cannot spread the tasks across servers), dangerous (any listener could
have a mistake) and unnecessary.
>> These facilities do not provide any kind of information or reporting
>> on the running Callable. The moment we provide more we have stepped
>> outside of what Future / Callable can do out of the box.
> Yes but again why the following is not acceptable?
>
> interface Process extends Callable {
> void addProgressListener(...)
> void removeProgressListener(...)
> void cancel();
> }
>
Line by line:
- Progress.cancel() - what you describe here *has* to exist. It can be
covered by ProgressListener.isCanceled(). But *yes* this functionality
is needed for an Executor to stop the progress. Providing this
functionality as a parameter object (ProgressListener currently) takes
the responsibility away from the person implementing the Process (and it
is a *huge* responsibility that I personally don't trust them to get
right - you cannot dictate that they syncronize their cancel() method).
- Progress.addProgressListener(...) violates information hiding and the
reason for an Executor. Any listeners should be handled by a callback
object provided by the Executor; don't make it harder for anyone to
implement a Process than it needs to be.
> It goes against the usage of Future.cancel(), but I don't see that as
> a problem.
> * Listeners can stop a process using Process.cancel(), which should be
> implemented in the way described in the above link as in Image I/O.
Are you expecting the Process implementor to check their entire list of
listeners? Please note that this technique is what is used by the
Executor (by way of the ProgressListener) in my design; I find it way
more safe/sane then anything todo with Thread (and as a bonus you can
recycle your Thread for the next Process).
> * The thread that holds the Future object can invokes Process.cancel()
> or Future.cancel() at its choice - the later can been see as a more
> aggressive way to kill a process if we don't want to let it finish
> cleanly.
Yes that is the point where we have different designs. I don't want the
Thread that holds the Future object to have any way of influencing
things other than the Executor; or the Future callback object the
Executor provided.
So let me define something for you that is *very* similar to what you
describe above; just different in intent.
interface Process extends Callable<Map> {
void setInput( Map input ); // part of the Process contract; we are
going to process the data provided as input
void setProgressListener( ... ); // Contract with executor, no need
for cancel() since progressListener.isCancelled() exists
}
Progress extends Future {
addListener( ... );
removeListener( ... );
int getProgress();
String getTask();
}
-------------------------------------------------------------------------
This SF.net email is sponsored by the 2008 JavaOne(SM) Conference
Don't miss this year's exciting event. There's still time to save $100.
Use priority code J8TL2D2.
http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone
_______________________________________________
Geotools-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/geotools-devel