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);