Hello,
I'm trying to send a HTTP GET to a host which may take a long time to
reply (tens of minutes). The protocol is simple. If the connection
timeouts, I just send the same request again. Sooner or later it will
reply to me.
What I'm having problems with is how to recreate a connection. I've
looked at the examples on the website and have spent hours on trying to
make it work, but in the end I think I'm stuck.
This is what I have. It's based on the non-blocking HTTP client example,
found at [1].
handler.setEventListener(new MyEventListener(ioReactor, requestCount));
Thread t = new Thread(new Runnable() {
public void run() {
try {
ioReactor.execute(ioEventDispatch);
}
....
}
t.start();
// -------- here comes the relevant part ----------
SessionRequest session = ioReactor.connect(new InetSocketAddress(host,
port), null, new HttpHost(host), new MySessionCallback());
// --------------------------------------------------------------
So it's completely the same as the example at [1]. I've implemented the
custom EventListener, and the custom SessionRequestCallback.
What I want to do now is detect when the connection times out. First,
let's look at the event listener.
public void connectionTimeout(final NHttpConnection conn) {
System.out.println("Connection timed out: " + conn);
}
Works as expected. Except, I can't get anything useful from the conn
object, such as host, port, URL etc. The headers are null.
I would need to have the host, port and URL to be able to recreate the
connection object, and schedule it with the ioReactor.
Now let's look at the session request callback object.
public void completed(SessionRequest request) {
System.err.println("completed: " + request);
}
public void timeout(SessionRequest request) {
System.err.println("timeout: " + request);
}
As soon as the connection is open, the completed() method is executed.
The request is NOT completed! I haven't yet received a reply from the
server! So I'm not really sure what this method is doing, is it only
used until the request is dispatched to the server? Which I don't care for.
The timeout() method is never invoked.
If I'm right about what this callback object is doing, then it is only
used until the request is sent to the server. In that case, what I would
need is a "response" callback object. Is there such a thing?
---------
Maybe I'm doing things wrong. What I would basically like to do is:
1) ioReactor.connect(new InetSocketAddress(host, port), null, new
HttpHost(host), new MySessionCallback());
2) in MySessionCallback:
if (timeout) {
ioReactor.connect(conn.getSockAddress(), null, conn.getHost(), this);
}
3) loop until completed successfully
-------
What should I do to make this work?
Thanks, Csaba
1 -
http://svn.apache.org/repos/asf/httpcomponents/httpcore/branches/4.0.x/httpcore-nio/src/examples/org/apache/http/examples/nio/NHttpClient.java
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]