diff --git a/src/org/redkale/net/AsyncConnection.java b/src/org/redkale/net/AsyncConnection.java index 17607ae34..06db74e20 100644 --- a/src/org/redkale/net/AsyncConnection.java +++ b/src/org/redkale/net/AsyncConnection.java @@ -11,6 +11,7 @@ import java.nio.ByteBuffer; import java.nio.channels.*; import java.util.*; import java.util.concurrent.*; +import java.util.concurrent.atomic.AtomicLong; /** * @@ -25,6 +26,12 @@ public abstract class AsyncConnection implements AsynchronousByteChannel, AutoCl protected Object subobject; //用于存储绑定在Connection上的对象, 同attributes, 只绑定单个对象时尽量使用subobject而非attributes + //关闭数 + AtomicLong closedCounter = new AtomicLong(); + + //在线数 + AtomicLong livingCounter = new AtomicLong(); + public abstract boolean isTCP(); public abstract SocketAddress getRemoteAddress(); @@ -54,6 +61,14 @@ public abstract class AsyncConnection implements AsynchronousByteChannel, AutoCl @Override public void close() throws IOException { + if (closedCounter != null) { + closedCounter.incrementAndGet(); + closedCounter = null; + } + if (livingCounter != null) { + livingCounter.decrementAndGet(); + livingCounter = null; + } if (attributes == null) return; try { for (Object obj : attributes.values()) { diff --git a/src/org/redkale/net/ProtocolServer.java b/src/org/redkale/net/ProtocolServer.java index 5003c6e6d..dd3eaa3d1 100644 --- a/src/org/redkale/net/ProtocolServer.java +++ b/src/org/redkale/net/ProtocolServer.java @@ -11,15 +11,27 @@ import java.nio.ByteBuffer; import java.nio.channels.*; import java.util.*; import java.util.concurrent.*; +import java.util.concurrent.atomic.AtomicLong; /** * 协议底层Server * - *
详情见: https://redkale.org + *
+ * 详情见: https://redkale.org
+ *
* @author zhangjx
*/
public abstract class ProtocolServer {
+ //创建数
+ protected final AtomicLong createCounter = new AtomicLong();
+
+ //关闭数
+ protected final AtomicLong closedCounter = new AtomicLong();
+
+ //在线数
+ protected final AtomicLong livingCounter = new AtomicLong();
+
public abstract void open() throws IOException;
public abstract void bind(SocketAddress local, int backlog) throws IOException;
@@ -34,6 +46,18 @@ public abstract class ProtocolServer {
public abstract AsynchronousChannelGroup getChannelGroup();
+ public long getCreateCount() {
+ return createCounter.longValue();
+ }
+
+ public long getClosedCount() {
+ return closedCounter.longValue();
+ }
+
+ public long getLivingCount() {
+ return livingCounter.longValue();
+ }
+
//---------------------------------------------------------------------
public static ProtocolServer create(String protocol, Context context) {
if ("TCP".equalsIgnoreCase(protocol)) return new ProtocolTCPServer(context);
@@ -117,6 +141,20 @@ public abstract class ProtocolServer {
return null;
}
+ @Override
+ public long getCreateCount() {
+ return -1;
+ }
+
+ @Override
+ public long getClosedCount() {
+ return -1;
+ }
+
+ @Override
+ public long getLivingCount() {
+ return -1;
+ }
}
private static final class ProtocolTCPServer extends ProtocolServer {
@@ -160,7 +198,12 @@ public abstract class ProtocolServer {
@Override
public void completed(final AsynchronousSocketChannel channel, Void attachment) {
serchannel.accept(null, this);
- context.submitAsync(new PrepareRunner(context, AsyncConnection.create(channel, null, context.readTimeoutSecond, context.writeTimeoutSecond), null));
+ createCounter.incrementAndGet();
+ livingCounter.incrementAndGet();
+ AsyncConnection conn = AsyncConnection.create(channel, null, context.readTimeoutSecond, context.writeTimeoutSecond);
+ conn.livingCounter = livingCounter;
+ conn.closedCounter = closedCounter;
+ context.submitAsync(new PrepareRunner(context, conn, null));
}
@Override
diff --git a/src/org/redkale/net/Server.java b/src/org/redkale/net/Server.java
index 8b460c80e..af9295b73 100644
--- a/src/org/redkale/net/Server.java
+++ b/src/org/redkale/net/Server.java
@@ -185,6 +185,21 @@ public abstract class Server