F
Fly
Hello,
I have a client program that read an XML from a STREAM every 60 seconds.
From the main Thread I do an infinite loop where I create a new working thread
executing all the operations: read, parse, etc..
This is what I do:
<code>
DownloaderTask tempTask = null;
while (true) {
if (tempTask != null) {
if (tempTask.isAlive()) {
tempTask.cancel();
}
}
tempTask = new DownloaderTask();
tempTask.start();
try {
sleep(frequency * 1000);
} catch (InterruptedException ex) {
log.severe("Main sleep failed");
}
}
</code>
Inside the Run method of the DownloaderTask, I first read from the Stream (a class field) with a BufferedReader, in this way:
<code>
private String readDocumentFromStream(BufferedReader reader) throws IOException {
char[] buffer = new char[4 * 1024];
int charsRead = -1;
String retVal = "";
log.finer("---START reading XML ---");
while ((charsRead = reader.read(buffer, 0, 4 * 1024)) != -1)
{
log.log(Level.FINER, "CharsRead: {0}", charsRead);
retVal += String.copyValueOf(buffer, 0, charsRead);
}
log.finer("---STOP reading XML---");
return retVal;
}
</code>
In the DownloaderTask class I wrote a cancel() method, called by the main thread in the case the working thread was still alive after the sleep().
It's definition:
<code>
synchronized public void cancel() {
this.interrupt();
try {
if (rd != null) {
rd.close();
}
} catch (IOException ex) {
log.severe(ex.getMessage());
}
http_conn.disconnect();
log.log(Level.SEVERE, "Timeout. Thread {0} is being canceled and resource released.", this.getId());
}
</code>
My problems.
Sometimes I see my program active, doing nothing, blocked probably in the read(), because if I check all logs, the last line written is "CharsRead: xxx" and no more.
Here I post one of my saved log (where the read buffer was 1024 bytes):
<LOG>
||-- 2011-05-03 06:44:59 FINE: Updating events data... --||
||-- 2011-05-03 06:44:59 FINE: Events updated! --||
||-- 2011-05-03 06:44:59 INFO: Release date: 2011-05-03 06:45:15 | Received: 187 Inserted: 0 Updated: 0 Deleted: 0 ||| Errors: 2 --||
||-- 2011-05-03 06:44:59 FINER: Normal closing thread 1.723 --||
||-- 2011-05-03 06:44:59 FINER: Thread 1.723 Closing --||
||-- 2011-05-03 06:45:52 FINER: Thread 1.725 Opening --||
||-- 2011-05-03 06:45:52 FINE: Opening server connection to: mysite.com:80 --||
||-- 2011-05-03 06:46:19 FINE: Reading From Stream --||
||-- 2011-05-03 06:46:19 FINER: ---START reading XML --- --||
||-- 2011-05-03 06:46:19 FINER: CharsRead: 1.024 --||
||-- 2011-05-03 06:46:19 FINER: CharsRead: 1.024 --||
||-- 2011-05-03 06:46:19 FINER: CharsRead: 1.024 --||
||-- 2011-05-03 06:46:19 FINER: CharsRead: 929 --||
||-- 2011-05-03 06:46:19 FINER: CharsRead: 1.024 --||
||-- 2011-05-03 06:46:19 FINER: CharsRead: 1.024 --||
||-- 2011-05-03 06:46:19 FINER: CharsRead: 872 --||
</LOG>
I noticed another strange thing in this log, that is I can't see the Thread Id: 1724.
Can you help me to find where I am wrong? In the logic or maybe in the syntax of the program?
Thanks in advance,
Flavio
I have a client program that read an XML from a STREAM every 60 seconds.
From the main Thread I do an infinite loop where I create a new working thread
executing all the operations: read, parse, etc..
This is what I do:
<code>
DownloaderTask tempTask = null;
while (true) {
if (tempTask != null) {
if (tempTask.isAlive()) {
tempTask.cancel();
}
}
tempTask = new DownloaderTask();
tempTask.start();
try {
sleep(frequency * 1000);
} catch (InterruptedException ex) {
log.severe("Main sleep failed");
}
}
</code>
Inside the Run method of the DownloaderTask, I first read from the Stream (a class field) with a BufferedReader, in this way:
<code>
private String readDocumentFromStream(BufferedReader reader) throws IOException {
char[] buffer = new char[4 * 1024];
int charsRead = -1;
String retVal = "";
log.finer("---START reading XML ---");
while ((charsRead = reader.read(buffer, 0, 4 * 1024)) != -1)
{
log.log(Level.FINER, "CharsRead: {0}", charsRead);
retVal += String.copyValueOf(buffer, 0, charsRead);
}
log.finer("---STOP reading XML---");
return retVal;
}
</code>
In the DownloaderTask class I wrote a cancel() method, called by the main thread in the case the working thread was still alive after the sleep().
It's definition:
<code>
synchronized public void cancel() {
this.interrupt();
try {
if (rd != null) {
rd.close();
}
} catch (IOException ex) {
log.severe(ex.getMessage());
}
http_conn.disconnect();
log.log(Level.SEVERE, "Timeout. Thread {0} is being canceled and resource released.", this.getId());
}
</code>
My problems.
Sometimes I see my program active, doing nothing, blocked probably in the read(), because if I check all logs, the last line written is "CharsRead: xxx" and no more.
Here I post one of my saved log (where the read buffer was 1024 bytes):
<LOG>
||-- 2011-05-03 06:44:59 FINE: Updating events data... --||
||-- 2011-05-03 06:44:59 FINE: Events updated! --||
||-- 2011-05-03 06:44:59 INFO: Release date: 2011-05-03 06:45:15 | Received: 187 Inserted: 0 Updated: 0 Deleted: 0 ||| Errors: 2 --||
||-- 2011-05-03 06:44:59 FINER: Normal closing thread 1.723 --||
||-- 2011-05-03 06:44:59 FINER: Thread 1.723 Closing --||
||-- 2011-05-03 06:45:52 FINER: Thread 1.725 Opening --||
||-- 2011-05-03 06:45:52 FINE: Opening server connection to: mysite.com:80 --||
||-- 2011-05-03 06:46:19 FINE: Reading From Stream --||
||-- 2011-05-03 06:46:19 FINER: ---START reading XML --- --||
||-- 2011-05-03 06:46:19 FINER: CharsRead: 1.024 --||
||-- 2011-05-03 06:46:19 FINER: CharsRead: 1.024 --||
||-- 2011-05-03 06:46:19 FINER: CharsRead: 1.024 --||
||-- 2011-05-03 06:46:19 FINER: CharsRead: 929 --||
||-- 2011-05-03 06:46:19 FINER: CharsRead: 1.024 --||
||-- 2011-05-03 06:46:19 FINER: CharsRead: 1.024 --||
||-- 2011-05-03 06:46:19 FINER: CharsRead: 872 --||
</LOG>
I noticed another strange thing in this log, that is I can't see the Thread Id: 1724.
Can you help me to find where I am wrong? In the logic or maybe in the syntax of the program?
Thanks in advance,
Flavio