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]

Reply via email to