Re: Socket with setSoTimeout() never times out
On Feb 29, 9:58 am, Gordon Beaton <n....@for.email> wrote:
On Fri, 29 Feb 2008 06:22:40 -0800 (PST), phillip.s.pow...@gmail.com wrote=
:
Does that make more sense now?
Perhaps. So you're trying to avoid invoking the MailAdminReader method
by testing first whether the machine is up?
Perhaps try something like this:
try {
Socket s = new Socket(); // note: unconnected
// choose the *same* port here as mailAdminReader uses! 25, 110, 1=
43 etc
s.connect(new InetSocketAddress(addr, port), 5000);
s.close();
hasMail = mailAdminReader.checkMail();
}
catch (SocketTimeoutException) {
// no response
}
Or use a separate thread:
public class MyRunnable implements Runnable {
private boolean hasMail = false;
private boolean gotResponse = false;
public boolean gotResponse() {
return gotResponse;
}
public boolean hasMail() {
return hasMail;
}
public void run() {
try {
hasMail = mailAdminReader.checkMail();
gotResponse = true;
}
catch (Exception e) {
// no response
}
}
}
Then:
MyRunnable mr = new MyRunnable();
Thread t = new Thread(mr);
t.start();
t.join(5000);
if (mr.gotResponse()) {
hasMail = mr.hasMail();
}
How would I do this within a JSP script?
Not knowing JSP, I'll hazard a guess and say the same way you'd do it
in an application.
I tried to use your example, however, I wound up with multiple
compilation errors due to variables not being declared "final", which
in JSP is beyond me to know how to do to variables instantiated within
a JSP scriptlet.
Both of these techniques should work. The first one won't catch
situations where the mailAdminReader blocks for other reasons. The
second one will leave the thread dangling until the mailAdminReader
eventually times out, you just don't need to block waiting for that to
happen.
/gordon
--