diff --git a/src/main/java/org/jboss/netty/channel/local/LocalAddress.java b/src/main/java/org/jboss/netty/channel/local/LocalAddress.java index b17ac00755..f572e0a147 100644 --- a/src/main/java/org/jboss/netty/channel/local/LocalAddress.java +++ b/src/main/java/org/jboss/netty/channel/local/LocalAddress.java @@ -22,6 +22,10 @@ package org.jboss.netty.channel.local; import java.net.SocketAddress; +import java.util.concurrent.ConcurrentMap; +import java.util.concurrent.atomic.AtomicLong; + +import org.jboss.netty.util.ConcurrentWeakHashMap; /** * @author Andy Taylor @@ -30,19 +34,51 @@ import java.net.SocketAddress; public class LocalAddress extends SocketAddress implements Comparable { private static final long serialVersionUID = -3601961747680808645L; - private final String id; + private static final ConcurrentMap addresses = + new ConcurrentWeakHashMap(); - public LocalAddress(String id) { + private static final AtomicLong nextEphemeralPort = new AtomicLong(); + + public static LocalAddress getInstance(String id) { + if (id == null) { + throw new NullPointerException("id"); + } + LocalAddress a = addresses.get(id); + if (a == null) { + a = new LocalAddress(id); + LocalAddress oldA = addresses.putIfAbsent(id, a); + if (oldA != null) { + a = oldA; + } + } + + return a; + } + + public static LocalAddress newEphemeralInstance() { + return getInstance("ephemeral-" + nextEphemeralPort.incrementAndGet()); + } + + private final String id; + private final boolean ephemeral; + + private LocalAddress(String id) { if (id == null) { throw new NullPointerException("id"); } this.id = id; + + ephemeral = id.startsWith("ephemeral-"); } public String getId() { return id; } + public boolean isEphemeral() { + return ephemeral; + } + @Override public int hashCode() { return id.hashCode(); diff --git a/src/main/java/org/jboss/netty/example/local/LocalExample.java b/src/main/java/org/jboss/netty/example/local/LocalExample.java index 4f0b2d26f2..6dbece2317 100644 --- a/src/main/java/org/jboss/netty/example/local/LocalExample.java +++ b/src/main/java/org/jboss/netty/example/local/LocalExample.java @@ -47,7 +47,7 @@ public class LocalExample { LocalServerChannelFactory factory = LocalServerChannels.registerServerChannel("localChannel"); ServerBootstrap bootstrap = new ServerBootstrap(factory); EchoHandler handler = new EchoHandler(); - LocalAddress socketAddress = new LocalAddress("1"); + LocalAddress socketAddress = LocalAddress.getInstance("1"); bootstrap.getPipeline().addLast("handler", handler); bootstrap.bind(socketAddress); diff --git a/src/main/java/org/jboss/netty/example/servlet/LocalTransportRegister.java b/src/main/java/org/jboss/netty/example/servlet/LocalTransportRegister.java index 05c70d6f1b..fa36c0cc12 100644 --- a/src/main/java/org/jboss/netty/example/servlet/LocalTransportRegister.java +++ b/src/main/java/org/jboss/netty/example/servlet/LocalTransportRegister.java @@ -43,7 +43,7 @@ public class LocalTransportRegister { ServerBootstrap serverBootstrap = new ServerBootstrap(serverChannelFactory); EchoHandler handler = new EchoHandler(); serverBootstrap.getPipeline().addLast("handler", handler); - Channel channel = serverBootstrap.bind(new LocalAddress("localAddress")); + Channel channel = serverBootstrap.bind(LocalAddress.getInstance("localAddress")); } public void stop() { diff --git a/src/main/java/org/jboss/netty/servlet/NettySessionListener.java b/src/main/java/org/jboss/netty/servlet/NettySessionListener.java index 3c99a5d453..b40df2ae8c 100644 --- a/src/main/java/org/jboss/netty/servlet/NettySessionListener.java +++ b/src/main/java/org/jboss/netty/servlet/NettySessionListener.java @@ -60,7 +60,7 @@ public class NettySessionListener implements HttpSessionListener, ChannelHandler return pipeline; } }); - ChannelFuture future = bootstrap.connect(new LocalAddress("netty")); + ChannelFuture future = bootstrap.connect(LocalAddress.getInstance("netty")); future.awaitUninterruptibly(); final Channel ch = future.getChannel(); session.setAttribute(CHANNEL_PROP, ch);