J
Jason Cavett
I am attempting to cancel a running process that is reading data
coming in via a socket from an external (non-Java) application. The
cancel *does* work, except I always get an exception. Here is the
code in question...
private void process() throws ProcessException {
socketWriter.println("START PROCESSING");
try {
File outFile = new File(workingFolder, "output.txt");
FileWriter fw = new FileWriter(outFile, false);
BufferedWriter bw = new BufferedWriter(fw);
String line = socketReader.readLine();
while
(line.indexOf(NativeProcessDistributed.COMPLETED_RUN) == -1) {
bw.write(line);
bw.newLine();
line = socketReader.readLine();
}
bw.flush();
} catch (IOException e) {
throw new
ProcessException(NativeProcess.CANT_WRITE_OUTPUT);
}
}
Basically, I start the processing (via START PROCESSING written to the
application) and then watch the input for a string that means the run
has completed. Until then, I write out all output to an output file
(so someone can examine the output if anything goes wrong with the
processing).
I want the user to cancel the run at any time in the GUI via a cancel
button. This is the method that's fired when the cancel button is
pressed
public void cancel() {
try {
// write a suicide file/flag to force the processing to
halt
File suicide = new File(runFolder + SUICIDE_FILE);
suicide.createNewFile();
this.cleanup();
status = CANCELLED;
stateChanged();
} catch (IOException e) {
e.printStackTrace();
}
}
The cleanup() method is as follows:
private void cleanup() {
try {
socketReader.close();
socketWriter.close();
clientSocket.close();
nativeProcess.destroy();
} catch (IOException e) {
}
}
What's happening (as far as I can tell) is that I'm closing the
clientSocket while the "while" loop in the process() method is still
looping, thus causing the exception to be thrown. I am not sure how
to sync the two methods up so that I can cancel the process AND the
while loop in the distribute method stops (the socketReader.readLine()
is what is throwing the actual exception, BTW). It may be a threading
issue, but I'm having difficulty figuring out what the issue actually
is.
Thanks for any help with this frustrating problem.
coming in via a socket from an external (non-Java) application. The
cancel *does* work, except I always get an exception. Here is the
code in question...
private void process() throws ProcessException {
socketWriter.println("START PROCESSING");
try {
File outFile = new File(workingFolder, "output.txt");
FileWriter fw = new FileWriter(outFile, false);
BufferedWriter bw = new BufferedWriter(fw);
String line = socketReader.readLine();
while
(line.indexOf(NativeProcessDistributed.COMPLETED_RUN) == -1) {
bw.write(line);
bw.newLine();
line = socketReader.readLine();
}
bw.flush();
} catch (IOException e) {
throw new
ProcessException(NativeProcess.CANT_WRITE_OUTPUT);
}
}
Basically, I start the processing (via START PROCESSING written to the
application) and then watch the input for a string that means the run
has completed. Until then, I write out all output to an output file
(so someone can examine the output if anything goes wrong with the
processing).
I want the user to cancel the run at any time in the GUI via a cancel
button. This is the method that's fired when the cancel button is
pressed
public void cancel() {
try {
// write a suicide file/flag to force the processing to
halt
File suicide = new File(runFolder + SUICIDE_FILE);
suicide.createNewFile();
this.cleanup();
status = CANCELLED;
stateChanged();
} catch (IOException e) {
e.printStackTrace();
}
}
The cleanup() method is as follows:
private void cleanup() {
try {
socketReader.close();
socketWriter.close();
clientSocket.close();
nativeProcess.destroy();
} catch (IOException e) {
}
}
What's happening (as far as I can tell) is that I'm closing the
clientSocket while the "while" loop in the process() method is still
looping, thus causing the exception to be thrown. I am not sure how
to sync the two methods up so that I can cancel the process AND the
while loop in the distribute method stops (the socketReader.readLine()
is what is throwing the actual exception, BTW). It may be a threading
issue, but I'm having difficulty figuring out what the issue actually
is.
Thanks for any help with this frustrating problem.