[
https://issues.apache.org/jira/browse/HTTPCORE-127?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12545991
]
Asankha C. Perera commented on HTTPCORE-127:
--------------------------------------------
Hi Oleg
Thanks for your reply, and upgrading my JDK solved the initial problem. Now I
get the above code to work. However, as soon as I introduce a select call into
the scenario, I am unable to re-register the new ServerSocketChannel with the
(already open) Selector I had before (i.e. the call blocks). As I explicitly
cancel the SelectionKey, I am assuming that the Selector I was using before can
be reused again. Can you try this class on your end when you get some free time
many thanks
asankha
package org.apache.http.examples.nio;
import java.nio.channels.SelectionKey;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.Selector;
import java.net.InetSocketAddress;
import java.io.IOException;
public class OlegTest {
private Selector selector = null;
public static void main(String[] args) throws Exception {
OlegTest t = new OlegTest();
t.execute();
}
private void execute() throws Exception {
SelectionKey key = null;
selector = Selector.open();
ServerSocketChannel serverChannel = ServerSocketChannel.open();
serverChannel.configureBlocking(false);
serverChannel.socket().bind(new InetSocketAddress(8080));
key = serverChannel.register(selector, SelectionKey.OP_ACCEPT);
System.out.println("Started... sleeping 5s");
Thread.sleep(5000);
new Thread(new Worker()).start();
// This will cause the server to stop accepting connections on port 8080
key.cancel();
serverChannel.close();
//selector.close();
System.out.println("Stopped... sleeping 10s");
Thread.sleep(10000);
// This will cause the server to resume accepting connections on port
8080
serverChannel = ServerSocketChannel.open();
serverChannel.configureBlocking(false);
serverChannel.socket().bind(new InetSocketAddress(8080));
System.out.println("Getting stuck here");
key = serverChannel.register(selector, SelectionKey.OP_ACCEPT);
System.out.println("Re-Started... sleeping 10s");
Thread.sleep(10000);
}
private class Worker implements Runnable {
public void run() {
try {
while (true) {
int ret = selector.select(5000);
System.out.println("Selector returned : " + ret);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
> Expose improved API for lifecycle management
> --------------------------------------------
>
> Key: HTTPCORE-127
> URL: https://issues.apache.org/jira/browse/HTTPCORE-127
> Project: HttpComponents Core
> Issue Type: Improvement
> Components: HttpCore NIO
> Affects Versions: 4.0-alpha6
> Reporter: Asankha C. Perera
> Fix For: 4.0-beta1
>
>
> Apache Synapse uses HttpCore and we would like to stop accepting new
> connections to put our servers into a "maintenance" mode. In this mode any
> in-flight requests already being served will continue as normal (i.e.
> reading, writing etc) but new connections should be rejected, so that a load
> balancer could direct new connections to another instance in the cluster. The
> requirement is to then update configuration, apply patches or cleanly
> shutdown etc. for maintenance without effecting any in-flight requests.
> Implementation wise I think this would be fairly straightforward as we can
> remove OP_ACCEPT from the interested ops.
> On the mailing list Odi suggested that we tackle this at a broader level by
> exposing lifecycle management APIs
> "I suggest create, start, stop, destroy methods in some classes/APIs
> (semantics of JBoss Service MBeans)"
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]