From 8d03f52f0999864bc333fffee82c329e5bd013f2 Mon Sep 17 00:00:00 2001
From: Redkale <22250530@qq.com>
Date: Tue, 21 Mar 2017 13:06:15 +0800
Subject: [PATCH]
---
.../redkale/net/http/WebSocketServlet.java | 7 ++++---
src/org/redkale/service/Service.java | 10 ++++------
src/org/redkale/source/DataJdbcSource.java | 4 ++--
src/org/redkale/util/Resourcable.java | 19 +++++++++++++++++++
src/org/redkale/util/ResourceFactory.java | 16 ++++++++--------
5 files changed, 37 insertions(+), 19 deletions(-)
create mode 100644 src/org/redkale/util/Resourcable.java
diff --git a/src/org/redkale/net/http/WebSocketServlet.java b/src/org/redkale/net/http/WebSocketServlet.java
index dbc574925..0acfa50e5 100644
--- a/src/org/redkale/net/http/WebSocketServlet.java
+++ b/src/org/redkale/net/http/WebSocketServlet.java
@@ -39,7 +39,7 @@ import org.redkale.util.*;
*
* @author zhangjx
*/
-public abstract class WebSocketServlet extends HttpServlet {
+public abstract class WebSocketServlet extends HttpServlet implements Resourcable {
@Comment("WebScoket服务器给客户端进行ping操作的间隔时间, 单位: 秒")
public static final String WEBPARAM__LIVEINTERVAL = "liveinterval";
@@ -69,7 +69,7 @@ public abstract class WebSocketServlet extends HttpServlet {
public final void preInit(HttpContext context, AnyValue conf) {
InetSocketAddress addr = context.getServerAddress();
- this.engine = new WebSocketEngine(addr.getHostString() + ":" + addr.getPort() + "-[" + getResourceName() + "]", this.node, logger);
+ this.engine = new WebSocketEngine(addr.getHostString() + ":" + addr.getPort() + "-[" + resourceName() + "]", this.node, logger);
if (this.node == null) this.node = createWebSocketNode();
if (this.node == null) {
this.node = new WebSocketNodeService();
@@ -86,7 +86,8 @@ public abstract class WebSocketServlet extends HttpServlet {
engine.close();
}
- public String getResourceName() {
+ @Override
+ public String resourceName() {
return this.getClass().getSimpleName().replace("Servlet", "").replace("WebSocket", "").toLowerCase();
}
diff --git a/src/org/redkale/service/Service.java b/src/org/redkale/service/Service.java
index 67ca0075a..baeab1578 100644
--- a/src/org/redkale/service/Service.java
+++ b/src/org/redkale/service/Service.java
@@ -9,7 +9,7 @@ import org.redkale.util.*;
/**
* 所有Service的实现类不得声明为final, 允许远程模式的public方法都不能声明为final。
- * 注意: "$"是一个很特殊的Service.name值 。 被标记为@Resource(name = "$") 的Service的资源名与所属父Service的资源名一致。
+ * 注意: "$"是一个很特殊的Service.name值 。 被标记为@Resource(name = "$") 的Service的资源名与所属父Service的资源名一致。
*
*
* Service的资源类型 @@ -23,11 +23,9 @@ import org.redkale.util.*; *diff --git a/src/org/redkale/source/DataJdbcSource.java b/src/org/redkale/source/DataJdbcSource.java index 72bbca106..1834baf51 100644 --- a/src/org/redkale/source/DataJdbcSource.java +++ b/src/org/redkale/source/DataJdbcSource.java @@ -24,7 +24,7 @@ import org.redkale.util.*; * @author zhangjx */ @SuppressWarnings("unchecked") -public final class DataJdbcSource implements DataSource, DataCacheListener, Function* 异步方法: * Service编写异步方法: - * 1、异步方法有且仅有一个类型为AsyncHandler的参数,方法返回类型必须是void。 - * 2、必须存在对应的同步方法,同步的方法名与异步方法必须相同,方法的参数列表必须与异步方法除AsyncHandler参数的参数列表相同。 - * 例如: - * public int insertRecord(String name, Record record); - * + * 1、异步方法有且仅有一个类型为AsyncHandler的参数。 + * 2、异步方法返回类型必须是void。 + * 例如: * public void insertRecord(AsyncHandler<Integer, Record> handler, String name, @RpcAttachment Record record); * *, AutoCloseable { +public final class DataJdbcSource implements DataSource, Resourcable, DataCacheListener, Function , AutoCloseable { private static final Flipper FLIPPER_ONE = new Flipper(1); @@ -55,7 +55,7 @@ public final class DataJdbcSource implements DataSource, DataCacheListener, Func this.cacheForbidden = "NONE".equalsIgnoreCase(readprop.getProperty("shared-cache-mode")); } - public final String name() { + public final String resourceName() { return name; } diff --git a/src/org/redkale/util/Resourcable.java b/src/org/redkale/util/Resourcable.java new file mode 100644 index 000000000..03e64f35a --- /dev/null +++ b/src/org/redkale/util/Resourcable.java @@ -0,0 +1,19 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package org.redkale.util; + +/** + * 对象的类没有标记为@Resource, 可以通过实现Resourcable接口实现动态获取Resource.name + * + * + * 详情见: https://redkale.org + * + * @author zhangjx + */ +public interface Resourcable { + + public String resourceName(); +} diff --git a/src/org/redkale/util/ResourceFactory.java b/src/org/redkale/util/ResourceFactory.java index 57302bbef..90f66bf85 100644 --- a/src/org/redkale/util/ResourceFactory.java +++ b/src/org/redkale/util/ResourceFactory.java @@ -323,17 +323,17 @@ public final class ResourceFactory { if (consumer != null) consumer.accept(src, field); String tname = rc.name(); if (tname.contains(RESOURCE_PARENT_NAME)) { - try { - Resource res = src.getClass().getAnnotation(Resource.class); - if (res == null) { - String srcname = (String) src.getClass().getMethod("getResourceName").invoke(src); - tname = tname.replace(RESOURCE_PARENT_NAME, srcname); + Resource res = src.getClass().getAnnotation(Resource.class); + if (res == null) { + if (src instanceof Resourcable) { + tname = tname.replace(RESOURCE_PARENT_NAME, ((Resourcable) src).resourceName()); } else { - tname = res.name(); + logger.log(Level.SEVERE, src.getClass().getName() + " not found @Resource on Class or not implements Resourcable"); } - } catch (Exception e) { // 获取src中的name()方法的值, 异常则忽略 - logger.log(Level.SEVERE, src.getClass().getName() + " not found @Resource on Class or [public String getResourceName()] method", e); + } else { + tname = res.name(); } + } final String rcname = tname; ResourceEntry re = findEntry(rcname, genctype);