Some changes to further polish #74

This commit is contained in:
Narendra Pathai 2015-09-16 13:24:21 +05:30
parent e5f1ff1be1
commit 570a30099e
8 changed files with 119 additions and 81 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 121 KiB

After

Width:  |  Height:  |  Size: 123 KiB

View File

@ -124,80 +124,108 @@
<operations public="true" package="true" protected="true" private="false" static="true"/> <operations public="true" package="true" protected="true" private="false" static="true"/>
</display> </display>
</class> </class>
<realization id="14"> <association id="14">
<end type="SOURCE" refId="5"/> <end type="SOURCE" refId="13" navigable="false">
<end type="TARGET" refId="3"/> <attribute id="15" name="dispatcher"/>
</realization> <multiplicity id="16" minimum="0" maximum="1"/>
<association id="15">
<end type="SOURCE" refId="2" navigable="false">
<attribute id="16" name="dispatcher"/>
<multiplicity id="17" minimum="0" maximum="1"/>
</end> </end>
<end type="TARGET" refId="3" navigable="true"/> <end type="TARGET" refId="3" navigable="true"/>
<display labels="true" multiplicity="true"/> <display labels="true" multiplicity="true"/>
</association> </association>
<realization id="18"> <association id="17">
<bendpoint x="309" y="348"/>
<end type="SOURCE" refId="4"/>
<end type="TARGET" refId="3"/>
</realization>
<association id="19">
<bendpoint x="460" y="203"/>
<end type="SOURCE" refId="13" navigable="false">
<attribute id="20" name="reactor"/>
<multiplicity id="21" minimum="0" maximum="1"/>
</end>
<end type="TARGET" refId="2" navigable="true"/>
<display labels="true" multiplicity="true"/>
</association>
<dependency id="22">
<end type="SOURCE" refId="8"/>
<end type="TARGET" refId="10"/>
</dependency>
<generalization id="23">
<end type="SOURCE" refId="7"/>
<end type="TARGET" refId="6"/>
</generalization>
<association id="24">
<end type="SOURCE" refId="6" navigable="false">
<attribute id="25" name="handler"/>
<multiplicity id="26" minimum="0" maximum="1"/>
</end>
<end type="TARGET" refId="11" navigable="true"/>
<display labels="true" multiplicity="true"/>
</association>
<association id="27">
<end type="SOURCE" refId="6" navigable="false">
<attribute id="28" name="reactor"/>
<multiplicity id="29" minimum="0" maximum="1"/>
</end>
<end type="TARGET" refId="2" navigable="true"/>
<display labels="true" multiplicity="true"/>
</association>
<dependency id="30">
<end type="SOURCE" refId="13"/>
<end type="TARGET" refId="12"/>
</dependency>
<association id="31">
<end type="SOURCE" refId="2" navigable="false"> <end type="SOURCE" refId="2" navigable="false">
<attribute id="32" name="selector"/> <attribute id="18" name="selector">
<multiplicity id="33" minimum="0" maximum="1"/> <position height="0" width="0" x="0" y="0"/>
</attribute>
<multiplicity id="19" minimum="0" maximum="1">
<position height="0" width="0" x="0" y="0"/>
</multiplicity>
</end> </end>
<end type="TARGET" refId="1" navigable="true"/> <end type="TARGET" refId="1" navigable="true"/>
<display labels="true" multiplicity="true"/> <display labels="true" multiplicity="true"/>
</association> </association>
<realization id="34"> <dependency id="20">
<end type="SOURCE" refId="12"/>
<end type="TARGET" refId="11"/>
</realization>
<generalization id="35">
<end type="SOURCE" refId="8"/> <end type="SOURCE" refId="8"/>
<end type="TARGET" refId="10"/>
</dependency>
<generalization id="21">
<end type="SOURCE" refId="7"/>
<end type="TARGET" refId="6"/> <end type="TARGET" refId="6"/>
</generalization> </generalization>
<dependency id="36"> <realization id="22">
<bendpoint x="309" y="348"/>
<end type="SOURCE" refId="4"/>
<end type="TARGET" refId="3"/>
</realization>
<dependency id="23">
<end type="SOURCE" refId="13"/>
<end type="TARGET" refId="12"/>
</dependency>
<association id="24">
<end type="SOURCE" refId="6" navigable="false">
<attribute id="25" name="handler">
<position height="0" width="0" x="0" y="0"/>
</attribute>
<multiplicity id="26" minimum="0" maximum="1">
<position height="0" width="0" x="0" y="0"/>
</multiplicity>
</end>
<end type="TARGET" refId="11" navigable="true"/>
<display labels="true" multiplicity="true"/>
</association>
<dependency id="27">
<end type="SOURCE" refId="7"/> <end type="SOURCE" refId="7"/>
<end type="TARGET" refId="9"/> <end type="TARGET" refId="9"/>
</dependency> </dependency>
<generalization id="28">
<end type="SOURCE" refId="8"/>
<end type="TARGET" refId="6"/>
</generalization>
<association id="29">
<end type="SOURCE" refId="2" navigable="false">
<attribute id="30" name="dispatcher">
<position height="0" width="0" x="0" y="0"/>
</attribute>
<multiplicity id="31" minimum="0" maximum="1">
<position height="0" width="0" x="0" y="0"/>
</multiplicity>
</end>
<end type="TARGET" refId="3" navigable="true"/>
<display labels="true" multiplicity="true"/>
</association>
<realization id="32">
<end type="SOURCE" refId="12"/>
<end type="TARGET" refId="11"/>
</realization>
<association id="33">
<bendpoint x="460" y="203"/>
<end type="SOURCE" refId="13" navigable="false">
<attribute id="34" name="reactor">
<position height="0" width="0" x="0" y="0"/>
</attribute>
<multiplicity id="35" minimum="0" maximum="1">
<position height="0" width="0" x="0" y="0"/>
</multiplicity>
</end>
<end type="TARGET" refId="2" navigable="true"/>
<display labels="true" multiplicity="true"/>
</association>
<association id="36">
<end type="SOURCE" refId="6" navigable="false">
<attribute id="37" name="reactor">
<position height="0" width="0" x="0" y="0"/>
</attribute>
<multiplicity id="38" minimum="0" maximum="1">
<position height="0" width="0" x="0" y="0"/>
</multiplicity>
</end>
<end type="TARGET" refId="2" navigable="true"/>
<display labels="true" multiplicity="true"/>
</association>
<realization id="39">
<end type="SOURCE" refId="5"/>
<end type="TARGET" refId="3"/>
</realization>
<classifier-display autosize="true" stereotype="true" package="true" initial-value="false" signature="true" <classifier-display autosize="true" stereotype="true" package="true" initial-value="false" signature="true"
sort-features="false" accessors="true" visibility="true"> sort-features="false" accessors="true" visibility="true">
<attributes public="true" package="true" protected="true" private="true" static="true"/> <attributes public="true" package="true" protected="true" private="true" static="true"/>

View File

@ -66,6 +66,15 @@ public class App {
private NioReactor reactor; private NioReactor reactor;
private List<AbstractNioChannel> channels = new ArrayList<>(); private List<AbstractNioChannel> channels = new ArrayList<>();
private Dispatcher dispatcher;
/**
* Creates an instance of App which will use provided dispatcher for dispatching events on reactor.
* @param dispatcher the dispatcher that will be used to dispatch events.
*/
public App(Dispatcher dispatcher) {
this.dispatcher = dispatcher;
}
/** /**
* App entry. * App entry.
@ -73,16 +82,15 @@ public class App {
* @throws IOException * @throws IOException
*/ */
public static void main(String[] args) throws IOException { public static void main(String[] args) throws IOException {
new App().start(new ThreadPoolDispatcher(2)); new App(new ThreadPoolDispatcher(2)).start();
} }
/** /**
* Starts the NIO reactor. * Starts the NIO reactor.
* @param threadPoolDispatcher *
*
* @throws IOException if any channel fails to bind. * @throws IOException if any channel fails to bind.
*/ */
public void start(Dispatcher dispatcher) throws IOException { public void start() throws IOException {
/* /*
* The application can customize its event dispatching mechanism. * The application can customize its event dispatching mechanism.
*/ */
@ -110,8 +118,9 @@ public class App {
*/ */
public void stop() throws InterruptedException, IOException { public void stop() throws InterruptedException, IOException {
reactor.stop(); reactor.stop();
dispatcher.stop();
for (AbstractNioChannel channel : channels) { for (AbstractNioChannel channel : channels) {
channel.getChannel().close(); channel.getJavaChannel().close();
} }
} }

View File

@ -48,7 +48,7 @@ public abstract class AbstractNioChannel {
/** /**
* @return the wrapped NIO channel. * @return the wrapped NIO channel.
*/ */
public SelectableChannel getChannel() { public SelectableChannel getJavaChannel() {
return channel; return channel;
} }

View File

@ -64,8 +64,8 @@ public class NioDatagramChannel extends AbstractNioChannel {
* @return the underlying datagram channel. * @return the underlying datagram channel.
*/ */
@Override @Override
public DatagramChannel getChannel() { public DatagramChannel getJavaChannel() {
return (DatagramChannel) super.getChannel(); return (DatagramChannel) super.getJavaChannel();
} }
/** /**
@ -75,8 +75,8 @@ public class NioDatagramChannel extends AbstractNioChannel {
*/ */
@Override @Override
public void bind() throws IOException { public void bind() throws IOException {
getChannel().socket().bind(new InetSocketAddress(InetAddress.getLocalHost(), port)); getJavaChannel().socket().bind(new InetSocketAddress(InetAddress.getLocalHost(), port));
getChannel().configureBlocking(false); getJavaChannel().configureBlocking(false);
System.out.println("Bound UDP socket at port: " + port); System.out.println("Bound UDP socket at port: " + port);
} }
@ -87,7 +87,7 @@ public class NioDatagramChannel extends AbstractNioChannel {
@Override @Override
protected void doWrite(Object pendingWrite, SelectionKey key) throws IOException { protected void doWrite(Object pendingWrite, SelectionKey key) throws IOException {
DatagramPacket pendingPacket = (DatagramPacket) pendingWrite; DatagramPacket pendingPacket = (DatagramPacket) pendingWrite;
getChannel().send(pendingPacket.getData(), pendingPacket.getReceiver()); getJavaChannel().send(pendingPacket.getData(), pendingPacket.getReceiver());
} }
/** /**

View File

@ -74,12 +74,13 @@ public class NioReactor {
* Stops the reactor and related resources such as dispatcher. * Stops the reactor and related resources such as dispatcher.
* *
* @throws InterruptedException if interrupted while stopping the reactor. * @throws InterruptedException if interrupted while stopping the reactor.
* @throws IOException if any I/O error occurs.
*/ */
public void stop() throws InterruptedException { public void stop() throws InterruptedException, IOException {
reactorMain.shutdownNow(); reactorMain.shutdownNow();
selector.wakeup(); selector.wakeup();
reactorMain.awaitTermination(4, TimeUnit.SECONDS); reactorMain.awaitTermination(4, TimeUnit.SECONDS);
dispatcher.stop(); selector.close();
} }
/** /**
@ -94,7 +95,7 @@ public class NioReactor {
* @throws IOException if any I/O error occurs. * @throws IOException if any I/O error occurs.
*/ */
public NioReactor registerChannel(AbstractNioChannel channel) throws IOException { public NioReactor registerChannel(AbstractNioChannel channel) throws IOException {
SelectionKey key = channel.getChannel().register(selector, channel.getInterestedOps()); SelectionKey key = channel.getJavaChannel().register(selector, channel.getInterestedOps());
key.attach(channel); key.attach(channel);
channel.setReactor(this); channel.setReactor(this);
return this; return this;

View File

@ -43,8 +43,8 @@ public class NioServerSocketChannel extends AbstractNioChannel {
* @return the underlying {@link ServerSocketChannel}. * @return the underlying {@link ServerSocketChannel}.
*/ */
@Override @Override
public ServerSocketChannel getChannel() { public ServerSocketChannel getJavaChannel() {
return (ServerSocketChannel) super.getChannel(); return (ServerSocketChannel) super.getJavaChannel();
} }
/** /**
@ -71,8 +71,8 @@ public class NioServerSocketChannel extends AbstractNioChannel {
*/ */
@Override @Override
public void bind() throws IOException { public void bind() throws IOException {
((ServerSocketChannel) getChannel()).socket().bind(new InetSocketAddress(InetAddress.getLocalHost(), port)); ((ServerSocketChannel) getJavaChannel()).socket().bind(new InetSocketAddress(InetAddress.getLocalHost(), port));
((ServerSocketChannel) getChannel()).configureBlocking(false); ((ServerSocketChannel) getJavaChannel()).configureBlocking(false);
System.out.println("Bound TCP socket at port: " + port); System.out.println("Bound TCP socket at port: " + port);
} }

View File

@ -22,8 +22,8 @@ public class AppTest {
*/ */
@Test @Test
public void testAppUsingThreadPoolDispatcher() throws IOException, InterruptedException { public void testAppUsingThreadPoolDispatcher() throws IOException, InterruptedException {
App app = new App(); App app = new App(new ThreadPoolDispatcher(2));
app.start(new ThreadPoolDispatcher(2)); app.start();
AppClient client = new AppClient(); AppClient client = new AppClient();
client.start(); client.start();
@ -48,8 +48,8 @@ public class AppTest {
*/ */
@Test @Test
public void testAppUsingSameThreadDispatcher() throws IOException, InterruptedException { public void testAppUsingSameThreadDispatcher() throws IOException, InterruptedException {
App app = new App(); App app = new App(new SameThreadDispatcher());
app.start(new SameThreadDispatcher()); app.start();
AppClient client = new AppClient(); AppClient client = new AppClient();
client.start(); client.start();