Merge branch 'develop' into hotfix_337
This commit is contained in:
commit
52fe7d52c1
@ -40,9 +40,9 @@ It is super easy to get started with your first project.
|
||||
|
||||
You can download the package from the [latest stable release](https://github.com/alibaba/nacos/releases).
|
||||
|
||||
Take release nacos-server-0.4.0.zip for example.
|
||||
Take release nacos-server-0.5.0.zip for example.
|
||||
```
|
||||
unzip nacos-server-0.4.0.zip
|
||||
unzip nacos-server-0.5.0.zip
|
||||
cd nacos/bin
|
||||
```
|
||||
|
||||
|
@ -25,62 +25,53 @@ import com.alibaba.nacos.api.naming.NamingService;
|
||||
|
||||
/**
|
||||
* Nacos Factory
|
||||
*
|
||||
* @author Nacos
|
||||
*
|
||||
* @author Nacos
|
||||
*/
|
||||
public class NacosFactory {
|
||||
|
||||
/**
|
||||
* Create config
|
||||
*
|
||||
* @param properties
|
||||
* init param
|
||||
* @return config
|
||||
* @throws NacosException
|
||||
* Exception
|
||||
*/
|
||||
public static ConfigService createConfigService(Properties properties) throws NacosException {
|
||||
return ConfigFactory.createConfigService(properties);
|
||||
}
|
||||
/**
|
||||
* Create config
|
||||
*
|
||||
* @param properties init param
|
||||
* @return config
|
||||
* @throws NacosException Exception
|
||||
*/
|
||||
public static ConfigService createConfigService(Properties properties) throws NacosException {
|
||||
return ConfigFactory.createConfigService(properties);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create config
|
||||
*
|
||||
* @param serverAddr
|
||||
* server list
|
||||
* @return config
|
||||
* @throws NacosException
|
||||
* Exception
|
||||
*/
|
||||
public static ConfigService createConfigService(String serverAddr) throws NacosException {
|
||||
return ConfigFactory.createConfigService(serverAddr);
|
||||
}
|
||||
/**
|
||||
* Create config
|
||||
*
|
||||
* @param serverAddr server list
|
||||
* @return config
|
||||
* @throws NacosException Exception
|
||||
*/
|
||||
public static ConfigService createConfigService(String serverAddr) throws NacosException {
|
||||
return ConfigFactory.createConfigService(serverAddr);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create Naming
|
||||
*
|
||||
* @param serverAddr
|
||||
* server list
|
||||
* @return Naming
|
||||
* @throws NacosException
|
||||
* Exception
|
||||
*/
|
||||
public static NamingService createNamingService(String serverAddr) throws NacosException {
|
||||
return NamingFactory.createNamingService(serverAddr);
|
||||
}
|
||||
/**
|
||||
* Create Naming
|
||||
*
|
||||
* @param serverAddr server list
|
||||
* @return Naming
|
||||
* @throws NacosException Exception
|
||||
*/
|
||||
public static NamingService createNamingService(String serverAddr) throws NacosException {
|
||||
return NamingFactory.createNamingService(serverAddr);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create Naming
|
||||
*
|
||||
* @param properties
|
||||
* init param
|
||||
* @return Naming
|
||||
* @throws NacosException
|
||||
* Exception
|
||||
*/
|
||||
public static NamingService createNamingService(Properties properties) throws NacosException {
|
||||
return NamingFactory.createNamingService(properties);
|
||||
}
|
||||
/**
|
||||
* Create Naming
|
||||
*
|
||||
* @param properties init param
|
||||
* @return Naming
|
||||
* @throws NacosException Exception
|
||||
*/
|
||||
public static NamingService createNamingService(Properties properties) throws NacosException {
|
||||
return NamingFactory.createNamingService(properties);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -17,19 +17,19 @@ package com.alibaba.nacos.api;
|
||||
|
||||
/**
|
||||
* properties key
|
||||
* @author Nacos
|
||||
*
|
||||
* @author Nacos
|
||||
*/
|
||||
public class PropertyKeyConst {
|
||||
|
||||
public final static String ENDPOINT = "endpoint";
|
||||
public final static String NAMESPACE = "namespace";
|
||||
public final static String ACCESS_KEY = "accessKey";
|
||||
public final static String SECRET_KEY = "secretKey";
|
||||
public final static String SERVER_ADDR = "serverAddr";
|
||||
public final static String CONTEXT_PATH = "contextPath";
|
||||
public final static String CLUSTER_NAME = "clusterName";
|
||||
public final static String ENCODE = "encode";
|
||||
public final static String NAMING_LOAD_CACHE_AT_START = "namingLoadCacheAtStart";
|
||||
|
||||
public final static String ENDPOINT = "endpoint";
|
||||
public final static String NAMESPACE = "namespace";
|
||||
public final static String ACCESS_KEY = "accessKey";
|
||||
public final static String SECRET_KEY = "secretKey";
|
||||
public final static String SERVER_ADDR = "serverAddr";
|
||||
public final static String CONTEXT_PATH = "contextPath";
|
||||
public final static String CLUSTER_NAME = "clusterName";
|
||||
public final static String ENCODE = "encode";
|
||||
public final static String NAMING_LOAD_CACHE_AT_START = "namingLoadCacheAtStart";
|
||||
|
||||
}
|
||||
|
@ -17,115 +17,114 @@ package com.alibaba.nacos.api.common;
|
||||
|
||||
/**
|
||||
* Constant
|
||||
*
|
||||
* @author Nacos
|
||||
*
|
||||
* @author Nacos
|
||||
*/
|
||||
public class Constants {
|
||||
|
||||
public static final String CLIENT_VERSION_HEADER = "Client-Version";
|
||||
public static final String CLIENT_VERSION_HEADER = "Client-Version";
|
||||
|
||||
public static final String CLIENT_VERSION = "3.0.0";
|
||||
public static final String CLIENT_VERSION = "3.0.0";
|
||||
|
||||
public static int DATA_IN_BODY_VERSION = 204;
|
||||
public static int DATA_IN_BODY_VERSION = 204;
|
||||
|
||||
public static final String DEFAULT_GROUP = "DEFAULT_GROUP";
|
||||
public static final String DEFAULT_GROUP = "DEFAULT_GROUP";
|
||||
|
||||
public static final String APPNAME = "AppName";
|
||||
public static final String APPNAME = "AppName";
|
||||
|
||||
public static final String UNKNOWN_APP = "UnknownApp";
|
||||
public static final String UNKNOWN_APP = "UnknownApp";
|
||||
|
||||
public static final String DEFAULT_DOMAINNAME = "commonconfig.config-host.taobao.com";
|
||||
public static final String DEFAULT_DOMAINNAME = "commonconfig.config-host.taobao.com";
|
||||
|
||||
public static final String DAILY_DOMAINNAME = "commonconfig.taobao.net";
|
||||
public static final String DAILY_DOMAINNAME = "commonconfig.taobao.net";
|
||||
|
||||
public static final String NULL = "";
|
||||
public static final String NULL = "";
|
||||
|
||||
public static final String DATAID = "dataId";
|
||||
public static final String DATAID = "dataId";
|
||||
|
||||
public static final String GROUP = "group";
|
||||
public static final String GROUP = "group";
|
||||
|
||||
public static final String LAST_MODIFIED = "Last-Modified";
|
||||
public static final String LAST_MODIFIED = "Last-Modified";
|
||||
|
||||
public static final String ACCEPT_ENCODING = "Accept-Encoding";
|
||||
public static final String ACCEPT_ENCODING = "Accept-Encoding";
|
||||
|
||||
public static final String CONTENT_ENCODING = "Content-Encoding";
|
||||
public static final String CONTENT_ENCODING = "Content-Encoding";
|
||||
|
||||
public static final String PROBE_MODIFY_REQUEST = "Listening-Configs";
|
||||
public static final String PROBE_MODIFY_REQUEST = "Listening-Configs";
|
||||
|
||||
public static final String PROBE_MODIFY_RESPONSE = "Probe-Modify-Response";
|
||||
public static final String PROBE_MODIFY_RESPONSE = "Probe-Modify-Response";
|
||||
|
||||
public static final String PROBE_MODIFY_RESPONSE_NEW = "Probe-Modify-Response-New";
|
||||
public static final String PROBE_MODIFY_RESPONSE_NEW = "Probe-Modify-Response-New";
|
||||
|
||||
public static final String USE_ZIP = "true";
|
||||
public static final String USE_ZIP = "true";
|
||||
|
||||
public static final String CONTENT_MD5 = "Content-MD5";
|
||||
public static final String CONTENT_MD5 = "Content-MD5";
|
||||
|
||||
public static final String CONFIG_VERSION = "Config-Version";
|
||||
public static final String CONFIG_VERSION = "Config-Version";
|
||||
|
||||
public static final String IF_MODIFIED_SINCE = "If-Modified-Since";
|
||||
public static final String IF_MODIFIED_SINCE = "If-Modified-Since";
|
||||
|
||||
public static final String SPACING_INTERVAL = "client-spacing-interval";
|
||||
public static final String SPACING_INTERVAL = "client-spacing-interval";
|
||||
|
||||
public static final String BASE_PATH = "/v1/cs";
|
||||
public static final String BASE_PATH = "/v1/cs";
|
||||
|
||||
public static final String CONFIG_CONTROLLER_PATH = BASE_PATH + "/configs";
|
||||
public static final String CONFIG_CONTROLLER_PATH = BASE_PATH + "/configs";
|
||||
|
||||
/**
|
||||
* second
|
||||
*/
|
||||
public static final int ASYNC_UPDATE_ADDRESS_INTERVAL = 300;
|
||||
/**
|
||||
* second
|
||||
*/
|
||||
public static final int ASYNC_UPDATE_ADDRESS_INTERVAL = 300;
|
||||
|
||||
/**
|
||||
* second
|
||||
*/
|
||||
public static final int POLLING_INTERVAL_TIME = 15;
|
||||
/**
|
||||
* second
|
||||
*/
|
||||
public static final int POLLING_INTERVAL_TIME = 15;
|
||||
|
||||
/**
|
||||
* millisecond
|
||||
*/
|
||||
public static final int ONCE_TIMEOUT = 2000;
|
||||
/**
|
||||
* millisecond
|
||||
*/
|
||||
public static final int ONCE_TIMEOUT = 2000;
|
||||
|
||||
/**
|
||||
* millisecond
|
||||
*/
|
||||
public static final int CONN_TIMEOUT = 2000;
|
||||
/**
|
||||
* millisecond
|
||||
*/
|
||||
public static final int CONN_TIMEOUT = 2000;
|
||||
|
||||
/**
|
||||
* millisecond
|
||||
*/
|
||||
public static final int SO_TIMEOUT = 60000;
|
||||
/**
|
||||
* millisecond
|
||||
*/
|
||||
public static final int SO_TIMEOUT = 60000;
|
||||
|
||||
/**
|
||||
* millisecond
|
||||
*/
|
||||
public static final int RECV_WAIT_TIMEOUT = ONCE_TIMEOUT * 5;
|
||||
/**
|
||||
* millisecond
|
||||
*/
|
||||
public static final int RECV_WAIT_TIMEOUT = ONCE_TIMEOUT * 5;
|
||||
|
||||
public static final String ENCODE = "UTF-8";
|
||||
public static final String ENCODE = "UTF-8";
|
||||
|
||||
public static final String MAP_FILE = "map-file.js";
|
||||
public static final String MAP_FILE = "map-file.js";
|
||||
|
||||
public static final int FLOW_CONTROL_THRESHOLD = 20;
|
||||
public static final int FLOW_CONTROL_THRESHOLD = 20;
|
||||
|
||||
public static final int FLOW_CONTROL_SLOT = 10;
|
||||
public static final int FLOW_CONTROL_SLOT = 10;
|
||||
|
||||
public static final int FLOW_CONTROL_INTERVAL = 1000;
|
||||
public static final int FLOW_CONTROL_INTERVAL = 1000;
|
||||
|
||||
public static final String LINE_SEPARATOR = Character.toString((char) 1);
|
||||
public static final String LINE_SEPARATOR = Character.toString((char)1);
|
||||
|
||||
public static final String WORD_SEPARATOR = Character.toString((char) 2);
|
||||
public static final String WORD_SEPARATOR = Character.toString((char)2);
|
||||
|
||||
public static final String LONGPULLING_LINE_SEPARATOR = "\r\n";
|
||||
public static final String LONGPULLING_LINE_SEPARATOR = "\r\n";
|
||||
|
||||
public static final String CLIENT_APPNAME_HEADER = "Client-AppName";
|
||||
public static final String CLIENT_REQUEST_TS_HEADER = "Client-RequestTS";
|
||||
public static final String CLIENT_REQUEST_TOKEN_HEADER = "Client-RequestToken";
|
||||
public static final String CLIENT_APPNAME_HEADER = "Client-AppName";
|
||||
public static final String CLIENT_REQUEST_TS_HEADER = "Client-RequestTS";
|
||||
public static final String CLIENT_REQUEST_TOKEN_HEADER = "Client-RequestToken";
|
||||
|
||||
public static final int ATOMIC_MAX_SIZE = 1000;
|
||||
public static final int ATOMIC_MAX_SIZE = 1000;
|
||||
|
||||
public static final String NAMING_INSTANCE_ID_SPLITTER = "#";
|
||||
public static final int NAMING_INSTANCE_ID_SEG_COUNT = 4;
|
||||
public static final String NAMING_HTTP_HEADER_SPILIER = "\\|";
|
||||
public static final String NAMING_INSTANCE_ID_SPLITTER = "#";
|
||||
public static final int NAMING_INSTANCE_ID_SEG_COUNT = 4;
|
||||
public static final String NAMING_HTTP_HEADER_SPILIER = "\\|";
|
||||
|
||||
public static final String NAMING_DEFAULT_CLUSTER_NAME = "DEFAULT";
|
||||
public static final String NAMING_DEFAULT_CLUSTER_NAME = "DEFAULT";
|
||||
}
|
||||
|
@ -23,52 +23,47 @@ import com.alibaba.nacos.api.exception.NacosException;
|
||||
|
||||
/**
|
||||
* Config Factory
|
||||
*
|
||||
* @author Nacos
|
||||
*
|
||||
* @author Nacos
|
||||
*/
|
||||
public class ConfigFactory {
|
||||
|
||||
/**
|
||||
* Create Config
|
||||
*
|
||||
* @param properties
|
||||
* init param
|
||||
* @return Config
|
||||
* @throws NacosException
|
||||
* Exception
|
||||
*/
|
||||
public static ConfigService createConfigService(Properties properties) throws NacosException {
|
||||
try {
|
||||
Class<?> driverImplClass = Class.forName("com.alibaba.nacos.client.config.NacosConfigService");
|
||||
Constructor constructor = driverImplClass.getConstructor(Properties.class);
|
||||
ConfigService vendorImpl = (ConfigService) constructor.newInstance(properties);
|
||||
return vendorImpl;
|
||||
} catch (Throwable e) {
|
||||
throw new NacosException(-400, e.getMessage());
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Create Config
|
||||
*
|
||||
* @param properties init param
|
||||
* @return Config
|
||||
* @throws NacosException Exception
|
||||
*/
|
||||
public static ConfigService createConfigService(Properties properties) throws NacosException {
|
||||
try {
|
||||
Class<?> driverImplClass = Class.forName("com.alibaba.nacos.client.config.NacosConfigService");
|
||||
Constructor constructor = driverImplClass.getConstructor(Properties.class);
|
||||
ConfigService vendorImpl = (ConfigService)constructor.newInstance(properties);
|
||||
return vendorImpl;
|
||||
} catch (Throwable e) {
|
||||
throw new NacosException(-400, e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Create Config
|
||||
*
|
||||
* @param ServerAddr
|
||||
* serverlist
|
||||
* @return Config
|
||||
* @throws NacosException
|
||||
* Exception
|
||||
*/
|
||||
public static ConfigService createConfigService(String serverAddr) throws NacosException {
|
||||
Properties properties = new Properties();
|
||||
properties.put(PropertyKeyConst.SERVER_ADDR, serverAddr);
|
||||
try {
|
||||
Class<?> driverImplClass = Class.forName("com.alibaba.nacos.client.config.NacosConfigService");
|
||||
Constructor constructor = driverImplClass.getConstructor(Properties.class);
|
||||
ConfigService vendorImpl = (ConfigService) constructor.newInstance(properties);
|
||||
return vendorImpl;
|
||||
} catch (Throwable e) {
|
||||
throw new NacosException(-400, e.getMessage());
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Create Config
|
||||
*
|
||||
* @param ServerAddr serverlist
|
||||
* @return Config
|
||||
* @throws NacosException Exception
|
||||
*/
|
||||
public static ConfigService createConfigService(String serverAddr) throws NacosException {
|
||||
Properties properties = new Properties();
|
||||
properties.put(PropertyKeyConst.SERVER_ADDR, serverAddr);
|
||||
try {
|
||||
Class<?> driverImplClass = Class.forName("com.alibaba.nacos.client.config.NacosConfigService");
|
||||
Constructor constructor = driverImplClass.getConstructor(Properties.class);
|
||||
ConfigService vendorImpl = (ConfigService)constructor.newInstance(properties);
|
||||
return vendorImpl;
|
||||
} catch (Throwable e) {
|
||||
throw new NacosException(-400, e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -20,91 +20,70 @@ import com.alibaba.nacos.api.exception.NacosException;
|
||||
|
||||
/**
|
||||
* Config Interface
|
||||
*
|
||||
* @author Nacos
|
||||
*
|
||||
* @author Nacos
|
||||
*/
|
||||
public interface ConfigService {
|
||||
|
||||
/**
|
||||
* Get Configuration
|
||||
*
|
||||
* @param dataId
|
||||
* Config ID
|
||||
* @param group
|
||||
* Config Group
|
||||
* @param timeoutMs
|
||||
* read timeout
|
||||
* @return config value
|
||||
* @throws NacosException
|
||||
* NacosException
|
||||
*/
|
||||
String getConfig(String dataId, String group, long timeoutMs) throws NacosException;
|
||||
/**
|
||||
* Get Configuration
|
||||
*
|
||||
* @param dataId Config ID
|
||||
* @param group Config Group
|
||||
* @param timeoutMs read timeout
|
||||
* @return config value
|
||||
* @throws NacosException NacosException
|
||||
*/
|
||||
String getConfig(String dataId, String group, long timeoutMs) throws NacosException;
|
||||
|
||||
/**
|
||||
* Add a listener to the configuration, after the server to modify the
|
||||
* configuration, the client will use the incoming listener callback.
|
||||
* Recommended asynchronous processing, the application can implement the
|
||||
* getExecutor method in the ManagerListener, provide a thread pool of
|
||||
* execution. If provided, use the main thread callback, May block other
|
||||
* configurations or be blocked by other configurations.
|
||||
*
|
||||
* @param dataId
|
||||
* Config ID
|
||||
* @param group
|
||||
* Config Group
|
||||
* @param listener
|
||||
* listener
|
||||
* @throws NacosException
|
||||
* NacosException
|
||||
*/
|
||||
void addListener(String dataId, String group, Listener listener) throws NacosException;
|
||||
/**
|
||||
* Add a listener to the configuration, after the server to modify the configuration, the client will use the
|
||||
* incoming listener callback. Recommended asynchronous processing, the application can implement the getExecutor
|
||||
* method in the ManagerListener, provide a thread pool of execution. If provided, use the main thread callback, May
|
||||
* block other configurations or be blocked by other configurations.
|
||||
*
|
||||
* @param dataId Config ID
|
||||
* @param group Config Group
|
||||
* @param listener listener
|
||||
* @throws NacosException NacosException
|
||||
*/
|
||||
void addListener(String dataId, String group, Listener listener) throws NacosException;
|
||||
|
||||
/**
|
||||
* publish config.
|
||||
*
|
||||
* @param dataId
|
||||
* Config ID
|
||||
* @param group
|
||||
* Config Group
|
||||
* @param content
|
||||
* Config Content
|
||||
* @return Whether publish
|
||||
* @throws NacosException
|
||||
* NacosException
|
||||
*/
|
||||
boolean publishConfig(String dataId, String group, String content) throws NacosException;
|
||||
/**
|
||||
* publish config.
|
||||
*
|
||||
* @param dataId Config ID
|
||||
* @param group Config Group
|
||||
* @param content Config Content
|
||||
* @return Whether publish
|
||||
* @throws NacosException NacosException
|
||||
*/
|
||||
boolean publishConfig(String dataId, String group, String content) throws NacosException;
|
||||
|
||||
/**
|
||||
* Remove Config
|
||||
*
|
||||
* @param dataId
|
||||
* Config ID
|
||||
* @param group
|
||||
* Config Group
|
||||
* @return whether remove
|
||||
* @throws NacosException
|
||||
* NacosException
|
||||
*/
|
||||
boolean removeConfig(String dataId, String group) throws NacosException;
|
||||
/**
|
||||
* Remove Config
|
||||
*
|
||||
* @param dataId Config ID
|
||||
* @param group Config Group
|
||||
* @return whether remove
|
||||
* @throws NacosException NacosException
|
||||
*/
|
||||
boolean removeConfig(String dataId, String group) throws NacosException;
|
||||
|
||||
/**
|
||||
* Remove Listener
|
||||
*
|
||||
* @param dataId
|
||||
* Config ID
|
||||
* @param group
|
||||
* Config Group
|
||||
* @param listener
|
||||
* listener
|
||||
*/
|
||||
void removeListener(String dataId, String group, Listener listener);
|
||||
|
||||
/**
|
||||
* server health info
|
||||
*
|
||||
* @return whether health
|
||||
*/
|
||||
String getServerStatus();
|
||||
/**
|
||||
* Remove Listener
|
||||
*
|
||||
* @param dataId Config ID
|
||||
* @param group Config Group
|
||||
* @param listener listener
|
||||
*/
|
||||
void removeListener(String dataId, String group, Listener listener);
|
||||
|
||||
/**
|
||||
* server health info
|
||||
*
|
||||
* @return whether health
|
||||
*/
|
||||
String getServerStatus();
|
||||
|
||||
}
|
||||
|
@ -56,8 +56,7 @@ public @interface NacosConfigListener {
|
||||
Class<? extends NacosConfigConverter> converter() default NacosConfigConverter.class;
|
||||
|
||||
/**
|
||||
* The {@link NacosProperties} attribute, If not specified, it will use
|
||||
* global Nacos Properties.
|
||||
* The {@link NacosProperties} attribute, If not specified, it will use global Nacos Properties.
|
||||
*
|
||||
* @return the default value is {@link NacosProperties}
|
||||
*/
|
||||
|
@ -23,7 +23,6 @@ import java.lang.annotation.*;
|
||||
|
||||
import static com.alibaba.nacos.api.common.Constants.DEFAULT_GROUP;
|
||||
|
||||
|
||||
/**
|
||||
* An annotation for Nacos configuration Properties for binding POJO as Properties Object.
|
||||
*
|
||||
@ -51,51 +50,46 @@ public @interface NacosConfigurationProperties {
|
||||
String dataId();
|
||||
|
||||
/**
|
||||
* It indicates the properties of current doBind bean is auto-refreshed
|
||||
* when Nacos configuration is changed.
|
||||
* It indicates the properties of current doBind bean is auto-refreshed when Nacos configuration is changed.
|
||||
*
|
||||
* @return default value is <code>false</code>
|
||||
*/
|
||||
boolean autoRefreshed() default false;
|
||||
|
||||
|
||||
/**
|
||||
* Flag to indicate that when binding to this object invalid fields should be ignored.
|
||||
* Invalid means invalid according to the binder that is used, and usually this means
|
||||
* fields of the wrong type (or that cannot be coerced into the correct type).
|
||||
* Flag to indicate that when binding to this object invalid fields should be ignored. Invalid means invalid
|
||||
* according to the binder that is used, and usually this means fields of the wrong type (or that cannot be coerced
|
||||
* into the correct type).
|
||||
*
|
||||
* @return the flag value (default false)
|
||||
*/
|
||||
boolean ignoreInvalidFields() default false;
|
||||
|
||||
/**
|
||||
* Flag to indicate that when binding to this object fields with periods in their
|
||||
* names should be ignored.
|
||||
* Flag to indicate that when binding to this object fields with periods in their names should be ignored.
|
||||
*
|
||||
* @return the flag value (default false)
|
||||
*/
|
||||
boolean ignoreNestedProperties() default false;
|
||||
|
||||
/**
|
||||
* Flag to indicate that when binding to this object unknown fields should be ignored.
|
||||
* An unknown field could be a sign of a mistake in the Properties.
|
||||
* Flag to indicate that when binding to this object unknown fields should be ignored. An unknown field could be a
|
||||
* sign of a mistake in the Properties.
|
||||
*
|
||||
* @return the flag value (default true)
|
||||
*/
|
||||
boolean ignoreUnknownFields() default true;
|
||||
|
||||
/**
|
||||
* Flag to indicate that an exception should be raised if a Validator is available and
|
||||
* validation fails. If it is set to false, validation errors will be swallowed. They
|
||||
* will be logged, but not propagated to the caller.
|
||||
* Flag to indicate that an exception should be raised if a Validator is available and validation fails. If it is
|
||||
* set to false, validation errors will be swallowed. They will be logged, but not propagated to the caller.
|
||||
*
|
||||
* @return the flag value (default true)
|
||||
*/
|
||||
boolean exceptionIfInvalid() default true;
|
||||
|
||||
/**
|
||||
* The {@link NacosProperties} attribute, If not specified, it will use
|
||||
* global Nacos Properties.
|
||||
* The {@link NacosProperties} attribute, If not specified, it will use global Nacos Properties.
|
||||
*
|
||||
* @return the default value is {@link NacosProperties}
|
||||
*/
|
||||
|
@ -18,8 +18,7 @@ package com.alibaba.nacos.api.config.annotation;
|
||||
import java.lang.annotation.*;
|
||||
|
||||
/**
|
||||
* An annotation for ignore field from annotated
|
||||
* {@link NacosConfigurationProperties} Properties Object.
|
||||
* An annotation for ignore field from annotated {@link NacosConfigurationProperties} Properties Object.
|
||||
*
|
||||
* @author <a href="mailto:mercyblitz@gmail.com">Mercy</a>
|
||||
* @see NacosConfigurationProperties
|
||||
|
@ -18,9 +18,8 @@ package com.alibaba.nacos.api.config.annotation;
|
||||
import java.lang.annotation.*;
|
||||
|
||||
/**
|
||||
* An annotation for Nacos Property name of Nacos Configuration to
|
||||
* bind a field from annotated {@link NacosConfigurationProperties}
|
||||
* Properties Object.
|
||||
* An annotation for Nacos Property name of Nacos Configuration to bind a field from annotated {@link
|
||||
* NacosConfigurationProperties} Properties Object.
|
||||
*
|
||||
* @author <a href="mailto:mercyblitz@gmail.com">Mercy</a>
|
||||
* @see NacosConfigurationProperties
|
||||
|
@ -40,5 +40,4 @@ public interface NacosConfigConverter<T> {
|
||||
*/
|
||||
T convert(String config);
|
||||
|
||||
|
||||
}
|
||||
|
@ -17,26 +17,23 @@ package com.alibaba.nacos.api.config.filter;
|
||||
|
||||
/**
|
||||
* Config Context Interface
|
||||
*
|
||||
* @author Nacos
|
||||
*
|
||||
* @author Nacos
|
||||
*/
|
||||
public interface IConfigContext {
|
||||
/**
|
||||
* get context by key
|
||||
*
|
||||
* @param key
|
||||
* @return context
|
||||
*/
|
||||
public Object getParameter(String key);
|
||||
/**
|
||||
* get context by key
|
||||
*
|
||||
* @param key
|
||||
* @return context
|
||||
*/
|
||||
public Object getParameter(String key);
|
||||
|
||||
/**
|
||||
* set context
|
||||
*
|
||||
* @param key
|
||||
* key
|
||||
* @param value
|
||||
* value
|
||||
*/
|
||||
public void setParameter(String key, Object value);
|
||||
/**
|
||||
* set context
|
||||
*
|
||||
* @param key key
|
||||
* @param value value
|
||||
*/
|
||||
public void setParameter(String key, Object value);
|
||||
}
|
||||
|
@ -19,51 +19,45 @@ import com.alibaba.nacos.api.exception.NacosException;
|
||||
|
||||
/**
|
||||
* Config Filter Interface
|
||||
*
|
||||
* @author Nacos
|
||||
*
|
||||
* @author Nacos
|
||||
*/
|
||||
public interface IConfigFilter {
|
||||
/**
|
||||
* Init Fuction
|
||||
*
|
||||
* @param filterConfig
|
||||
* Filter Config
|
||||
*/
|
||||
void init(IFilterConfig filterConfig);
|
||||
/**
|
||||
* Init Fuction
|
||||
*
|
||||
* @param filterConfig Filter Config
|
||||
*/
|
||||
void init(IFilterConfig filterConfig);
|
||||
|
||||
/**
|
||||
* do filter
|
||||
*
|
||||
* @param request
|
||||
* request
|
||||
* @param response
|
||||
* response
|
||||
* @param filterChain
|
||||
* filter Chain
|
||||
* @throws NacosException
|
||||
* exception
|
||||
*/
|
||||
void doFilter(IConfigRequest request, IConfigResponse response, IConfigFilterChain filterChain)
|
||||
throws NacosException;
|
||||
/**
|
||||
* do filter
|
||||
*
|
||||
* @param request request
|
||||
* @param response response
|
||||
* @param filterChain filter Chain
|
||||
* @throws NacosException exception
|
||||
*/
|
||||
void doFilter(IConfigRequest request, IConfigResponse response, IConfigFilterChain filterChain)
|
||||
throws NacosException;
|
||||
|
||||
/**
|
||||
* deploy
|
||||
*/
|
||||
void deploy();
|
||||
/**
|
||||
* deploy
|
||||
*/
|
||||
void deploy();
|
||||
|
||||
/**
|
||||
* order
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
int getOrder();
|
||||
/**
|
||||
* order
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
int getOrder();
|
||||
|
||||
/**
|
||||
* filterName
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
String getFilterName();
|
||||
/**
|
||||
* filterName
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
String getFilterName();
|
||||
|
||||
}
|
||||
|
@ -19,21 +19,17 @@ import com.alibaba.nacos.api.exception.NacosException;
|
||||
|
||||
/**
|
||||
* Config Filter Chain Interface
|
||||
*
|
||||
* @author Nacos
|
||||
*
|
||||
* @author Nacos
|
||||
*/
|
||||
public interface IConfigFilterChain {
|
||||
/**
|
||||
* Filter aciton
|
||||
*
|
||||
* @param request
|
||||
* request
|
||||
* @param response
|
||||
* response
|
||||
* @throws NacosException
|
||||
* NacosException
|
||||
*/
|
||||
public void doFilter(IConfigRequest request, IConfigResponse response) throws NacosException;
|
||||
|
||||
/**
|
||||
* Filter aciton
|
||||
*
|
||||
* @param request request
|
||||
* @param response response
|
||||
* @throws NacosException NacosException
|
||||
*/
|
||||
public void doFilter(IConfigRequest request, IConfigResponse response) throws NacosException;
|
||||
|
||||
}
|
||||
|
@ -17,25 +17,23 @@ package com.alibaba.nacos.api.config.filter;
|
||||
|
||||
/**
|
||||
* Config Request Interface
|
||||
*
|
||||
* @author Nacos
|
||||
*
|
||||
* @author Nacos
|
||||
*/
|
||||
public interface IConfigRequest {
|
||||
/**
|
||||
* get param
|
||||
*
|
||||
* @param key
|
||||
* key
|
||||
* @return value
|
||||
*/
|
||||
public Object getParameter(String key);
|
||||
/**
|
||||
* get param
|
||||
*
|
||||
* @param key key
|
||||
* @return value
|
||||
*/
|
||||
public Object getParameter(String key);
|
||||
|
||||
/**
|
||||
* get config context
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
public IConfigContext getConfigContext();
|
||||
/**
|
||||
* get config context
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
public IConfigContext getConfigContext();
|
||||
|
||||
}
|
||||
|
@ -17,25 +17,23 @@ package com.alibaba.nacos.api.config.filter;
|
||||
|
||||
/**
|
||||
* Config Response Interface
|
||||
*
|
||||
* @author Nacos
|
||||
*
|
||||
* @author Nacos
|
||||
*/
|
||||
public interface IConfigResponse {
|
||||
/**
|
||||
* get param
|
||||
*
|
||||
* @param key
|
||||
* key
|
||||
* @return value
|
||||
*/
|
||||
public Object getParameter(String key);
|
||||
/**
|
||||
* get param
|
||||
*
|
||||
* @param key key
|
||||
* @return value
|
||||
*/
|
||||
public Object getParameter(String key);
|
||||
|
||||
/**
|
||||
* get context
|
||||
*
|
||||
* @return configContext
|
||||
*/
|
||||
public IConfigContext getConfigContext();
|
||||
/**
|
||||
* get context
|
||||
*
|
||||
* @return configContext
|
||||
*/
|
||||
public IConfigContext getConfigContext();
|
||||
|
||||
}
|
||||
|
@ -14,26 +14,27 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
package com.alibaba.nacos.api.config.filter;
|
||||
|
||||
/**
|
||||
* Filter Config Interface
|
||||
* @author Nacos
|
||||
*
|
||||
* @author Nacos
|
||||
*/
|
||||
public interface IFilterConfig {
|
||||
|
||||
/**
|
||||
* get filter name
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
public String getFilterName();
|
||||
/**
|
||||
* get filter name
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
public String getFilterName();
|
||||
|
||||
/**
|
||||
* get param
|
||||
*
|
||||
* @param name
|
||||
* @return param
|
||||
*/
|
||||
public Object getInitParameter(String name);
|
||||
/**
|
||||
* get param
|
||||
*
|
||||
* @param name
|
||||
* @return param
|
||||
*/
|
||||
public Object getInitParameter(String name);
|
||||
|
||||
}
|
||||
|
@ -19,16 +19,15 @@ import java.util.concurrent.Executor;
|
||||
|
||||
/**
|
||||
* Listner Adapter,use default notify thread
|
||||
*
|
||||
* @author water.lyl
|
||||
*
|
||||
* @author water.lyl
|
||||
*/
|
||||
@SuppressWarnings("PMD.AbstractClassShouldStartWithAbstractNamingRule")
|
||||
public abstract class AbstractListener implements Listener {
|
||||
|
||||
/**
|
||||
* use default Executor
|
||||
*/
|
||||
/**
|
||||
* use default Executor
|
||||
*/
|
||||
public Executor getExecutor() {
|
||||
return null;
|
||||
}
|
||||
|
@ -19,9 +19,8 @@ import java.util.concurrent.Executor;
|
||||
|
||||
/**
|
||||
* shared listener
|
||||
*
|
||||
* @author Nacos
|
||||
*
|
||||
* @author Nacos
|
||||
*/
|
||||
@SuppressWarnings("PMD.AbstractClassShouldStartWithAbstractNamingRule")
|
||||
public abstract class AbstractSharedListener implements Listener {
|
||||
@ -43,15 +42,12 @@ public abstract class AbstractSharedListener implements Listener {
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* receive
|
||||
*
|
||||
* @param dataId
|
||||
* data ID
|
||||
* @param group
|
||||
* group
|
||||
* @param configInfo
|
||||
* content
|
||||
*/
|
||||
/**
|
||||
* receive
|
||||
*
|
||||
* @param dataId data ID
|
||||
* @param group group
|
||||
* @param configInfo content
|
||||
*/
|
||||
public abstract void innerReceive(String dataId, String group, String configInfo);
|
||||
}
|
||||
|
@ -17,26 +17,23 @@ package com.alibaba.nacos.api.config.listener;
|
||||
|
||||
import java.util.concurrent.Executor;
|
||||
|
||||
|
||||
/**
|
||||
* Listener for watch config
|
||||
*
|
||||
*
|
||||
* @author Nacos
|
||||
*
|
||||
*/
|
||||
public interface Listener {
|
||||
|
||||
/**
|
||||
* Executor to excute this receive
|
||||
*
|
||||
* @return Executor
|
||||
*/
|
||||
/**
|
||||
* Executor to excute this receive
|
||||
*
|
||||
* @return Executor
|
||||
*/
|
||||
public Executor getExecutor();
|
||||
|
||||
|
||||
/**
|
||||
* 接收配置信息
|
||||
*
|
||||
*
|
||||
* @param configInfo 配置值
|
||||
*/
|
||||
public void receiveConfigInfo(final String configInfo);
|
||||
|
@ -17,94 +17,93 @@ package com.alibaba.nacos.api.exception;
|
||||
|
||||
/**
|
||||
* Nacos Exception
|
||||
*
|
||||
* @author Nacos
|
||||
*
|
||||
* @author Nacos
|
||||
*/
|
||||
public class NacosException extends Exception{
|
||||
public class NacosException extends Exception {
|
||||
|
||||
/**
|
||||
* serialVersionUID
|
||||
*/
|
||||
private static final long serialVersionUID = -3913902031489277776L;
|
||||
/**
|
||||
* serialVersionUID
|
||||
*/
|
||||
private static final long serialVersionUID = -3913902031489277776L;
|
||||
|
||||
private int errCode;
|
||||
private int errCode;
|
||||
|
||||
private String errMsg;
|
||||
|
||||
public NacosException() {
|
||||
};
|
||||
private String errMsg;
|
||||
|
||||
public NacosException(int errCode, String errMsg) {
|
||||
this.errCode = errCode;
|
||||
this.errMsg = errMsg;
|
||||
}
|
||||
|
||||
public int getErrCode() {
|
||||
return errCode;
|
||||
}
|
||||
public NacosException() {
|
||||
}
|
||||
|
||||
public String getErrMsg() {
|
||||
return errMsg;
|
||||
}
|
||||
;
|
||||
|
||||
public void setErrCode(int errCode) {
|
||||
this.errCode = errCode;
|
||||
}
|
||||
public NacosException(int errCode, String errMsg) {
|
||||
this.errCode = errCode;
|
||||
this.errMsg = errMsg;
|
||||
}
|
||||
|
||||
public void setErrMsg(String errMsg) {
|
||||
this.errMsg = errMsg;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "ErrCode:" + errCode + ",ErrMsg:" + errMsg;
|
||||
}
|
||||
public int getErrCode() {
|
||||
return errCode;
|
||||
}
|
||||
|
||||
/**
|
||||
* client error code
|
||||
* -400 -503 throw exception to user
|
||||
*/
|
||||
/**
|
||||
* invalid param(参数错误)
|
||||
*/
|
||||
public static final int CLIENT_INVALID_PARAM = -400;
|
||||
/**
|
||||
* over client threshold(超过server端的限流阈值)
|
||||
*/
|
||||
public static final int CLIENT_OVER_THRESHOLD = -503;
|
||||
public String getErrMsg() {
|
||||
return errMsg;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* server error code
|
||||
* 400 403 throw exception to user
|
||||
* 500 502 503 change ip and retry
|
||||
*/
|
||||
|
||||
/**
|
||||
* invalid param(参数错误)
|
||||
*/
|
||||
public static final int INVALID_PARAM = 400;
|
||||
/**
|
||||
* no right(鉴权失败)
|
||||
*/
|
||||
public static final int NO_RIGHT = 403;
|
||||
/**
|
||||
* conflict(写并发冲突)
|
||||
*/
|
||||
public static final int CONFLICT = 409;
|
||||
/**
|
||||
* server error(server异常,如超时)
|
||||
*/
|
||||
public static final int SERVER_ERROR = 500;
|
||||
/**
|
||||
* bad gateway(路由异常,如nginx后面的Server挂掉)
|
||||
*/
|
||||
public static final int BAD_GATEWAY = 502;
|
||||
/**
|
||||
* over threshold(超过server端的限流阈值)
|
||||
*/
|
||||
public static final int OVER_THRESHOLD = 503;
|
||||
|
||||
public void setErrCode(int errCode) {
|
||||
this.errCode = errCode;
|
||||
}
|
||||
|
||||
public void setErrMsg(String errMsg) {
|
||||
this.errMsg = errMsg;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "ErrCode:" + errCode + ",ErrMsg:" + errMsg;
|
||||
}
|
||||
|
||||
/**
|
||||
* client error code
|
||||
* -400 -503 throw exception to user
|
||||
*/
|
||||
/**
|
||||
* invalid param(参数错误)
|
||||
*/
|
||||
public static final int CLIENT_INVALID_PARAM = -400;
|
||||
/**
|
||||
* over client threshold(超过server端的限流阈值)
|
||||
*/
|
||||
public static final int CLIENT_OVER_THRESHOLD = -503;
|
||||
|
||||
/**
|
||||
* server error code
|
||||
* 400 403 throw exception to user
|
||||
* 500 502 503 change ip and retry
|
||||
*/
|
||||
|
||||
/**
|
||||
* invalid param(参数错误)
|
||||
*/
|
||||
public static final int INVALID_PARAM = 400;
|
||||
/**
|
||||
* no right(鉴权失败)
|
||||
*/
|
||||
public static final int NO_RIGHT = 403;
|
||||
/**
|
||||
* conflict(写并发冲突)
|
||||
*/
|
||||
public static final int CONFLICT = 409;
|
||||
/**
|
||||
* server error(server异常,如超时)
|
||||
*/
|
||||
public static final int SERVER_ERROR = 500;
|
||||
/**
|
||||
* bad gateway(路由异常,如nginx后面的Server挂掉)
|
||||
*/
|
||||
public static final int BAD_GATEWAY = 502;
|
||||
/**
|
||||
* over threshold(超过server端的限流阈值)
|
||||
*/
|
||||
public static final int OVER_THRESHOLD = 503;
|
||||
|
||||
}
|
||||
|
@ -21,29 +21,29 @@ import java.util.Properties;
|
||||
import com.alibaba.nacos.api.exception.NacosException;
|
||||
|
||||
/**
|
||||
* @author dungu.zpf
|
||||
* @author <a href="mailto:zpf.073@gmail.com">nkorange</a>
|
||||
*/
|
||||
public class NamingFactory {
|
||||
|
||||
public static NamingService createNamingService(String serverList) throws NacosException {
|
||||
try {
|
||||
Class<?> driverImplClass = Class.forName("com.alibaba.nacos.client.naming.NacosNamingService");
|
||||
Constructor constructor = driverImplClass.getConstructor(String.class);
|
||||
NamingService vendorImpl = (NamingService) constructor.newInstance(serverList);
|
||||
return vendorImpl;
|
||||
} catch (Throwable e) {
|
||||
throw new NacosException(-400, e.getMessage());
|
||||
}
|
||||
}
|
||||
public static NamingService createNamingService(String serverList) throws NacosException {
|
||||
try {
|
||||
Class<?> driverImplClass = Class.forName("com.alibaba.nacos.client.naming.NacosNamingService");
|
||||
Constructor constructor = driverImplClass.getConstructor(String.class);
|
||||
NamingService vendorImpl = (NamingService)constructor.newInstance(serverList);
|
||||
return vendorImpl;
|
||||
} catch (Throwable e) {
|
||||
throw new NacosException(-400, e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
public static NamingService createNamingService(Properties properties) throws NacosException {
|
||||
try {
|
||||
Class<?> driverImplClass = Class.forName("com.alibaba.nacos.client.naming.NacosNamingService");
|
||||
Constructor constructor = driverImplClass.getConstructor(Properties.class);
|
||||
NamingService vendorImpl = (NamingService) constructor.newInstance(properties);
|
||||
return vendorImpl;
|
||||
} catch (Throwable e) {
|
||||
throw new NacosException(-400, e.getMessage());
|
||||
}
|
||||
}
|
||||
public static NamingService createNamingService(Properties properties) throws NacosException {
|
||||
try {
|
||||
Class<?> driverImplClass = Class.forName("com.alibaba.nacos.client.naming.NacosNamingService");
|
||||
Constructor constructor = driverImplClass.getConstructor(Properties.class);
|
||||
NamingService vendorImpl = (NamingService)constructor.newInstance(properties);
|
||||
return vendorImpl;
|
||||
} catch (Throwable e) {
|
||||
throw new NacosException(-400, e.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -24,7 +24,7 @@ import com.alibaba.nacos.api.naming.pojo.ServiceInfo;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author dungu.zpf
|
||||
* @author <a href="mailto:zpf.073@gmail.com">nkorange</a>
|
||||
*/
|
||||
public interface NamingService {
|
||||
|
||||
|
@ -17,7 +17,7 @@ package com.alibaba.nacos.api.naming.listener;
|
||||
|
||||
/**
|
||||
* event interface
|
||||
* @author dungu.zpf
|
||||
* @author <a href="mailto:zpf.073@gmail.com">nkorange</a>
|
||||
*/
|
||||
public interface Event {
|
||||
}
|
||||
|
@ -16,14 +16,15 @@
|
||||
package com.alibaba.nacos.api.naming.listener;
|
||||
|
||||
/**
|
||||
* event listener
|
||||
* @author Nacos
|
||||
* event listener
|
||||
*
|
||||
* @author Nacos
|
||||
*/
|
||||
public interface EventListener {
|
||||
/**
|
||||
* callback event
|
||||
* @param event
|
||||
*/
|
||||
/**
|
||||
* callback event
|
||||
*
|
||||
* @param event
|
||||
*/
|
||||
void onEvent(Event event);
|
||||
}
|
||||
|
@ -20,7 +20,7 @@ import java.util.List;
|
||||
import com.alibaba.nacos.api.naming.pojo.Instance;
|
||||
|
||||
/**
|
||||
* @author dungu.zpf
|
||||
* @author <a href="mailto:zpf.073@gmail.com">nkorange</a>
|
||||
*/
|
||||
public class NamingEvent implements Event {
|
||||
|
||||
|
@ -25,7 +25,7 @@ import java.util.Map;
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
* @author dungu.zpf
|
||||
* @author <a href="mailto:zpf.073@gmail.com">nkorange</a>
|
||||
*/
|
||||
public abstract class AbstractHealthChecker implements Cloneable {
|
||||
|
||||
@ -113,7 +113,7 @@ public abstract class AbstractHealthChecker implements Cloneable {
|
||||
return false;
|
||||
}
|
||||
|
||||
Http other = (Http) obj;
|
||||
Http other = (Http)obj;
|
||||
|
||||
if (!strEquals(type, other.getType())) {
|
||||
return false;
|
||||
@ -212,7 +212,7 @@ public abstract class AbstractHealthChecker implements Cloneable {
|
||||
return false;
|
||||
}
|
||||
|
||||
Mysql other = (Mysql) obj;
|
||||
Mysql other = (Mysql)obj;
|
||||
|
||||
if (!strEquals(user, other.getUser())) {
|
||||
return false;
|
||||
|
@ -21,7 +21,7 @@ import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* @author dungu.zpf
|
||||
* @author <a href="mailto:zpf.073@gmail.com">nkorange</a>
|
||||
*/
|
||||
public class Cluster {
|
||||
|
||||
@ -55,7 +55,6 @@ public class Cluster {
|
||||
*/
|
||||
private boolean useIPPort4Check = true;
|
||||
|
||||
|
||||
private Map<String, String> metadata = new HashMap<String, String>();
|
||||
|
||||
public Cluster() {
|
||||
|
@ -22,7 +22,7 @@ import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* @author dungu.zpf
|
||||
* @author <a href="mailto:zpf.073@gmail.com">nkorange</a>
|
||||
*/
|
||||
public class Instance {
|
||||
|
||||
@ -160,7 +160,7 @@ public class Instance {
|
||||
return false;
|
||||
}
|
||||
|
||||
Instance host = (Instance) obj;
|
||||
Instance host = (Instance)obj;
|
||||
|
||||
return strEquals(toString(), host.toString());
|
||||
}
|
||||
|
@ -20,7 +20,7 @@ import com.alibaba.fastjson.JSON;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author dungu.zpf
|
||||
* @author <a href="mailto:zpf.073@gmail.com">nkorange</a>
|
||||
*/
|
||||
public class ListView<T> {
|
||||
|
||||
|
@ -19,7 +19,7 @@ import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* @author dungu.zpf
|
||||
* @author <a href="mailto:zpf.073@gmail.com">nkorange</a>
|
||||
*/
|
||||
public class Service {
|
||||
|
||||
|
@ -22,7 +22,7 @@ import java.util.Collection;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author dungu.zpf
|
||||
* @author <a href="mailto:zpf.073@gmail.com">nkorange</a>
|
||||
*/
|
||||
public class ServiceInfo {
|
||||
|
||||
@ -205,7 +205,7 @@ public class ServiceInfo {
|
||||
|
||||
if (!isEmpty(clusters) && !isEmpty(unit)) {
|
||||
return isAllIPs ? name + SPLITER + clusters + SPLITER + unit + SPLITER + ALL_IPS
|
||||
: name + SPLITER + clusters + SPLITER + unit;
|
||||
: name + SPLITER + clusters + SPLITER + unit;
|
||||
}
|
||||
|
||||
if (!isEmpty(clusters)) {
|
||||
@ -214,7 +214,7 @@ public class ServiceInfo {
|
||||
|
||||
if (!isEmpty(unit)) {
|
||||
return isAllIPs ? name + SPLITER + EMPTY + SPLITER + unit + SPLITER + ALL_IPS :
|
||||
name + SPLITER + EMPTY + SPLITER + unit;
|
||||
name + SPLITER + EMPTY + SPLITER + unit;
|
||||
}
|
||||
|
||||
return isAllIPs ? name + SPLITER + ALL_IPS : name;
|
||||
|
@ -44,233 +44,233 @@ import java.util.Properties;
|
||||
|
||||
/**
|
||||
* Config Impl
|
||||
* @author Nacos
|
||||
*
|
||||
* @author Nacos
|
||||
*/
|
||||
@SuppressWarnings("PMD.ServiceOrDaoClassShouldEndWithImplRule")
|
||||
public class NacosConfigService implements ConfigService {
|
||||
|
||||
final static public Logger log = LogUtils.logger(NacosConfigService.class);
|
||||
public final long POST_TIMEOUT = 3000L;
|
||||
/**
|
||||
* http agent
|
||||
*/
|
||||
private ServerHttpAgent agent;
|
||||
/**
|
||||
* longpulling
|
||||
*/
|
||||
private ClientWorker worker;
|
||||
private String namespace;
|
||||
private String encode;
|
||||
private ConfigFilterChainManager configFilterChainManager = new ConfigFilterChainManager();
|
||||
final static public Logger log = LogUtils.logger(NacosConfigService.class);
|
||||
public final long POST_TIMEOUT = 3000L;
|
||||
/**
|
||||
* http agent
|
||||
*/
|
||||
private ServerHttpAgent agent;
|
||||
/**
|
||||
* longpulling
|
||||
*/
|
||||
private ClientWorker worker;
|
||||
private String namespace;
|
||||
private String encode;
|
||||
private ConfigFilterChainManager configFilterChainManager = new ConfigFilterChainManager();
|
||||
|
||||
public NacosConfigService(Properties properties) throws NacosException {
|
||||
String encodeTmp = properties.getProperty(PropertyKeyConst.ENCODE);
|
||||
if (StringUtils.isBlank(encodeTmp)) {
|
||||
encode = Constants.ENCODE;
|
||||
} else {
|
||||
encode = encodeTmp.trim();
|
||||
}
|
||||
String namespaceTmp = properties.getProperty(PropertyKeyConst.NAMESPACE);
|
||||
if (StringUtils.isBlank(namespaceTmp)) {
|
||||
namespace = TenantUtil.getUserTenant();
|
||||
properties.put(PropertyKeyConst.NAMESPACE, namespace);
|
||||
} else {
|
||||
namespace = namespaceTmp;
|
||||
properties.put(PropertyKeyConst.NAMESPACE, namespace);
|
||||
}
|
||||
agent = new ServerHttpAgent(properties);
|
||||
agent.start();
|
||||
worker = new ClientWorker(agent, configFilterChainManager);
|
||||
}
|
||||
public NacosConfigService(Properties properties) throws NacosException {
|
||||
String encodeTmp = properties.getProperty(PropertyKeyConst.ENCODE);
|
||||
if (StringUtils.isBlank(encodeTmp)) {
|
||||
encode = Constants.ENCODE;
|
||||
} else {
|
||||
encode = encodeTmp.trim();
|
||||
}
|
||||
String namespaceTmp = properties.getProperty(PropertyKeyConst.NAMESPACE);
|
||||
if (StringUtils.isBlank(namespaceTmp)) {
|
||||
namespace = TenantUtil.getUserTenant();
|
||||
properties.put(PropertyKeyConst.NAMESPACE, namespace);
|
||||
} else {
|
||||
namespace = namespaceTmp;
|
||||
properties.put(PropertyKeyConst.NAMESPACE, namespace);
|
||||
}
|
||||
agent = new ServerHttpAgent(properties);
|
||||
agent.start();
|
||||
worker = new ClientWorker(agent, configFilterChainManager);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getConfig(String dataId, String group, long timeoutMs) throws NacosException {
|
||||
return getConfigInner(namespace, dataId, group, timeoutMs);
|
||||
}
|
||||
@Override
|
||||
public String getConfig(String dataId, String group, long timeoutMs) throws NacosException {
|
||||
return getConfigInner(namespace, dataId, group, timeoutMs);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addListener(String dataId, String group, Listener listener) throws NacosException {
|
||||
worker.addTenantListeners(dataId, group, Arrays.asList(listener));
|
||||
}
|
||||
@Override
|
||||
public void addListener(String dataId, String group, Listener listener) throws NacosException {
|
||||
worker.addTenantListeners(dataId, group, Arrays.asList(listener));
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean publishConfig(String dataId, String group, String content) throws NacosException {
|
||||
return publishConfigInner(namespace, dataId, group, null, null, null, content);
|
||||
}
|
||||
@Override
|
||||
public boolean publishConfig(String dataId, String group, String content) throws NacosException {
|
||||
return publishConfigInner(namespace, dataId, group, null, null, null, content);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean removeConfig(String dataId, String group) throws NacosException {
|
||||
return removeConfigInner(namespace, dataId, group, null);
|
||||
}
|
||||
@Override
|
||||
public boolean removeConfig(String dataId, String group) throws NacosException {
|
||||
return removeConfigInner(namespace, dataId, group, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removeListener(String dataId, String group, Listener listener) {
|
||||
worker.removeTenantListener(dataId, group, listener);
|
||||
}
|
||||
@Override
|
||||
public void removeListener(String dataId, String group, Listener listener) {
|
||||
worker.removeTenantListener(dataId, group, listener);
|
||||
}
|
||||
|
||||
private String getConfigInner(String tenant, String dataId, String group, long timeoutMs) throws NacosException {
|
||||
group = null2defaultGroup(group);
|
||||
ParamUtils.checkKeyParam(dataId, group);
|
||||
ConfigResponse cr = new ConfigResponse();
|
||||
private String getConfigInner(String tenant, String dataId, String group, long timeoutMs) throws NacosException {
|
||||
group = null2defaultGroup(group);
|
||||
ParamUtils.checkKeyParam(dataId, group);
|
||||
ConfigResponse cr = new ConfigResponse();
|
||||
|
||||
cr.setDataId(dataId);
|
||||
cr.setTenant(tenant);
|
||||
cr.setGroup(group);
|
||||
cr.setDataId(dataId);
|
||||
cr.setTenant(tenant);
|
||||
cr.setGroup(group);
|
||||
|
||||
// 优先使用本地配置
|
||||
String content = LocalConfigInfoProcessor.getFailover(agent.getName(), dataId, group, tenant);
|
||||
if (content != null) {
|
||||
log.warn(agent.getName(), "[get-config] get failover ok, dataId={}, group={}, tenant={}, config={}", dataId,
|
||||
group, tenant, ContentUtils.truncateContent(content));
|
||||
cr.setContent(content);
|
||||
configFilterChainManager.doFilter(null, cr);
|
||||
content = cr.getContent();
|
||||
return content;
|
||||
}
|
||||
// 优先使用本地配置
|
||||
String content = LocalConfigInfoProcessor.getFailover(agent.getName(), dataId, group, tenant);
|
||||
if (content != null) {
|
||||
log.warn(agent.getName(), "[get-config] get failover ok, dataId={}, group={}, tenant={}, config={}", dataId,
|
||||
group, tenant, ContentUtils.truncateContent(content));
|
||||
cr.setContent(content);
|
||||
configFilterChainManager.doFilter(null, cr);
|
||||
content = cr.getContent();
|
||||
return content;
|
||||
}
|
||||
|
||||
try {
|
||||
content = worker.getServerConfig(dataId, group, tenant, timeoutMs);
|
||||
cr.setContent(content);
|
||||
configFilterChainManager.doFilter(null, cr);
|
||||
content = cr.getContent();
|
||||
return content;
|
||||
} catch (NacosException ioe) {
|
||||
if (NacosException.NO_RIGHT == ioe.getErrCode()) {
|
||||
throw ioe;
|
||||
}
|
||||
log.warn("NACOS-0003",
|
||||
LoggerHelper.getErrorCodeStr("NACOS", "NACOS-0003", "环境问题", "get from server error"));
|
||||
log.warn(agent.getName(), "[get-config] get from server error, dataId={}, group={}, tenant={}, msg={}",
|
||||
dataId, group, tenant, ioe.toString());
|
||||
}
|
||||
try {
|
||||
content = worker.getServerConfig(dataId, group, tenant, timeoutMs);
|
||||
cr.setContent(content);
|
||||
configFilterChainManager.doFilter(null, cr);
|
||||
content = cr.getContent();
|
||||
return content;
|
||||
} catch (NacosException ioe) {
|
||||
if (NacosException.NO_RIGHT == ioe.getErrCode()) {
|
||||
throw ioe;
|
||||
}
|
||||
log.warn("NACOS-0003",
|
||||
LoggerHelper.getErrorCodeStr("NACOS", "NACOS-0003", "环境问题", "get from server error"));
|
||||
log.warn(agent.getName(), "[get-config] get from server error, dataId={}, group={}, tenant={}, msg={}",
|
||||
dataId, group, tenant, ioe.toString());
|
||||
}
|
||||
|
||||
log.warn(agent.getName(), "[get-config] get snapshot ok, dataId={}, group={}, tenant={}, config={}", dataId,
|
||||
group, tenant, ContentUtils.truncateContent(content));
|
||||
content = LocalConfigInfoProcessor.getSnapshot(agent.getName(), dataId, group, tenant);
|
||||
cr.setContent(content);
|
||||
configFilterChainManager.doFilter(null, cr);
|
||||
content = cr.getContent();
|
||||
return content;
|
||||
}
|
||||
log.warn(agent.getName(), "[get-config] get snapshot ok, dataId={}, group={}, tenant={}, config={}", dataId,
|
||||
group, tenant, ContentUtils.truncateContent(content));
|
||||
content = LocalConfigInfoProcessor.getSnapshot(agent.getName(), dataId, group, tenant);
|
||||
cr.setContent(content);
|
||||
configFilterChainManager.doFilter(null, cr);
|
||||
content = cr.getContent();
|
||||
return content;
|
||||
}
|
||||
|
||||
private String null2defaultGroup(String group) {
|
||||
return (null == group) ? Constants.DEFAULT_GROUP : group.trim();
|
||||
}
|
||||
private String null2defaultGroup(String group) {
|
||||
return (null == group) ? Constants.DEFAULT_GROUP : group.trim();
|
||||
}
|
||||
|
||||
private boolean removeConfigInner(String tenant, String dataId, String group, String tag) throws NacosException {
|
||||
group = null2defaultGroup(group);
|
||||
ParamUtils.checkKeyParam(dataId, group);
|
||||
String url = Constants.CONFIG_CONTROLLER_PATH;
|
||||
List<String> params = new ArrayList<String>();
|
||||
params.add("dataId");
|
||||
params.add(dataId);
|
||||
params.add("group");
|
||||
params.add(group);
|
||||
if (StringUtils.isNotEmpty(tenant)) {
|
||||
params.add("tenant");
|
||||
params.add(tenant);
|
||||
}
|
||||
if (StringUtils.isNotEmpty(tag)) {
|
||||
params.add("tag");
|
||||
params.add(tag);
|
||||
}
|
||||
HttpResult result = null;
|
||||
try {
|
||||
result = agent.httpDelete(url, null, params, encode, POST_TIMEOUT);
|
||||
} catch (IOException ioe) {
|
||||
log.warn("[remove] error, " + dataId + ", " + group + ", " + tenant + ", msg: " + ioe.toString());
|
||||
return false;
|
||||
}
|
||||
private boolean removeConfigInner(String tenant, String dataId, String group, String tag) throws NacosException {
|
||||
group = null2defaultGroup(group);
|
||||
ParamUtils.checkKeyParam(dataId, group);
|
||||
String url = Constants.CONFIG_CONTROLLER_PATH;
|
||||
List<String> params = new ArrayList<String>();
|
||||
params.add("dataId");
|
||||
params.add(dataId);
|
||||
params.add("group");
|
||||
params.add(group);
|
||||
if (StringUtils.isNotEmpty(tenant)) {
|
||||
params.add("tenant");
|
||||
params.add(tenant);
|
||||
}
|
||||
if (StringUtils.isNotEmpty(tag)) {
|
||||
params.add("tag");
|
||||
params.add(tag);
|
||||
}
|
||||
HttpResult result = null;
|
||||
try {
|
||||
result = agent.httpDelete(url, null, params, encode, POST_TIMEOUT);
|
||||
} catch (IOException ioe) {
|
||||
log.warn("[remove] error, " + dataId + ", " + group + ", " + tenant + ", msg: " + ioe.toString());
|
||||
return false;
|
||||
}
|
||||
|
||||
if (HttpURLConnection.HTTP_OK == result.code) {
|
||||
log.info(agent.getName(), "[remove] ok, dataId={}, group={}, tenant={}", dataId, group, tenant);
|
||||
return true;
|
||||
} else if (HttpURLConnection.HTTP_FORBIDDEN == result.code) {
|
||||
log.warn(agent.getName(), "[remove] error, dataId={}, group={}, tenant={}, code={}, msg={}", dataId, group,
|
||||
tenant, result.code, result.content);
|
||||
throw new NacosException(result.code, result.content);
|
||||
} else {
|
||||
log.warn(agent.getName(), "[remove] error, dataId={}, group={}, tenant={}, code={}, msg={}", dataId, group,
|
||||
tenant, result.code, result.content);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if (HttpURLConnection.HTTP_OK == result.code) {
|
||||
log.info(agent.getName(), "[remove] ok, dataId={}, group={}, tenant={}", dataId, group, tenant);
|
||||
return true;
|
||||
} else if (HttpURLConnection.HTTP_FORBIDDEN == result.code) {
|
||||
log.warn(agent.getName(), "[remove] error, dataId={}, group={}, tenant={}, code={}, msg={}", dataId, group,
|
||||
tenant, result.code, result.content);
|
||||
throw new NacosException(result.code, result.content);
|
||||
} else {
|
||||
log.warn(agent.getName(), "[remove] error, dataId={}, group={}, tenant={}, code={}, msg={}", dataId, group,
|
||||
tenant, result.code, result.content);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
private boolean publishConfigInner(String tenant, String dataId, String group, String tag, String appName,
|
||||
String betaIps, String content) throws NacosException {
|
||||
group = null2defaultGroup(group);
|
||||
ParamUtils.checkParam(dataId, group, content);
|
||||
private boolean publishConfigInner(String tenant, String dataId, String group, String tag, String appName,
|
||||
String betaIps, String content) throws NacosException {
|
||||
group = null2defaultGroup(group);
|
||||
ParamUtils.checkParam(dataId, group, content);
|
||||
|
||||
ConfigRequest cr = new ConfigRequest();
|
||||
cr.setDataId(dataId);
|
||||
cr.setTenant(tenant);
|
||||
cr.setGroup(group);
|
||||
cr.setContent(content);
|
||||
configFilterChainManager.doFilter(cr, null);
|
||||
content = cr.getContent();
|
||||
ConfigRequest cr = new ConfigRequest();
|
||||
cr.setDataId(dataId);
|
||||
cr.setTenant(tenant);
|
||||
cr.setGroup(group);
|
||||
cr.setContent(content);
|
||||
configFilterChainManager.doFilter(cr, null);
|
||||
content = cr.getContent();
|
||||
|
||||
String url = Constants.CONFIG_CONTROLLER_PATH;
|
||||
List<String> params = new ArrayList<String>();
|
||||
params.add("dataId");
|
||||
params.add(dataId);
|
||||
params.add("group");
|
||||
params.add(group);
|
||||
params.add("content");
|
||||
params.add(content);
|
||||
if (StringUtils.isNotEmpty(tenant)) {
|
||||
params.add("tenant");
|
||||
params.add(tenant);
|
||||
}
|
||||
if (StringUtils.isNotEmpty(appName)) {
|
||||
params.add("appName");
|
||||
params.add(appName);
|
||||
}
|
||||
if (StringUtils.isNotEmpty(tag)) {
|
||||
params.add("tag");
|
||||
params.add(tag);
|
||||
}
|
||||
String url = Constants.CONFIG_CONTROLLER_PATH;
|
||||
List<String> params = new ArrayList<String>();
|
||||
params.add("dataId");
|
||||
params.add(dataId);
|
||||
params.add("group");
|
||||
params.add(group);
|
||||
params.add("content");
|
||||
params.add(content);
|
||||
if (StringUtils.isNotEmpty(tenant)) {
|
||||
params.add("tenant");
|
||||
params.add(tenant);
|
||||
}
|
||||
if (StringUtils.isNotEmpty(appName)) {
|
||||
params.add("appName");
|
||||
params.add(appName);
|
||||
}
|
||||
if (StringUtils.isNotEmpty(tag)) {
|
||||
params.add("tag");
|
||||
params.add(tag);
|
||||
}
|
||||
|
||||
List<String> headers = new ArrayList<String>();
|
||||
if (StringUtils.isNotEmpty(betaIps)) {
|
||||
headers.add("betaIps");
|
||||
headers.add(betaIps);
|
||||
}
|
||||
List<String> headers = new ArrayList<String>();
|
||||
if (StringUtils.isNotEmpty(betaIps)) {
|
||||
headers.add("betaIps");
|
||||
headers.add(betaIps);
|
||||
}
|
||||
|
||||
HttpResult result = null;
|
||||
try {
|
||||
result = agent.httpPost(url, headers, params, encode, POST_TIMEOUT);
|
||||
} catch (IOException ioe) {
|
||||
log.warn("NACOS-0006",
|
||||
LoggerHelper.getErrorCodeStr("NACOS", "NACOS-0006", "环境问题", "[publish-single] exception"));
|
||||
log.warn(agent.getName(), "[publish-single] exception, dataId={}, group={}, msg={}", dataId, group,
|
||||
ioe.toString());
|
||||
return false;
|
||||
}
|
||||
HttpResult result = null;
|
||||
try {
|
||||
result = agent.httpPost(url, headers, params, encode, POST_TIMEOUT);
|
||||
} catch (IOException ioe) {
|
||||
log.warn("NACOS-0006",
|
||||
LoggerHelper.getErrorCodeStr("NACOS", "NACOS-0006", "环境问题", "[publish-single] exception"));
|
||||
log.warn(agent.getName(), "[publish-single] exception, dataId={}, group={}, msg={}", dataId, group,
|
||||
ioe.toString());
|
||||
return false;
|
||||
}
|
||||
|
||||
if (HttpURLConnection.HTTP_OK == result.code) {
|
||||
log.info(agent.getName(), "[publish-single] ok, dataId={}, group={}, tenant={}, config={}", dataId, group,
|
||||
tenant, ContentUtils.truncateContent(content));
|
||||
return true;
|
||||
} else if (HttpURLConnection.HTTP_FORBIDDEN == result.code) {
|
||||
log.warn(agent.getName(), "[publish-single] error, dataId={}, group={}, tenant={}, code={}, msg={}", dataId,
|
||||
group, tenant, result.code, result.content);
|
||||
throw new NacosException(result.code, result.content);
|
||||
} else {
|
||||
log.warn(agent.getName(), "[publish-single] error, dataId={}, group={}, tenant={}, code={}, msg={}", dataId,
|
||||
group, tenant, result.code, result.content);
|
||||
return false;
|
||||
}
|
||||
if (HttpURLConnection.HTTP_OK == result.code) {
|
||||
log.info(agent.getName(), "[publish-single] ok, dataId={}, group={}, tenant={}, config={}", dataId, group,
|
||||
tenant, ContentUtils.truncateContent(content));
|
||||
return true;
|
||||
} else if (HttpURLConnection.HTTP_FORBIDDEN == result.code) {
|
||||
log.warn(agent.getName(), "[publish-single] error, dataId={}, group={}, tenant={}, code={}, msg={}", dataId,
|
||||
group, tenant, result.code, result.content);
|
||||
throw new NacosException(result.code, result.content);
|
||||
} else {
|
||||
log.warn(agent.getName(), "[publish-single] error, dataId={}, group={}, tenant={}, code={}, msg={}", dataId,
|
||||
group, tenant, result.code, result.content);
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getServerStatus() {
|
||||
if (worker.isHealthServer()) {
|
||||
return "UP";
|
||||
} else {
|
||||
return "DOWN";
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public String getServerStatus() {
|
||||
if (worker.isHealthServer()) {
|
||||
return "UP";
|
||||
} else {
|
||||
return "DOWN";
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -18,9 +18,8 @@ package com.alibaba.nacos.client.config.common;
|
||||
import com.alibaba.nacos.client.utils.StringUtils;
|
||||
|
||||
/**
|
||||
* Synthesize the form of dataId+groupId. Escapes reserved characters in dataId
|
||||
* and groupId.
|
||||
*
|
||||
* Synthesize the form of dataId+groupId. Escapes reserved characters in dataId and groupId.
|
||||
*
|
||||
* @author Nacos
|
||||
*/
|
||||
public class GroupKey {
|
||||
@ -33,28 +32,28 @@ public class GroupKey {
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
static public String getKeyTenant(String dataId, String group, String tenant) {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
urlEncode(dataId, sb);
|
||||
sb.append('+');
|
||||
urlEncode(group, sb);
|
||||
if (StringUtils.isNotEmpty(tenant)) {
|
||||
sb.append('+');
|
||||
urlEncode(tenant, sb);
|
||||
}
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
static public String getKey(String dataId, String group, String datumStr) {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
urlEncode(dataId, sb);
|
||||
sb.append('+');
|
||||
urlEncode(group, sb);
|
||||
sb.append('+');
|
||||
urlEncode(datumStr, sb);
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
static public String getKeyTenant(String dataId, String group, String tenant) {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
urlEncode(dataId, sb);
|
||||
sb.append('+');
|
||||
urlEncode(group, sb);
|
||||
if (StringUtils.isNotEmpty(tenant)) {
|
||||
sb.append('+');
|
||||
urlEncode(tenant, sb);
|
||||
}
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
static public String getKey(String dataId, String group, String datumStr) {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
urlEncode(dataId, sb);
|
||||
sb.append('+');
|
||||
urlEncode(group, sb);
|
||||
sb.append('+');
|
||||
urlEncode(datumStr, sb);
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
static public String[] parseKey(String groupKey) {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
String dataId = null;
|
||||
@ -64,15 +63,15 @@ public class GroupKey {
|
||||
for (int i = 0; i < groupKey.length(); ++i) {
|
||||
char c = groupKey.charAt(i);
|
||||
if ('+' == c) {
|
||||
if (null == dataId) {
|
||||
dataId = sb.toString();
|
||||
sb.setLength(0);
|
||||
} else if (null == group) {
|
||||
group = sb.toString();
|
||||
sb.setLength(0);
|
||||
} else {
|
||||
throw new IllegalArgumentException("invalid groupkey:" + groupKey);
|
||||
}
|
||||
if (null == dataId) {
|
||||
dataId = sb.toString();
|
||||
sb.setLength(0);
|
||||
} else if (null == group) {
|
||||
group = sb.toString();
|
||||
sb.setLength(0);
|
||||
} else {
|
||||
throw new IllegalArgumentException("invalid groupkey:" + groupKey);
|
||||
}
|
||||
} else if ('%' == c) {
|
||||
char next = groupKey.charAt(++i);
|
||||
char nextnext = groupKey.charAt(++i);
|
||||
@ -87,25 +86,24 @@ public class GroupKey {
|
||||
sb.append(c);
|
||||
}
|
||||
}
|
||||
|
||||
if (StringUtils.isBlank(group)) {
|
||||
group = sb.toString();
|
||||
if (group.length() == 0) {
|
||||
throw new IllegalArgumentException("invalid groupkey:" + groupKey);
|
||||
}
|
||||
} else {
|
||||
tenant = sb.toString();
|
||||
if (group.length() == 0) {
|
||||
throw new IllegalArgumentException("invalid groupkey:" + groupKey);
|
||||
}
|
||||
}
|
||||
|
||||
return new String[] { dataId, group, tenant };
|
||||
|
||||
if (StringUtils.isBlank(group)) {
|
||||
group = sb.toString();
|
||||
if (group.length() == 0) {
|
||||
throw new IllegalArgumentException("invalid groupkey:" + groupKey);
|
||||
}
|
||||
} else {
|
||||
tenant = sb.toString();
|
||||
if (group.length() == 0) {
|
||||
throw new IllegalArgumentException("invalid groupkey:" + groupKey);
|
||||
}
|
||||
}
|
||||
|
||||
return new String[] {dataId, group, tenant};
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* + -> %2B
|
||||
* % -> %25
|
||||
* + -> %2B % -> %25
|
||||
*/
|
||||
static void urlEncode(String str, StringBuilder sb) {
|
||||
for (int idx = 0; idx < str.length(); ++idx) {
|
||||
|
@ -22,22 +22,21 @@ import com.alibaba.nacos.api.config.filter.IConfigContext;
|
||||
|
||||
/**
|
||||
* Config Context
|
||||
*
|
||||
* @author Nacos
|
||||
*
|
||||
* @author Nacos
|
||||
*/
|
||||
public class ConfigContext implements IConfigContext {
|
||||
|
||||
private Map<String, Object> param = new HashMap<String, Object>();
|
||||
private Map<String, Object> param = new HashMap<String, Object>();
|
||||
|
||||
@Override
|
||||
public Object getParameter(String key) {
|
||||
return param.get(key);
|
||||
}
|
||||
@Override
|
||||
public Object getParameter(String key) {
|
||||
return param.get(key);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setParameter(String key, Object value) {
|
||||
param.put(key, value);
|
||||
}
|
||||
@Override
|
||||
public void setParameter(String key, Object value) {
|
||||
param.put(key, value);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -26,62 +26,60 @@ import com.google.common.collect.Lists;
|
||||
|
||||
/**
|
||||
* Config Filter Chain Management
|
||||
*
|
||||
* @author Nacos
|
||||
*
|
||||
* @author Nacos
|
||||
*/
|
||||
public class ConfigFilterChainManager implements IConfigFilterChain {
|
||||
|
||||
private List<IConfigFilter> filters = Lists.newArrayList();
|
||||
private List<IConfigFilter> filters = Lists.newArrayList();
|
||||
|
||||
public synchronized ConfigFilterChainManager addFilter(IConfigFilter filter) {
|
||||
// 根据order大小顺序插入
|
||||
int i = 0;
|
||||
while (i < this.filters.size()) {
|
||||
IConfigFilter currentValue = this.filters.get(i);
|
||||
if (currentValue.getFilterName().equals(filter.getFilterName())) {
|
||||
break;
|
||||
}
|
||||
if (filter.getOrder() >= currentValue.getOrder() && i < this.filters.size()) {
|
||||
i++;
|
||||
} else {
|
||||
this.filters.add(i, filter);
|
||||
break;
|
||||
}
|
||||
}
|
||||
public synchronized ConfigFilterChainManager addFilter(IConfigFilter filter) {
|
||||
// 根据order大小顺序插入
|
||||
int i = 0;
|
||||
while (i < this.filters.size()) {
|
||||
IConfigFilter currentValue = this.filters.get(i);
|
||||
if (currentValue.getFilterName().equals(filter.getFilterName())) {
|
||||
break;
|
||||
}
|
||||
if (filter.getOrder() >= currentValue.getOrder() && i < this.filters.size()) {
|
||||
i++;
|
||||
} else {
|
||||
this.filters.add(i, filter);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (i == this.filters.size()) {
|
||||
this.filters.add(i, filter);
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
if (i == this.filters.size()) {
|
||||
this.filters.add(i, filter);
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void doFilter(IConfigRequest request, IConfigResponse response) throws NacosException {
|
||||
new VirtualFilterChain(this.filters).doFilter(request, response);
|
||||
}
|
||||
@Override
|
||||
public void doFilter(IConfigRequest request, IConfigResponse response) throws NacosException {
|
||||
new VirtualFilterChain(this.filters).doFilter(request, response);
|
||||
}
|
||||
|
||||
private static class VirtualFilterChain implements IConfigFilterChain {
|
||||
private static class VirtualFilterChain implements IConfigFilterChain {
|
||||
|
||||
private final List<? extends IConfigFilter> additionalFilters;
|
||||
private final List<? extends IConfigFilter> additionalFilters;
|
||||
|
||||
private int currentPosition = 0;
|
||||
private int currentPosition = 0;
|
||||
|
||||
public VirtualFilterChain(List<? extends IConfigFilter> additionalFilters) {
|
||||
this.additionalFilters = additionalFilters;
|
||||
}
|
||||
public VirtualFilterChain(List<? extends IConfigFilter> additionalFilters) {
|
||||
this.additionalFilters = additionalFilters;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void doFilter(final IConfigRequest request, final IConfigResponse response) throws NacosException {
|
||||
if (this.currentPosition == this.additionalFilters.size()) {
|
||||
return;
|
||||
} else {
|
||||
this.currentPosition++;
|
||||
IConfigFilter nextFilter = this.additionalFilters.get(this.currentPosition - 1);
|
||||
nextFilter.doFilter(request, response, this);
|
||||
}
|
||||
}
|
||||
}
|
||||
@Override
|
||||
public void doFilter(final IConfigRequest request, final IConfigResponse response) throws NacosException {
|
||||
if (this.currentPosition == this.additionalFilters.size()) {
|
||||
return;
|
||||
} else {
|
||||
this.currentPosition++;
|
||||
IConfigFilter nextFilter = this.additionalFilters.get(this.currentPosition - 1);
|
||||
nextFilter.doFilter(request, response, this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -23,56 +23,55 @@ import com.alibaba.nacos.api.config.filter.IConfigRequest;
|
||||
|
||||
/**
|
||||
* Config Request
|
||||
*
|
||||
* @author Nacos
|
||||
*
|
||||
* @author Nacos
|
||||
*/
|
||||
public class ConfigRequest implements IConfigRequest {
|
||||
|
||||
private Map<String, Object> param = new HashMap<String, Object>();
|
||||
private Map<String, Object> param = new HashMap<String, Object>();
|
||||
|
||||
private IConfigContext configContext = new ConfigContext();
|
||||
private IConfigContext configContext = new ConfigContext();
|
||||
|
||||
public String getTenant() {
|
||||
return (String) param.get("tenant");
|
||||
}
|
||||
public String getTenant() {
|
||||
return (String)param.get("tenant");
|
||||
}
|
||||
|
||||
public void setTenant(String tenant) {
|
||||
param.put("tenant", tenant);
|
||||
}
|
||||
public void setTenant(String tenant) {
|
||||
param.put("tenant", tenant);
|
||||
}
|
||||
|
||||
public String getDataId() {
|
||||
return (String) param.get("dataId");
|
||||
}
|
||||
public String getDataId() {
|
||||
return (String)param.get("dataId");
|
||||
}
|
||||
|
||||
public void setDataId(String dataId) {
|
||||
param.put("dataId", dataId);
|
||||
}
|
||||
public void setDataId(String dataId) {
|
||||
param.put("dataId", dataId);
|
||||
}
|
||||
|
||||
public String getGroup() {
|
||||
return (String) param.get("group");
|
||||
}
|
||||
public String getGroup() {
|
||||
return (String)param.get("group");
|
||||
}
|
||||
|
||||
public void setGroup(String group) {
|
||||
param.put("group", group);
|
||||
}
|
||||
public void setGroup(String group) {
|
||||
param.put("group", group);
|
||||
}
|
||||
|
||||
public String getContent() {
|
||||
return (String) param.get("content");
|
||||
}
|
||||
public String getContent() {
|
||||
return (String)param.get("content");
|
||||
}
|
||||
|
||||
public void setContent(String content) {
|
||||
param.put("content", content);
|
||||
}
|
||||
public void setContent(String content) {
|
||||
param.put("content", content);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getParameter(String key) {
|
||||
return param.get(key);
|
||||
}
|
||||
@Override
|
||||
public Object getParameter(String key) {
|
||||
return param.get(key);
|
||||
}
|
||||
|
||||
@Override
|
||||
public IConfigContext getConfigContext() {
|
||||
return configContext;
|
||||
}
|
||||
@Override
|
||||
public IConfigContext getConfigContext() {
|
||||
return configContext;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -23,56 +23,55 @@ import com.alibaba.nacos.api.config.filter.IConfigResponse;
|
||||
|
||||
/**
|
||||
* Config Response
|
||||
*
|
||||
* @author Nacos
|
||||
*
|
||||
* @author Nacos
|
||||
*/
|
||||
public class ConfigResponse implements IConfigResponse {
|
||||
|
||||
private Map<String, Object> param = new HashMap<String, Object>();
|
||||
private Map<String, Object> param = new HashMap<String, Object>();
|
||||
|
||||
private IConfigContext configContext = new ConfigContext();
|
||||
private IConfigContext configContext = new ConfigContext();
|
||||
|
||||
public String getTenant() {
|
||||
return (String) param.get("tenant");
|
||||
}
|
||||
public String getTenant() {
|
||||
return (String)param.get("tenant");
|
||||
}
|
||||
|
||||
public void setTenant(String tenant) {
|
||||
param.put("tenant", tenant);
|
||||
}
|
||||
public void setTenant(String tenant) {
|
||||
param.put("tenant", tenant);
|
||||
}
|
||||
|
||||
public String getDataId() {
|
||||
return (String) param.get("dataId");
|
||||
}
|
||||
public String getDataId() {
|
||||
return (String)param.get("dataId");
|
||||
}
|
||||
|
||||
public void setDataId(String dataId) {
|
||||
param.put("dataId", dataId);
|
||||
}
|
||||
public void setDataId(String dataId) {
|
||||
param.put("dataId", dataId);
|
||||
}
|
||||
|
||||
public String getGroup() {
|
||||
return (String) param.get("group");
|
||||
}
|
||||
public String getGroup() {
|
||||
return (String)param.get("group");
|
||||
}
|
||||
|
||||
public void setGroup(String group) {
|
||||
param.put("group", group);
|
||||
}
|
||||
public void setGroup(String group) {
|
||||
param.put("group", group);
|
||||
}
|
||||
|
||||
public String getContent() {
|
||||
return (String) param.get("content");
|
||||
}
|
||||
public String getContent() {
|
||||
return (String)param.get("content");
|
||||
}
|
||||
|
||||
public void setContent(String content) {
|
||||
param.put("content", content);
|
||||
}
|
||||
public void setContent(String content) {
|
||||
param.put("content", content);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getParameter(String key) {
|
||||
return param.get(key);
|
||||
}
|
||||
@Override
|
||||
public Object getParameter(String key) {
|
||||
return param.get(key);
|
||||
}
|
||||
|
||||
@Override
|
||||
public IConfigContext getConfigContext() {
|
||||
return configContext;
|
||||
}
|
||||
@Override
|
||||
public IConfigContext getConfigContext() {
|
||||
return configContext;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -32,56 +32,54 @@ import java.util.concurrent.CopyOnWriteArrayList;
|
||||
|
||||
/**
|
||||
* Listner Management
|
||||
*
|
||||
* @author Nacos
|
||||
*
|
||||
* @author Nacos
|
||||
*/
|
||||
public class CacheData {
|
||||
|
||||
final static public Logger log = LogUtils.logger(CacheData.class);
|
||||
|
||||
public boolean isInitializing() {
|
||||
return isInitializing;
|
||||
}
|
||||
final static public Logger log = LogUtils.logger(CacheData.class);
|
||||
|
||||
public void setInitializing(boolean isInitializing) {
|
||||
this.isInitializing = isInitializing;
|
||||
}
|
||||
public boolean isInitializing() {
|
||||
return isInitializing;
|
||||
}
|
||||
|
||||
public String getMd5() {
|
||||
public void setInitializing(boolean isInitializing) {
|
||||
this.isInitializing = isInitializing;
|
||||
}
|
||||
|
||||
public String getMd5() {
|
||||
return md5;
|
||||
}
|
||||
|
||||
public String getTenant() {
|
||||
return tenant;
|
||||
}
|
||||
|
||||
public String getTenant() {
|
||||
return tenant;
|
||||
}
|
||||
|
||||
public String getContent() {
|
||||
return content;
|
||||
}
|
||||
|
||||
|
||||
public void setContent(String newContent) {
|
||||
this.content = newContent;
|
||||
this.md5 = getMd5String(content);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add listener
|
||||
*
|
||||
* @param listener
|
||||
* listener
|
||||
*/
|
||||
public void addListener(Listener listener) {
|
||||
if (null == listener) {
|
||||
throw new IllegalArgumentException("listener is null");
|
||||
}
|
||||
ManagerListenerWrap wrap = new ManagerListenerWrap(listener);
|
||||
if (listeners.addIfAbsent(wrap)) {
|
||||
log.info(name, "[add-listener] ok, tenant={}, dataId={}, group={}, cnt={}", tenant, dataId, group,
|
||||
listeners.size());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Add listener
|
||||
*
|
||||
* @param listener listener
|
||||
*/
|
||||
public void addListener(Listener listener) {
|
||||
if (null == listener) {
|
||||
throw new IllegalArgumentException("listener is null");
|
||||
}
|
||||
ManagerListenerWrap wrap = new ManagerListenerWrap(listener);
|
||||
if (listeners.addIfAbsent(wrap)) {
|
||||
log.info(name, "[add-listener] ok, tenant={}, dataId={}, group={}, cnt={}", tenant, dataId, group,
|
||||
listeners.size());
|
||||
}
|
||||
}
|
||||
|
||||
public void removeListener(Listener listener) {
|
||||
if (null == listener) {
|
||||
throw new IllegalArgumentException("listener is null");
|
||||
@ -91,7 +89,7 @@ public class CacheData {
|
||||
log.info(name, "[remove-listener] ok, dataId={}, group={}, cnt={}", dataId, group, listeners.size());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 返回监听器列表上的迭代器,只读。保证不返回NULL。
|
||||
*/
|
||||
@ -103,32 +101,32 @@ public class CacheData {
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
public long getLocalConfigInfoVersion() {
|
||||
return localConfigLastModified;
|
||||
}
|
||||
|
||||
public void setLocalConfigInfoVersion(long localConfigLastModified) {
|
||||
this.localConfigLastModified = localConfigLastModified;
|
||||
}
|
||||
|
||||
|
||||
public boolean isUseLocalConfigInfo() {
|
||||
return isUseLocalConfig;
|
||||
}
|
||||
|
||||
public void setUseLocalConfigInfo(boolean useLocalConfigInfo) {
|
||||
this.isUseLocalConfig = useLocalConfigInfo;
|
||||
if (!useLocalConfigInfo) {
|
||||
localConfigLastModified = -1;
|
||||
}
|
||||
}
|
||||
|
||||
public int getTaskId() {
|
||||
return taskId;
|
||||
}
|
||||
|
||||
public void setTaskId(int taskId) {
|
||||
this.taskId = taskId;
|
||||
}
|
||||
public int getTaskId() {
|
||||
return taskId;
|
||||
}
|
||||
|
||||
public void setTaskId(int taskId) {
|
||||
this.taskId = taskId;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
@ -147,7 +145,7 @@ public class CacheData {
|
||||
if (this == obj) {
|
||||
return true;
|
||||
}
|
||||
CacheData other = (CacheData) obj;
|
||||
CacheData other = (CacheData)obj;
|
||||
return dataId.equals(other.dataId) && group.equals(other.group);
|
||||
}
|
||||
|
||||
@ -155,7 +153,7 @@ public class CacheData {
|
||||
public String toString() {
|
||||
return "CacheData [" + dataId + ", " + group + "]";
|
||||
}
|
||||
|
||||
|
||||
void checkListenerMd5() {
|
||||
for (ManagerListenerWrap wrap : listeners) {
|
||||
if (!md5.equals(wrap.lastCallMd5)) {
|
||||
@ -163,48 +161,46 @@ public class CacheData {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private void safeNotifyListener(final String dataId, final String group, final String content,
|
||||
final String md5, final ManagerListenerWrap listenerWrap) {
|
||||
final String md5, final ManagerListenerWrap listenerWrap) {
|
||||
final Listener listener = listenerWrap.listener;
|
||||
|
||||
|
||||
Runnable job = new Runnable() {
|
||||
public void run() {
|
||||
ClassLoader myClassLoader = Thread.currentThread().getContextClassLoader();
|
||||
ClassLoader appClassLoader= listener.getClass().getClassLoader();
|
||||
ClassLoader myClassLoader = Thread.currentThread().getContextClassLoader();
|
||||
ClassLoader appClassLoader = listener.getClass().getClassLoader();
|
||||
try {
|
||||
if(listener instanceof AbstractSharedListener){
|
||||
AbstractSharedListener adapter = (AbstractSharedListener) listener;
|
||||
if (listener instanceof AbstractSharedListener) {
|
||||
AbstractSharedListener adapter = (AbstractSharedListener)listener;
|
||||
adapter.fillContext(dataId, group);
|
||||
log.info(name, "[notify-context] dataId={}, group={}, md5={}", dataId, group, md5);
|
||||
}
|
||||
// 执行回调之前先将线程classloader设置为具体webapp的classloader,以免回调方法中调用spi接口是出现异常或错用(多应用部署才会有该问题)。
|
||||
Thread.currentThread().setContextClassLoader(appClassLoader);
|
||||
|
||||
ConfigResponse cr = new ConfigResponse();
|
||||
cr.setDataId(dataId);
|
||||
cr.setGroup(group);
|
||||
cr.setContent(content);
|
||||
configFilterChainManager.doFilter(null, cr);
|
||||
String contentTmp = cr.getContent();
|
||||
listener.receiveConfigInfo(contentTmp);
|
||||
listenerWrap.lastCallMd5 = md5;
|
||||
log.info(
|
||||
name,
|
||||
"[notify-ok] dataId={}, group={}, md5={}, listener={} ",
|
||||
dataId, group, md5, listener);
|
||||
} catch (NacosException de) {
|
||||
log.error(name, "NACOS-XXXX",
|
||||
"[notify-error] dataId={}, group={}, md5={}, listener={} errCode={} errMsg={}", dataId,
|
||||
group, md5, listener, de.getErrCode(), de.getErrMsg());
|
||||
} catch (Throwable t) {
|
||||
log.error(name, "NACOS-XXXX",
|
||||
"[notify-error] dataId={}, group={}, md5={}, listener={} tx={}", dataId, group, md5,
|
||||
listener, t.getCause());
|
||||
}
|
||||
finally
|
||||
{
|
||||
Thread.currentThread().setContextClassLoader(myClassLoader);
|
||||
|
||||
ConfigResponse cr = new ConfigResponse();
|
||||
cr.setDataId(dataId);
|
||||
cr.setGroup(group);
|
||||
cr.setContent(content);
|
||||
configFilterChainManager.doFilter(null, cr);
|
||||
String contentTmp = cr.getContent();
|
||||
listener.receiveConfigInfo(contentTmp);
|
||||
listenerWrap.lastCallMd5 = md5;
|
||||
log.info(
|
||||
name,
|
||||
"[notify-ok] dataId={}, group={}, md5={}, listener={} ",
|
||||
dataId, group, md5, listener);
|
||||
} catch (NacosException de) {
|
||||
log.error(name, "NACOS-XXXX",
|
||||
"[notify-error] dataId={}, group={}, md5={}, listener={} errCode={} errMsg={}", dataId,
|
||||
group, md5, listener, de.getErrCode(), de.getErrMsg());
|
||||
} catch (Throwable t) {
|
||||
log.error(name, "NACOS-XXXX",
|
||||
"[notify-error] dataId={}, group={}, md5={}, listener={} tx={}", dataId, group, md5,
|
||||
listener, t.getCause());
|
||||
} finally {
|
||||
Thread.currentThread().setContextClassLoader(myClassLoader);
|
||||
}
|
||||
}
|
||||
};
|
||||
@ -217,57 +213,59 @@ public class CacheData {
|
||||
job.run();
|
||||
}
|
||||
} catch (Throwable t) {
|
||||
log.error(
|
||||
name,
|
||||
"NACOS-XXXX",
|
||||
"[notify-error] dataId={}, group={}, md5={}, listener={} throwable={}",
|
||||
dataId, group, md5, listener, t.getCause());
|
||||
log.error(
|
||||
name,
|
||||
"NACOS-XXXX",
|
||||
"[notify-error] dataId={}, group={}, md5={}, listener={} throwable={}",
|
||||
dataId, group, md5, listener, t.getCause());
|
||||
}
|
||||
final long finishNotify = System.currentTimeMillis();
|
||||
log.info(name, "[notify-listener] time cost={}ms in ClientWorker, dataId={}, group={}, md5={}, listener={} ",(finishNotify - startNotify), dataId ,group, md5, listener);
|
||||
log.info(name, "[notify-listener] time cost={}ms in ClientWorker, dataId={}, group={}, md5={}, listener={} ",
|
||||
(finishNotify - startNotify), dataId, group, md5, listener);
|
||||
}
|
||||
|
||||
|
||||
static public String getMd5String(String config) {
|
||||
return (null == config) ? Constants.NULL : MD5.getInstance().getMD5String(config);
|
||||
}
|
||||
|
||||
private String loadCacheContentFromDiskLocal(String name, String dataId, String group, String tenant) {
|
||||
String content = LocalConfigInfoProcessor.getFailover(name, dataId, group, tenant);
|
||||
content = (null != content) ? content
|
||||
: LocalConfigInfoProcessor.getSnapshot(name, dataId, group, tenant);
|
||||
return content;
|
||||
String content = LocalConfigInfoProcessor.getFailover(name, dataId, group, tenant);
|
||||
content = (null != content) ? content
|
||||
: LocalConfigInfoProcessor.getSnapshot(name, dataId, group, tenant);
|
||||
return content;
|
||||
}
|
||||
|
||||
public CacheData(ConfigFilterChainManager configFilterChainManager, String name, String dataId, String group) {
|
||||
if (null == dataId || null == group) {
|
||||
throw new IllegalArgumentException("dataId=" + dataId + ", group=" + group);
|
||||
}
|
||||
this.name = name;
|
||||
this.configFilterChainManager = configFilterChainManager;
|
||||
this.dataId = dataId;
|
||||
this.group = group;
|
||||
this.tenant = TenantUtil.getUserTenant();
|
||||
listeners = new CopyOnWriteArrayList<ManagerListenerWrap>();
|
||||
this.isInitializing = true;
|
||||
this.content = loadCacheContentFromDiskLocal(name, dataId, group, tenant);
|
||||
this.md5 = getMd5String(content);
|
||||
|
||||
public CacheData(ConfigFilterChainManager configFilterChainManager, String name, String dataId, String group) {
|
||||
if (null == dataId || null == group) {
|
||||
throw new IllegalArgumentException("dataId=" + dataId + ", group=" + group);
|
||||
}
|
||||
this.name = name;
|
||||
this.configFilterChainManager = configFilterChainManager;
|
||||
this.dataId = dataId;
|
||||
this.group = group;
|
||||
this.tenant = TenantUtil.getUserTenant();
|
||||
listeners = new CopyOnWriteArrayList<ManagerListenerWrap>();
|
||||
this.isInitializing = true;
|
||||
this.content = loadCacheContentFromDiskLocal(name, dataId, group, tenant);
|
||||
this.md5 = getMd5String(content);
|
||||
}
|
||||
|
||||
public CacheData(ConfigFilterChainManager configFilterChainManager, String name, String dataId, String group, String tenant) {
|
||||
if (null == dataId || null == group) {
|
||||
throw new IllegalArgumentException("dataId=" + dataId + ", group=" + group);
|
||||
}
|
||||
this.name = name;
|
||||
this.configFilterChainManager = configFilterChainManager;
|
||||
this.dataId = dataId;
|
||||
this.group = group;
|
||||
this.tenant = tenant;
|
||||
listeners = new CopyOnWriteArrayList<ManagerListenerWrap>();
|
||||
this.isInitializing = true;
|
||||
this.content = loadCacheContentFromDiskLocal(name, dataId, group, tenant);
|
||||
this.md5 = getMd5String(content);
|
||||
|
||||
public CacheData(ConfigFilterChainManager configFilterChainManager, String name, String dataId, String group,
|
||||
String tenant) {
|
||||
if (null == dataId || null == group) {
|
||||
throw new IllegalArgumentException("dataId=" + dataId + ", group=" + group);
|
||||
}
|
||||
this.name = name;
|
||||
this.configFilterChainManager = configFilterChainManager;
|
||||
this.dataId = dataId;
|
||||
this.group = group;
|
||||
this.tenant = tenant;
|
||||
listeners = new CopyOnWriteArrayList<ManagerListenerWrap>();
|
||||
this.isInitializing = true;
|
||||
this.content = loadCacheContentFromDiskLocal(name, dataId, group, tenant);
|
||||
this.md5 = getMd5String(content);
|
||||
}
|
||||
|
||||
|
||||
// ==================
|
||||
|
||||
private final String name;
|
||||
@ -277,16 +275,16 @@ public class CacheData {
|
||||
public final String tenant;
|
||||
private final CopyOnWriteArrayList<ManagerListenerWrap> listeners;
|
||||
|
||||
private volatile String md5;
|
||||
/**
|
||||
* whether use local config
|
||||
*/
|
||||
private volatile boolean isUseLocalConfig = false;
|
||||
/**
|
||||
* last motify time
|
||||
*/
|
||||
private volatile long localConfigLastModified;
|
||||
private volatile String content;
|
||||
private volatile String md5;
|
||||
/**
|
||||
* whether use local config
|
||||
*/
|
||||
private volatile boolean isUseLocalConfig = false;
|
||||
/**
|
||||
* last motify time
|
||||
*/
|
||||
private volatile long localConfigLastModified;
|
||||
private volatile String content;
|
||||
private int taskId;
|
||||
private volatile boolean isInitializing = true;
|
||||
}
|
||||
@ -307,13 +305,13 @@ class ManagerListenerWrap {
|
||||
if (obj == this) {
|
||||
return true;
|
||||
}
|
||||
ManagerListenerWrap other = (ManagerListenerWrap) obj;
|
||||
ManagerListenerWrap other = (ManagerListenerWrap)obj;
|
||||
return listener.equals(other.listener);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return super.hashCode();
|
||||
}
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return super.hashCode();
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -44,24 +44,23 @@ import static com.alibaba.nacos.api.common.Constants.WORD_SEPARATOR;
|
||||
|
||||
/**
|
||||
* Longpulling
|
||||
*
|
||||
* @author Nacos
|
||||
*
|
||||
* @author Nacos
|
||||
*/
|
||||
public class ClientWorker {
|
||||
|
||||
final static public Logger log = LogUtils.logger(ClientWorker.class);
|
||||
|
||||
public void addListeners(String dataId, String group, List<? extends Listener> listeners) {
|
||||
final static public Logger log = LogUtils.logger(ClientWorker.class);
|
||||
|
||||
public void addListeners(String dataId, String group, List<? extends Listener> listeners) {
|
||||
group = null2defaultGroup(group);
|
||||
CacheData cache = addCacheDataIfAbsent(dataId, group);
|
||||
for (Listener listener : listeners) {
|
||||
cache.addListener(listener);
|
||||
}
|
||||
}
|
||||
|
||||
public void removeListener(String dataId, String group, Listener listener) {
|
||||
group = null2defaultGroup(group);
|
||||
}
|
||||
|
||||
public void removeListener(String dataId, String group, Listener listener) {
|
||||
group = null2defaultGroup(group);
|
||||
CacheData cache = getCache(dataId, group);
|
||||
if (null != cache) {
|
||||
cache.removeListener(listener);
|
||||
@ -69,30 +68,30 @@ public class ClientWorker {
|
||||
removeCache(dataId, group);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void addTenantListeners(String dataId, String group, List<? extends Listener> listeners) {
|
||||
group = null2defaultGroup(group);
|
||||
String tenant = agent.getTenant();
|
||||
CacheData cache = addCacheDataIfAbsent(dataId, group, tenant);
|
||||
for (Listener listener : listeners) {
|
||||
cache.addListener(listener);
|
||||
}
|
||||
}
|
||||
|
||||
public void removeTenantListener(String dataId, String group, Listener listener) {
|
||||
group = null2defaultGroup(group);
|
||||
String tenant = agent.getTenant();
|
||||
CacheData cache = getCache(dataId, group, tenant);
|
||||
if (null != cache) {
|
||||
cache.removeListener(listener);
|
||||
if (cache.getListeners().isEmpty()) {
|
||||
removeCache(dataId, group, tenant);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressFBWarnings("JLM_JSR166_UTILCONCURRENT_MONITORENTER")
|
||||
}
|
||||
|
||||
public void addTenantListeners(String dataId, String group, List<? extends Listener> listeners) {
|
||||
group = null2defaultGroup(group);
|
||||
String tenant = agent.getTenant();
|
||||
CacheData cache = addCacheDataIfAbsent(dataId, group, tenant);
|
||||
for (Listener listener : listeners) {
|
||||
cache.addListener(listener);
|
||||
}
|
||||
}
|
||||
|
||||
public void removeTenantListener(String dataId, String group, Listener listener) {
|
||||
group = null2defaultGroup(group);
|
||||
String tenant = agent.getTenant();
|
||||
CacheData cache = getCache(dataId, group, tenant);
|
||||
if (null != cache) {
|
||||
cache.removeListener(listener);
|
||||
if (cache.getListeners().isEmpty()) {
|
||||
removeCache(dataId, group, tenant);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressFBWarnings("JLM_JSR166_UTILCONCURRENT_MONITORENTER")
|
||||
void removeCache(String dataId, String group) {
|
||||
String groupKey = GroupKey.getKey(dataId, group);
|
||||
synchronized (cacheMap) {
|
||||
@ -102,20 +101,20 @@ public class ClientWorker {
|
||||
}
|
||||
log.info(agent.getName(), "[unsubscribe] {}", groupKey);
|
||||
}
|
||||
|
||||
@SuppressFBWarnings("JLM_JSR166_UTILCONCURRENT_MONITORENTER")
|
||||
|
||||
@SuppressFBWarnings("JLM_JSR166_UTILCONCURRENT_MONITORENTER")
|
||||
void removeCache(String dataId, String group, String tenant) {
|
||||
String groupKey = GroupKey.getKeyTenant(dataId, group, tenant);
|
||||
synchronized (cacheMap) {
|
||||
Map<String, CacheData> copy = new HashMap<String, CacheData>(cacheMap.get());
|
||||
copy.remove(groupKey);
|
||||
cacheMap.set(copy);
|
||||
}
|
||||
log.info(agent.getName(), "[unsubscribe] {}", groupKey);
|
||||
String groupKey = GroupKey.getKeyTenant(dataId, group, tenant);
|
||||
synchronized (cacheMap) {
|
||||
Map<String, CacheData> copy = new HashMap<String, CacheData>(cacheMap.get());
|
||||
copy.remove(groupKey);
|
||||
cacheMap.set(copy);
|
||||
}
|
||||
log.info(agent.getName(), "[unsubscribe] {}", groupKey);
|
||||
}
|
||||
|
||||
@SuppressFBWarnings("JLM_JSR166_UTILCONCURRENT_MONITORENTER")
|
||||
public CacheData addCacheDataIfAbsent(String dataId, String group) {
|
||||
|
||||
@SuppressFBWarnings("JLM_JSR166_UTILCONCURRENT_MONITORENTER")
|
||||
public CacheData addCacheDataIfAbsent(String dataId, String group) {
|
||||
CacheData cache = getCache(dataId, group);
|
||||
if (null != cache) {
|
||||
return cache;
|
||||
@ -123,408 +122,409 @@ public class ClientWorker {
|
||||
|
||||
String key = GroupKey.getKey(dataId, group);
|
||||
cache = new CacheData(configFilterChainManager, agent.getName(), dataId, group);
|
||||
|
||||
|
||||
synchronized (cacheMap) {
|
||||
CacheData cacheFromMap = getCache(dataId, group);
|
||||
// multiple listeners on the same dataid+group and race condition,so double check again
|
||||
//other listener thread beat me to set to cacheMap
|
||||
if(null != cacheFromMap) {
|
||||
cache = cacheFromMap;
|
||||
//reset so that server not hang this check
|
||||
cache.setInitializing(true);
|
||||
} else {
|
||||
int taskId = cacheMap.get().size() / (int) ParamUtil.getPerTaskConfigSize();
|
||||
cache.setTaskId(taskId);
|
||||
}
|
||||
|
||||
CacheData cacheFromMap = getCache(dataId, group);
|
||||
// multiple listeners on the same dataid+group and race condition,so double check again
|
||||
//other listener thread beat me to set to cacheMap
|
||||
if (null != cacheFromMap) {
|
||||
cache = cacheFromMap;
|
||||
//reset so that server not hang this check
|
||||
cache.setInitializing(true);
|
||||
} else {
|
||||
int taskId = cacheMap.get().size() / (int)ParamUtil.getPerTaskConfigSize();
|
||||
cache.setTaskId(taskId);
|
||||
}
|
||||
|
||||
Map<String, CacheData> copy = new HashMap<String, CacheData>(cacheMap.get());
|
||||
copy.put(key, cache);
|
||||
cacheMap.set(copy);
|
||||
}
|
||||
|
||||
|
||||
log.info(agent.getName(), "[subscribe] {}", key);
|
||||
|
||||
|
||||
return cache;
|
||||
}
|
||||
@SuppressFBWarnings("JLM_JSR166_UTILCONCURRENT_MONITORENTER")
|
||||
public CacheData addCacheDataIfAbsent(String dataId, String group, String tenant) {
|
||||
CacheData cache = getCache(dataId, group, tenant);
|
||||
if (null != cache) {
|
||||
return cache;
|
||||
}
|
||||
String key = GroupKey.getKeyTenant(dataId, group, tenant);
|
||||
cache = new CacheData(configFilterChainManager, agent.getName(), dataId, group, tenant);
|
||||
synchronized (cacheMap) {
|
||||
CacheData cacheFromMap = getCache(dataId, group, tenant);
|
||||
// multiple listeners on the same dataid+group and race condition,so
|
||||
// double check again
|
||||
// other listener thread beat me to set to cacheMap
|
||||
if (null != cacheFromMap) {
|
||||
cache = cacheFromMap;
|
||||
// reset so that server not hang this check
|
||||
cache.setInitializing(true);
|
||||
}
|
||||
|
||||
Map<String, CacheData> copy = new HashMap<String, CacheData>(cacheMap.get());
|
||||
copy.put(key, cache);
|
||||
cacheMap.set(copy);
|
||||
}
|
||||
log.info(agent.getName(), "[subscribe] {}", key);
|
||||
return cache;
|
||||
}
|
||||
|
||||
public CacheData getCache(String dataId, String group) {
|
||||
return getCache(dataId, group, TenantUtil.getUserTenant());
|
||||
}
|
||||
|
||||
public CacheData getCache(String dataId, String group, String tenant) {
|
||||
if (null == dataId || null == group) {
|
||||
throw new IllegalArgumentException();
|
||||
}
|
||||
return cacheMap.get().get(GroupKey.getKeyTenant(dataId, group, tenant));
|
||||
}
|
||||
|
||||
@SuppressFBWarnings("JLM_JSR166_UTILCONCURRENT_MONITORENTER")
|
||||
public CacheData addCacheDataIfAbsent(String dataId, String group, String tenant) {
|
||||
CacheData cache = getCache(dataId, group, tenant);
|
||||
if (null != cache) {
|
||||
return cache;
|
||||
}
|
||||
String key = GroupKey.getKeyTenant(dataId, group, tenant);
|
||||
cache = new CacheData(configFilterChainManager, agent.getName(), dataId, group, tenant);
|
||||
synchronized (cacheMap) {
|
||||
CacheData cacheFromMap = getCache(dataId, group, tenant);
|
||||
// multiple listeners on the same dataid+group and race condition,so
|
||||
// double check again
|
||||
// other listener thread beat me to set to cacheMap
|
||||
if (null != cacheFromMap) {
|
||||
cache = cacheFromMap;
|
||||
// reset so that server not hang this check
|
||||
cache.setInitializing(true);
|
||||
}
|
||||
|
||||
public String getServerConfig(String dataId, String group, String tenant, long readTimeout)
|
||||
throws NacosException {
|
||||
if (StringUtils.isBlank(group)) {
|
||||
group = Constants.DEFAULT_GROUP;
|
||||
}
|
||||
Map<String, CacheData> copy = new HashMap<String, CacheData>(cacheMap.get());
|
||||
copy.put(key, cache);
|
||||
cacheMap.set(copy);
|
||||
}
|
||||
log.info(agent.getName(), "[subscribe] {}", key);
|
||||
return cache;
|
||||
}
|
||||
|
||||
HttpResult result = null;
|
||||
try {
|
||||
List<String> params = null;
|
||||
if (StringUtils.isBlank(tenant)) {
|
||||
params = Arrays.asList("dataId", dataId, "group", group);
|
||||
} else {
|
||||
params = Arrays.asList("dataId", dataId, "group", group, "tenant", tenant);
|
||||
}
|
||||
result = agent.httpGet(Constants.CONFIG_CONTROLLER_PATH, null, params, agent.getEncode(), readTimeout);
|
||||
} catch (IOException e) {
|
||||
log.error(agent.getName(), "NACOS-XXXX",
|
||||
"[sub-server] get server config exception, dataId={}, group={}, tenant={}, msg={}", dataId, group,
|
||||
tenant, e.toString());
|
||||
throw new NacosException(NacosException.SERVER_ERROR, e.getMessage());
|
||||
}
|
||||
public CacheData getCache(String dataId, String group) {
|
||||
return getCache(dataId, group, TenantUtil.getUserTenant());
|
||||
}
|
||||
|
||||
switch (result.code) {
|
||||
case HttpURLConnection.HTTP_OK:
|
||||
LocalConfigInfoProcessor.saveSnapshot(agent.getName(), dataId, group, tenant, result.content);
|
||||
return result.content;
|
||||
case HttpURLConnection.HTTP_NOT_FOUND:
|
||||
LocalConfigInfoProcessor.saveSnapshot(agent.getName(), dataId, group, tenant, null);
|
||||
return null;
|
||||
case HttpURLConnection.HTTP_CONFLICT: {
|
||||
log.error(agent.getName(), "NACOS-XXXX",
|
||||
"[sub-server-error] get server config being modified concurrently, dataId={}, group={}, tenant={}",
|
||||
dataId, group, tenant);
|
||||
throw new NacosException(NacosException.CONFLICT,
|
||||
"data being modified, dataId=" + dataId + ",group=" + group + ",tenant=" + tenant);
|
||||
}
|
||||
case HttpURLConnection.HTTP_FORBIDDEN: {
|
||||
log.error(agent.getName(), "NACOS-XXXX", "[sub-server-error] no right, dataId={}, group={}, tenant={}",
|
||||
dataId, group, tenant);
|
||||
throw new NacosException(result.code, result.content);
|
||||
}
|
||||
default: {
|
||||
log.error(agent.getName(), "NACOS-XXXX", "[sub-server-error] dataId={}, group={}, tenant={}, code={}",
|
||||
dataId, group, tenant, result.code);
|
||||
throw new NacosException(result.code,
|
||||
"http error, code=" + result.code + ",dataId=" + dataId + ",group=" + group + ",tenant=" + tenant);
|
||||
}
|
||||
}
|
||||
}
|
||||
public CacheData getCache(String dataId, String group, String tenant) {
|
||||
if (null == dataId || null == group) {
|
||||
throw new IllegalArgumentException();
|
||||
}
|
||||
return cacheMap.get().get(GroupKey.getKeyTenant(dataId, group, tenant));
|
||||
}
|
||||
|
||||
private void checkLocalConfig(CacheData cacheData) {
|
||||
final String dataId = cacheData.dataId;
|
||||
final String group = cacheData.group;
|
||||
final String tenant = cacheData.tenant;
|
||||
File path = LocalConfigInfoProcessor.getFailoverFile(agent.getName(), dataId, group, tenant);
|
||||
public String getServerConfig(String dataId, String group, String tenant, long readTimeout)
|
||||
throws NacosException {
|
||||
if (StringUtils.isBlank(group)) {
|
||||
group = Constants.DEFAULT_GROUP;
|
||||
}
|
||||
|
||||
// 没有 -> 有
|
||||
if (!cacheData.isUseLocalConfigInfo() && path.exists()) {
|
||||
String content = LocalConfigInfoProcessor.getFailover(agent.getName(), dataId, group, tenant);
|
||||
String md5 = MD5.getInstance().getMD5String(content);
|
||||
cacheData.setUseLocalConfigInfo(true);
|
||||
cacheData.setLocalConfigInfoVersion(path.lastModified());
|
||||
cacheData.setContent(content);
|
||||
HttpResult result = null;
|
||||
try {
|
||||
List<String> params = null;
|
||||
if (StringUtils.isBlank(tenant)) {
|
||||
params = Arrays.asList("dataId", dataId, "group", group);
|
||||
} else {
|
||||
params = Arrays.asList("dataId", dataId, "group", group, "tenant", tenant);
|
||||
}
|
||||
result = agent.httpGet(Constants.CONFIG_CONTROLLER_PATH, null, params, agent.getEncode(), readTimeout);
|
||||
} catch (IOException e) {
|
||||
log.error(agent.getName(), "NACOS-XXXX",
|
||||
"[sub-server] get server config exception, dataId={}, group={}, tenant={}, msg={}", dataId, group,
|
||||
tenant, e.toString());
|
||||
throw new NacosException(NacosException.SERVER_ERROR, e.getMessage());
|
||||
}
|
||||
|
||||
log.warn(agent.getName(),
|
||||
"[failover-change] failover file created. dataId={}, group={}, tenant={}, md5={}, content={}",
|
||||
dataId, group, tenant, md5, ContentUtils.truncateContent(content));
|
||||
return;
|
||||
}
|
||||
switch (result.code) {
|
||||
case HttpURLConnection.HTTP_OK:
|
||||
LocalConfigInfoProcessor.saveSnapshot(agent.getName(), dataId, group, tenant, result.content);
|
||||
return result.content;
|
||||
case HttpURLConnection.HTTP_NOT_FOUND:
|
||||
LocalConfigInfoProcessor.saveSnapshot(agent.getName(), dataId, group, tenant, null);
|
||||
return null;
|
||||
case HttpURLConnection.HTTP_CONFLICT: {
|
||||
log.error(agent.getName(), "NACOS-XXXX",
|
||||
"[sub-server-error] get server config being modified concurrently, dataId={}, group={}, tenant={}",
|
||||
dataId, group, tenant);
|
||||
throw new NacosException(NacosException.CONFLICT,
|
||||
"data being modified, dataId=" + dataId + ",group=" + group + ",tenant=" + tenant);
|
||||
}
|
||||
case HttpURLConnection.HTTP_FORBIDDEN: {
|
||||
log.error(agent.getName(), "NACOS-XXXX", "[sub-server-error] no right, dataId={}, group={}, tenant={}",
|
||||
dataId, group, tenant);
|
||||
throw new NacosException(result.code, result.content);
|
||||
}
|
||||
default: {
|
||||
log.error(agent.getName(), "NACOS-XXXX", "[sub-server-error] dataId={}, group={}, tenant={}, code={}",
|
||||
dataId, group, tenant, result.code);
|
||||
throw new NacosException(result.code,
|
||||
"http error, code=" + result.code + ",dataId=" + dataId + ",group=" + group + ",tenant=" + tenant);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 有 -> 没有。不通知业务监听器,从server拿到配置后通知。
|
||||
if (cacheData.isUseLocalConfigInfo() && !path.exists()) {
|
||||
cacheData.setUseLocalConfigInfo(false);
|
||||
log.warn(agent.getName(), "[failover-change] failover file deleted. dataId={}, group={}, tenant={}", dataId,
|
||||
group, tenant);
|
||||
return;
|
||||
}
|
||||
private void checkLocalConfig(CacheData cacheData) {
|
||||
final String dataId = cacheData.dataId;
|
||||
final String group = cacheData.group;
|
||||
final String tenant = cacheData.tenant;
|
||||
File path = LocalConfigInfoProcessor.getFailoverFile(agent.getName(), dataId, group, tenant);
|
||||
|
||||
// 没有 -> 有
|
||||
if (!cacheData.isUseLocalConfigInfo() && path.exists()) {
|
||||
String content = LocalConfigInfoProcessor.getFailover(agent.getName(), dataId, group, tenant);
|
||||
String md5 = MD5.getInstance().getMD5String(content);
|
||||
cacheData.setUseLocalConfigInfo(true);
|
||||
cacheData.setLocalConfigInfoVersion(path.lastModified());
|
||||
cacheData.setContent(content);
|
||||
|
||||
log.warn(agent.getName(),
|
||||
"[failover-change] failover file created. dataId={}, group={}, tenant={}, md5={}, content={}",
|
||||
dataId, group, tenant, md5, ContentUtils.truncateContent(content));
|
||||
return;
|
||||
}
|
||||
|
||||
// 有 -> 没有。不通知业务监听器,从server拿到配置后通知。
|
||||
if (cacheData.isUseLocalConfigInfo() && !path.exists()) {
|
||||
cacheData.setUseLocalConfigInfo(false);
|
||||
log.warn(agent.getName(), "[failover-change] failover file deleted. dataId={}, group={}, tenant={}", dataId,
|
||||
group, tenant);
|
||||
return;
|
||||
}
|
||||
|
||||
// 有变更
|
||||
if (cacheData.isUseLocalConfigInfo() && path.exists()
|
||||
&& cacheData.getLocalConfigInfoVersion() != path.lastModified()) {
|
||||
String content = LocalConfigInfoProcessor.getFailover(agent.getName(), dataId, group, tenant);
|
||||
String md5 = MD5.getInstance().getMD5String(content);
|
||||
cacheData.setUseLocalConfigInfo(true);
|
||||
cacheData.setLocalConfigInfoVersion(path.lastModified());
|
||||
cacheData.setContent(content);
|
||||
log.warn(agent.getName(),
|
||||
"[failover-change] failover file changed. dataId={}, group={}, tenant={}, md5={}, content={}",
|
||||
dataId, group, tenant, md5, ContentUtils.truncateContent(content));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// 有变更
|
||||
if (cacheData.isUseLocalConfigInfo() && path.exists()
|
||||
&& cacheData.getLocalConfigInfoVersion() != path.lastModified()) {
|
||||
String content = LocalConfigInfoProcessor.getFailover(agent.getName(), dataId, group, tenant);
|
||||
String md5 = MD5.getInstance().getMD5String(content);
|
||||
cacheData.setUseLocalConfigInfo(true);
|
||||
cacheData.setLocalConfigInfoVersion(path.lastModified());
|
||||
cacheData.setContent(content);
|
||||
log.warn(agent.getName(),
|
||||
"[failover-change] failover file changed. dataId={}, group={}, tenant={}, md5={}, content={}",
|
||||
dataId, group, tenant, md5, ContentUtils.truncateContent(content));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
private String null2defaultGroup(String group) {
|
||||
return (null == group) ? Constants.DEFAULT_GROUP : group.trim();
|
||||
}
|
||||
|
||||
public void checkConfigInfo() {
|
||||
// 分任务
|
||||
int listenerSize = cacheMap.get().size();
|
||||
// 向上取整为批数
|
||||
int longingTaskCount = (int) Math.ceil(listenerSize / ParamUtil.getPerTaskConfigSize());
|
||||
if (longingTaskCount > currentLongingTaskCount) {
|
||||
for (int i = (int) currentLongingTaskCount; i < longingTaskCount; i++) {
|
||||
// 要判断任务是否在执行 这块需要好好想想。 任务列表现在是无序的。变化过程可能有问题
|
||||
executorService.execute(new LongPullingRunnable(i));
|
||||
}
|
||||
currentLongingTaskCount = longingTaskCount;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 从Server获取值变化了的DataID列表。返回的对象里只有dataId和group是有效的。 保证不返回NULL。
|
||||
*/
|
||||
List<String> checkUpdateDataIds(List<CacheData> cacheDatas, List<String> inInitializingCacheList) {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
for (CacheData cacheData : cacheDatas) {
|
||||
if (!cacheData.isUseLocalConfigInfo()) {
|
||||
sb.append(cacheData.dataId).append(WORD_SEPARATOR);
|
||||
sb.append(cacheData.group).append(WORD_SEPARATOR);
|
||||
if (StringUtils.isBlank(cacheData.tenant)) {
|
||||
sb.append(cacheData.getMd5()).append(LINE_SEPARATOR);
|
||||
} else {
|
||||
sb.append(cacheData.getMd5()).append(WORD_SEPARATOR);
|
||||
sb.append(cacheData.getTenant()).append(LINE_SEPARATOR);
|
||||
}
|
||||
if (cacheData.isInitializing()) {
|
||||
// cacheData 首次出现在cacheMap中&首次check更新
|
||||
inInitializingCacheList
|
||||
.add(GroupKey.getKeyTenant(cacheData.dataId, cacheData.group, cacheData.tenant));
|
||||
}
|
||||
}
|
||||
}
|
||||
boolean isInitializingCacheList = !inInitializingCacheList.isEmpty();
|
||||
return checkUpdateConfigStr(sb.toString(), isInitializingCacheList);
|
||||
}
|
||||
public void checkConfigInfo() {
|
||||
// 分任务
|
||||
int listenerSize = cacheMap.get().size();
|
||||
// 向上取整为批数
|
||||
int longingTaskCount = (int)Math.ceil(listenerSize / ParamUtil.getPerTaskConfigSize());
|
||||
if (longingTaskCount > currentLongingTaskCount) {
|
||||
for (int i = (int)currentLongingTaskCount; i < longingTaskCount; i++) {
|
||||
// 要判断任务是否在执行 这块需要好好想想。 任务列表现在是无序的。变化过程可能有问题
|
||||
executorService.execute(new LongPullingRunnable(i));
|
||||
}
|
||||
currentLongingTaskCount = longingTaskCount;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 从Server获取值变化了的DataID列表。返回的对象里只有dataId和group是有效的。 保证不返回NULL。
|
||||
*/
|
||||
List<String> checkUpdateConfigStr(String probeUpdateString, boolean isInitializingCacheList) {
|
||||
/**
|
||||
* 从Server获取值变化了的DataID列表。返回的对象里只有dataId和group是有效的。 保证不返回NULL。
|
||||
*/
|
||||
List<String> checkUpdateDataIds(List<CacheData> cacheDatas, List<String> inInitializingCacheList) {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
for (CacheData cacheData : cacheDatas) {
|
||||
if (!cacheData.isUseLocalConfigInfo()) {
|
||||
sb.append(cacheData.dataId).append(WORD_SEPARATOR);
|
||||
sb.append(cacheData.group).append(WORD_SEPARATOR);
|
||||
if (StringUtils.isBlank(cacheData.tenant)) {
|
||||
sb.append(cacheData.getMd5()).append(LINE_SEPARATOR);
|
||||
} else {
|
||||
sb.append(cacheData.getMd5()).append(WORD_SEPARATOR);
|
||||
sb.append(cacheData.getTenant()).append(LINE_SEPARATOR);
|
||||
}
|
||||
if (cacheData.isInitializing()) {
|
||||
// cacheData 首次出现在cacheMap中&首次check更新
|
||||
inInitializingCacheList
|
||||
.add(GroupKey.getKeyTenant(cacheData.dataId, cacheData.group, cacheData.tenant));
|
||||
}
|
||||
}
|
||||
}
|
||||
boolean isInitializingCacheList = !inInitializingCacheList.isEmpty();
|
||||
return checkUpdateConfigStr(sb.toString(), isInitializingCacheList);
|
||||
}
|
||||
|
||||
List<String> params = Arrays.asList(Constants.PROBE_MODIFY_REQUEST, probeUpdateString);
|
||||
long timeout = TimeUnit.SECONDS.toMillis(30L);
|
||||
/**
|
||||
* 从Server获取值变化了的DataID列表。返回的对象里只有dataId和group是有效的。 保证不返回NULL。
|
||||
*/
|
||||
List<String> checkUpdateConfigStr(String probeUpdateString, boolean isInitializingCacheList) {
|
||||
|
||||
List<String> headers = new ArrayList<String>(2);
|
||||
headers.add("Long-Pulling-Timeout");
|
||||
headers.add("" + timeout);
|
||||
List<String> params = Arrays.asList(Constants.PROBE_MODIFY_REQUEST, probeUpdateString);
|
||||
long timeout = TimeUnit.SECONDS.toMillis(30L);
|
||||
|
||||
// told server do not hang me up if new initializing cacheData added in
|
||||
if (isInitializingCacheList) {
|
||||
headers.add("Long-Pulling-Timeout-No-Hangup");
|
||||
headers.add("true");
|
||||
}
|
||||
List<String> headers = new ArrayList<String>(2);
|
||||
headers.add("Long-Pulling-Timeout");
|
||||
headers.add("" + timeout);
|
||||
|
||||
if (StringUtils.isBlank(probeUpdateString)) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
// told server do not hang me up if new initializing cacheData added in
|
||||
if (isInitializingCacheList) {
|
||||
headers.add("Long-Pulling-Timeout-No-Hangup");
|
||||
headers.add("true");
|
||||
}
|
||||
|
||||
try {
|
||||
HttpResult result = agent.httpPost(Constants.CONFIG_CONTROLLER_PATH + "/listener", headers, params,
|
||||
agent.getEncode(), timeout);
|
||||
if (StringUtils.isBlank(probeUpdateString)) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
if (HttpURLConnection.HTTP_OK == result.code) {
|
||||
setHealthServer(true);
|
||||
return parseUpdateDataIdResponse(result.content);
|
||||
} else {
|
||||
setHealthServer(false);
|
||||
if (result.code == HttpURLConnection.HTTP_INTERNAL_ERROR) {
|
||||
log.error("NACOS-0007", LoggerHelper.getErrorCodeStr("Nacos", "Nacos-0007", "环境问题",
|
||||
"[check-update] get changed dataId error"));
|
||||
}
|
||||
log.error(agent.getName(), "NACOS-XXXX", "[check-update] get changed dataId error, code={}",
|
||||
result.code);
|
||||
}
|
||||
} catch (IOException e) {
|
||||
setHealthServer(false);
|
||||
log.error(agent.getName(), "NACOS-XXXX", "[check-update] get changed dataId exception, msg={}",
|
||||
e.toString());
|
||||
}
|
||||
return Collections.emptyList();
|
||||
}
|
||||
try {
|
||||
HttpResult result = agent.httpPost(Constants.CONFIG_CONTROLLER_PATH + "/listener", headers, params,
|
||||
agent.getEncode(), timeout);
|
||||
|
||||
/**
|
||||
* 从HTTP响应拿到变化的groupKey。保证不返回NULL。
|
||||
*/
|
||||
private List<String> parseUpdateDataIdResponse(String response) {
|
||||
if (StringUtils.isBlank(response)) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
if (HttpURLConnection.HTTP_OK == result.code) {
|
||||
setHealthServer(true);
|
||||
return parseUpdateDataIdResponse(result.content);
|
||||
} else {
|
||||
setHealthServer(false);
|
||||
if (result.code == HttpURLConnection.HTTP_INTERNAL_ERROR) {
|
||||
log.error("NACOS-0007", LoggerHelper.getErrorCodeStr("Nacos", "Nacos-0007", "环境问题",
|
||||
"[check-update] get changed dataId error"));
|
||||
}
|
||||
log.error(agent.getName(), "NACOS-XXXX", "[check-update] get changed dataId error, code={}",
|
||||
result.code);
|
||||
}
|
||||
} catch (IOException e) {
|
||||
setHealthServer(false);
|
||||
log.error(agent.getName(), "NACOS-XXXX", "[check-update] get changed dataId exception, msg={}",
|
||||
e.toString());
|
||||
}
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
try {
|
||||
response = URLDecoder.decode(response, "UTF-8");
|
||||
} catch (Exception e) {
|
||||
log.error(agent.getName(), "NACOS-XXXX", "[polling-resp] decode modifiedDataIdsString error", e);
|
||||
}
|
||||
/**
|
||||
* 从HTTP响应拿到变化的groupKey。保证不返回NULL。
|
||||
*/
|
||||
private List<String> parseUpdateDataIdResponse(String response) {
|
||||
if (StringUtils.isBlank(response)) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
List<String> updateList = new LinkedList<String>();
|
||||
try {
|
||||
response = URLDecoder.decode(response, "UTF-8");
|
||||
} catch (Exception e) {
|
||||
log.error(agent.getName(), "NACOS-XXXX", "[polling-resp] decode modifiedDataIdsString error", e);
|
||||
}
|
||||
|
||||
for (String dataIdAndGroup : response.split(LINE_SEPARATOR)) {
|
||||
if (!StringUtils.isBlank(dataIdAndGroup)) {
|
||||
String[] keyArr = dataIdAndGroup.split(WORD_SEPARATOR);
|
||||
String dataId = keyArr[0];
|
||||
String group = keyArr[1];
|
||||
if (keyArr.length == 2) {
|
||||
updateList.add(GroupKey.getKey(dataId, group));
|
||||
log.info(agent.getName(), "[polling-resp] config changed. dataId={}, group={}", dataId, group);
|
||||
} else if (keyArr.length == 3) {
|
||||
String tenant = keyArr[2];
|
||||
updateList.add(GroupKey.getKeyTenant(dataId, group, tenant));
|
||||
log.info(agent.getName(), "[polling-resp] config changed. dataId={}, group={}, tenant={}", dataId,
|
||||
group, tenant);
|
||||
} else {
|
||||
log.error(agent.getName(), "NACOS-XXXX", "[polling-resp] invalid dataIdAndGroup error",
|
||||
dataIdAndGroup);
|
||||
}
|
||||
}
|
||||
}
|
||||
return updateList;
|
||||
}
|
||||
List<String> updateList = new LinkedList<String>();
|
||||
|
||||
@SuppressWarnings("PMD.ThreadPoolCreationRule")
|
||||
public ClientWorker(final ServerHttpAgent agent, final ConfigFilterChainManager configFilterChainManager) {
|
||||
this.agent = agent;
|
||||
this.configFilterChainManager = configFilterChainManager;
|
||||
executor = Executors.newScheduledThreadPool(1, new ThreadFactory() {
|
||||
@Override
|
||||
public Thread newThread(Runnable r) {
|
||||
Thread t = new Thread(r);
|
||||
t.setName("com.alibaba.nacos.client.Worker." + agent.getName());
|
||||
t.setDaemon(true);
|
||||
return t;
|
||||
}
|
||||
});
|
||||
for (String dataIdAndGroup : response.split(LINE_SEPARATOR)) {
|
||||
if (!StringUtils.isBlank(dataIdAndGroup)) {
|
||||
String[] keyArr = dataIdAndGroup.split(WORD_SEPARATOR);
|
||||
String dataId = keyArr[0];
|
||||
String group = keyArr[1];
|
||||
if (keyArr.length == 2) {
|
||||
updateList.add(GroupKey.getKey(dataId, group));
|
||||
log.info(agent.getName(), "[polling-resp] config changed. dataId={}, group={}", dataId, group);
|
||||
} else if (keyArr.length == 3) {
|
||||
String tenant = keyArr[2];
|
||||
updateList.add(GroupKey.getKeyTenant(dataId, group, tenant));
|
||||
log.info(agent.getName(), "[polling-resp] config changed. dataId={}, group={}, tenant={}", dataId,
|
||||
group, tenant);
|
||||
} else {
|
||||
log.error(agent.getName(), "NACOS-XXXX", "[polling-resp] invalid dataIdAndGroup error",
|
||||
dataIdAndGroup);
|
||||
}
|
||||
}
|
||||
}
|
||||
return updateList;
|
||||
}
|
||||
|
||||
executorService = Executors.newCachedThreadPool(new ThreadFactory() {
|
||||
@Override
|
||||
public Thread newThread(Runnable r) {
|
||||
Thread t = new Thread(r);
|
||||
t.setName("com.alibaba.nacos.client.Worker.longPulling" + agent.getName());
|
||||
t.setDaemon(true);
|
||||
return t;
|
||||
}
|
||||
});
|
||||
@SuppressWarnings("PMD.ThreadPoolCreationRule")
|
||||
public ClientWorker(final ServerHttpAgent agent, final ConfigFilterChainManager configFilterChainManager) {
|
||||
this.agent = agent;
|
||||
this.configFilterChainManager = configFilterChainManager;
|
||||
executor = Executors.newScheduledThreadPool(1, new ThreadFactory() {
|
||||
@Override
|
||||
public Thread newThread(Runnable r) {
|
||||
Thread t = new Thread(r);
|
||||
t.setName("com.alibaba.nacos.client.Worker." + agent.getName());
|
||||
t.setDaemon(true);
|
||||
return t;
|
||||
}
|
||||
});
|
||||
|
||||
executor.scheduleWithFixedDelay(new Runnable() {
|
||||
public void run() {
|
||||
try {
|
||||
checkConfigInfo();
|
||||
} catch (Throwable e) {
|
||||
log.error(agent.getName(), "NACOS-XXXX", "[sub-check] rotate check error", e);
|
||||
}
|
||||
}
|
||||
}, 1L, 10L, TimeUnit.MILLISECONDS);
|
||||
}
|
||||
executorService = Executors.newCachedThreadPool(new ThreadFactory() {
|
||||
@Override
|
||||
public Thread newThread(Runnable r) {
|
||||
Thread t = new Thread(r);
|
||||
t.setName("com.alibaba.nacos.client.Worker.longPulling" + agent.getName());
|
||||
t.setDaemon(true);
|
||||
return t;
|
||||
}
|
||||
});
|
||||
|
||||
class LongPullingRunnable implements Runnable {
|
||||
private int taskId;
|
||||
executor.scheduleWithFixedDelay(new Runnable() {
|
||||
public void run() {
|
||||
try {
|
||||
checkConfigInfo();
|
||||
} catch (Throwable e) {
|
||||
log.error(agent.getName(), "NACOS-XXXX", "[sub-check] rotate check error", e);
|
||||
}
|
||||
}
|
||||
}, 1L, 10L, TimeUnit.MILLISECONDS);
|
||||
}
|
||||
|
||||
public LongPullingRunnable(int taskId) {
|
||||
this.taskId = taskId;
|
||||
}
|
||||
class LongPullingRunnable implements Runnable {
|
||||
private int taskId;
|
||||
|
||||
public void run() {
|
||||
try {
|
||||
List<CacheData> cacheDatas = new ArrayList<CacheData>();
|
||||
// check failover config
|
||||
for (CacheData cacheData : cacheMap.get().values()) {
|
||||
if (cacheData.getTaskId() == taskId) {
|
||||
cacheDatas.add(cacheData);
|
||||
try {
|
||||
checkLocalConfig(cacheData);
|
||||
if (cacheData.isUseLocalConfigInfo()) {
|
||||
cacheData.checkListenerMd5();
|
||||
}
|
||||
} catch (Exception e) {
|
||||
log.error("NACOS-CLIENT", "get local config info error", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
public LongPullingRunnable(int taskId) {
|
||||
this.taskId = taskId;
|
||||
}
|
||||
|
||||
List<String> inInitializingCacheList = new ArrayList<String>();
|
||||
// check server config
|
||||
List<String> changedGroupKeys = checkUpdateDataIds(cacheDatas, inInitializingCacheList);
|
||||
public void run() {
|
||||
try {
|
||||
List<CacheData> cacheDatas = new ArrayList<CacheData>();
|
||||
// check failover config
|
||||
for (CacheData cacheData : cacheMap.get().values()) {
|
||||
if (cacheData.getTaskId() == taskId) {
|
||||
cacheDatas.add(cacheData);
|
||||
try {
|
||||
checkLocalConfig(cacheData);
|
||||
if (cacheData.isUseLocalConfigInfo()) {
|
||||
cacheData.checkListenerMd5();
|
||||
}
|
||||
} catch (Exception e) {
|
||||
log.error("NACOS-CLIENT", "get local config info error", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (String groupKey : changedGroupKeys) {
|
||||
String[] key = GroupKey.parseKey(groupKey);
|
||||
String dataId = key[0];
|
||||
String group = key[1];
|
||||
String tenant = null;
|
||||
if (key.length == 3) {
|
||||
tenant = key[2];
|
||||
}
|
||||
try {
|
||||
String content = getServerConfig(dataId, group, tenant, 3000L);
|
||||
CacheData cache = cacheMap.get().get(GroupKey.getKeyTenant(dataId, group, tenant));
|
||||
cache.setContent(content);
|
||||
log.info(agent.getName(), "[data-received] dataId={}, group={}, tenant={}, md5={}, content={}",
|
||||
dataId, group, tenant, cache.getMd5(), ContentUtils.truncateContent(content));
|
||||
} catch (NacosException ioe) {
|
||||
log.error(agent.getName(), "NACOS-XXXX",
|
||||
"[get-update] get changed config exception. dataId={}, group={}, tenant={}, msg={}",
|
||||
dataId, group, tenant, ioe.toString());
|
||||
}
|
||||
}
|
||||
for (CacheData cacheData : cacheDatas) {
|
||||
if (!cacheData.isInitializing() || inInitializingCacheList
|
||||
.contains(GroupKey.getKeyTenant(cacheData.dataId, cacheData.group, cacheData.tenant))) {
|
||||
cacheData.checkListenerMd5();
|
||||
cacheData.setInitializing(false);
|
||||
}
|
||||
}
|
||||
inInitializingCacheList.clear();
|
||||
} catch (Throwable e) {
|
||||
log.error("500", "longPulling error", e);
|
||||
} finally {
|
||||
executorService.execute(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
List<String> inInitializingCacheList = new ArrayList<String>();
|
||||
// check server config
|
||||
List<String> changedGroupKeys = checkUpdateDataIds(cacheDatas, inInitializingCacheList);
|
||||
|
||||
// =================
|
||||
for (String groupKey : changedGroupKeys) {
|
||||
String[] key = GroupKey.parseKey(groupKey);
|
||||
String dataId = key[0];
|
||||
String group = key[1];
|
||||
String tenant = null;
|
||||
if (key.length == 3) {
|
||||
tenant = key[2];
|
||||
}
|
||||
try {
|
||||
String content = getServerConfig(dataId, group, tenant, 3000L);
|
||||
CacheData cache = cacheMap.get().get(GroupKey.getKeyTenant(dataId, group, tenant));
|
||||
cache.setContent(content);
|
||||
log.info(agent.getName(), "[data-received] dataId={}, group={}, tenant={}, md5={}, content={}",
|
||||
dataId, group, tenant, cache.getMd5(), ContentUtils.truncateContent(content));
|
||||
} catch (NacosException ioe) {
|
||||
log.error(agent.getName(), "NACOS-XXXX",
|
||||
"[get-update] get changed config exception. dataId={}, group={}, tenant={}, msg={}",
|
||||
dataId, group, tenant, ioe.toString());
|
||||
}
|
||||
}
|
||||
for (CacheData cacheData : cacheDatas) {
|
||||
if (!cacheData.isInitializing() || inInitializingCacheList
|
||||
.contains(GroupKey.getKeyTenant(cacheData.dataId, cacheData.group, cacheData.tenant))) {
|
||||
cacheData.checkListenerMd5();
|
||||
cacheData.setInitializing(false);
|
||||
}
|
||||
}
|
||||
inInitializingCacheList.clear();
|
||||
} catch (Throwable e) {
|
||||
log.error("500", "longPulling error", e);
|
||||
} finally {
|
||||
executorService.execute(this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isHealthServer() {
|
||||
return isHealthServer;
|
||||
}
|
||||
// =================
|
||||
|
||||
private void setHealthServer(boolean isHealthServer) {
|
||||
this.isHealthServer = isHealthServer;
|
||||
}
|
||||
public boolean isHealthServer() {
|
||||
return isHealthServer;
|
||||
}
|
||||
|
||||
private void setHealthServer(boolean isHealthServer) {
|
||||
this.isHealthServer = isHealthServer;
|
||||
}
|
||||
|
||||
final ScheduledExecutorService executor;
|
||||
final ExecutorService executorService;
|
||||
/**
|
||||
* groupKey -> cacheData
|
||||
*/
|
||||
AtomicReference<Map<String, CacheData>> cacheMap = new AtomicReference<Map<String, CacheData>>(
|
||||
new HashMap<String, CacheData>());
|
||||
ServerHttpAgent agent;
|
||||
ConfigFilterChainManager configFilterChainManager;
|
||||
private boolean isHealthServer = true;
|
||||
private double currentLongingTaskCount = 0;
|
||||
|
||||
final ScheduledExecutorService executor;
|
||||
final ExecutorService executorService;
|
||||
/**
|
||||
* groupKey -> cacheData
|
||||
*/
|
||||
AtomicReference<Map<String, CacheData>> cacheMap = new AtomicReference<Map<String, CacheData>>(new HashMap<String, CacheData>());
|
||||
ServerHttpAgent agent;
|
||||
ConfigFilterChainManager configFilterChainManager;
|
||||
private boolean isHealthServer = true;
|
||||
private double currentLongingTaskCount = 0;
|
||||
|
||||
}
|
||||
|
@ -24,16 +24,14 @@ import java.util.concurrent.CopyOnWriteArrayList;
|
||||
import com.alibaba.nacos.client.config.utils.LogUtils;
|
||||
import com.alibaba.nacos.client.logger.Logger;
|
||||
|
||||
|
||||
/**
|
||||
* Event subscription and publishing tools.
|
||||
*
|
||||
* @author Nacos
|
||||
*
|
||||
* @author Nacos
|
||||
*/
|
||||
public class EventDispatcher {
|
||||
|
||||
final static public Logger log = LogUtils.logger(EventDispatcher.class);
|
||||
|
||||
final static public Logger log = LogUtils.logger(EventDispatcher.class);
|
||||
|
||||
/**
|
||||
* 添加事件监听器
|
||||
@ -55,7 +53,7 @@ public class EventDispatcher {
|
||||
// 发布该事件暗示的其他事件
|
||||
for (AbstractEvent implyEvent : abstractEvent.implyEvents()) {
|
||||
try {
|
||||
// 避免死循环
|
||||
// 避免死循环
|
||||
if (abstractEvent != implyEvent) {
|
||||
fireEvent(implyEvent);
|
||||
}
|
||||
@ -74,7 +72,7 @@ public class EventDispatcher {
|
||||
}
|
||||
|
||||
static synchronized CopyOnWriteArrayList<AbstractEventListener> getListenerList(
|
||||
Class<? extends AbstractEvent> eventType) {
|
||||
Class<? extends AbstractEvent> eventType) {
|
||||
CopyOnWriteArrayList<AbstractEventListener> listeners = LISTENER_MAP.get(eventType);
|
||||
if (null == listeners) {
|
||||
listeners = new CopyOnWriteArrayList<AbstractEventListener>();
|
||||
@ -84,8 +82,9 @@ public class EventDispatcher {
|
||||
}
|
||||
|
||||
// ========================
|
||||
|
||||
static final Map<Class<? extends AbstractEvent>, CopyOnWriteArrayList<AbstractEventListener>> LISTENER_MAP = new HashMap<Class<? extends AbstractEvent>, CopyOnWriteArrayList<AbstractEventListener>>();
|
||||
|
||||
static final Map<Class<? extends AbstractEvent>, CopyOnWriteArrayList<AbstractEventListener>> LISTENER_MAP
|
||||
= new HashMap<Class<? extends AbstractEvent>, CopyOnWriteArrayList<AbstractEventListener>>();
|
||||
|
||||
// ========================
|
||||
|
||||
@ -105,29 +104,30 @@ public class EventDispatcher {
|
||||
*/
|
||||
static public abstract class AbstractEventListener {
|
||||
public AbstractEventListener() {
|
||||
/**
|
||||
* 自动注册给EventDispatcher
|
||||
*/
|
||||
EventDispatcher.addEventListener(this);
|
||||
/**
|
||||
* 自动注册给EventDispatcher
|
||||
*/
|
||||
EventDispatcher.addEventListener(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* 感兴趣的事件列表
|
||||
*
|
||||
* @return event list
|
||||
*/
|
||||
|
||||
/**
|
||||
* 感兴趣的事件列表
|
||||
*
|
||||
* @return event list
|
||||
*/
|
||||
abstract public List<Class<? extends AbstractEvent>> interest();
|
||||
|
||||
/**
|
||||
* 处理事件
|
||||
*
|
||||
* @param abstractEvent event to do
|
||||
*/
|
||||
abstract public void onEvent(AbstractEvent abstractEvent);
|
||||
}
|
||||
|
||||
/**
|
||||
* serverList has changed
|
||||
*/
|
||||
static public class ServerlistChangeEvent extends AbstractEvent {
|
||||
}
|
||||
/**
|
||||
* serverList has changed
|
||||
*/
|
||||
static public class ServerlistChangeEvent extends AbstractEvent {
|
||||
}
|
||||
}
|
||||
|
@ -34,95 +34,87 @@ import java.util.Map;
|
||||
|
||||
/**
|
||||
* Http tool
|
||||
*
|
||||
* @author Nacos
|
||||
*
|
||||
* @author Nacos
|
||||
*/
|
||||
public class HttpSimpleClient {
|
||||
|
||||
|
||||
static public HttpResult httpGet(String url, List<String> headers, List<String> paramValues,
|
||||
String encoding, long readTimeoutMs, boolean isSSL) throws IOException{
|
||||
String encodedContent = encodingParams(paramValues, encoding);
|
||||
String encoding, long readTimeoutMs, boolean isSSL) throws IOException {
|
||||
String encodedContent = encodingParams(paramValues, encoding);
|
||||
url += (null == encodedContent) ? "" : ("?" + encodedContent);
|
||||
if (Limiter.isLimit(MD5.getInstance().getMD5String(
|
||||
new StringBuilder(url).append(encodedContent).toString()))) {
|
||||
return new HttpResult(NacosException.CLIENT_OVER_THRESHOLD,
|
||||
"More than client-side current limit threshold");
|
||||
}
|
||||
|
||||
if (Limiter.isLimit(MD5.getInstance().getMD5String(
|
||||
new StringBuilder(url).append(encodedContent).toString()))) {
|
||||
return new HttpResult(NacosException.CLIENT_OVER_THRESHOLD,
|
||||
"More than client-side current limit threshold");
|
||||
}
|
||||
|
||||
HttpURLConnection conn = null;
|
||||
|
||||
try {
|
||||
conn = (HttpURLConnection) new URL(url).openConnection();
|
||||
conn.setRequestMethod("GET");
|
||||
conn.setConnectTimeout(ParamUtil.getConnectTimeout() > 100 ? ParamUtil.getConnectTimeout() : 100);
|
||||
conn.setReadTimeout((int) readTimeoutMs);
|
||||
List<String> newHeaders = getHeaders(url, headers, paramValues);
|
||||
setHeaders(conn, newHeaders, encoding);
|
||||
|
||||
conn.connect();
|
||||
|
||||
int respCode = conn.getResponseCode();
|
||||
String resp = null;
|
||||
try {
|
||||
conn = (HttpURLConnection)new URL(url).openConnection();
|
||||
conn.setRequestMethod("GET");
|
||||
conn.setConnectTimeout(ParamUtil.getConnectTimeout() > 100 ? ParamUtil.getConnectTimeout() : 100);
|
||||
conn.setReadTimeout((int)readTimeoutMs);
|
||||
List<String> newHeaders = getHeaders(url, headers, paramValues);
|
||||
setHeaders(conn, newHeaders, encoding);
|
||||
|
||||
if (HttpURLConnection.HTTP_OK == respCode) {
|
||||
resp = IOUtils.toString(conn.getInputStream(), encoding);
|
||||
} else {
|
||||
resp = IOUtils.toString(conn.getErrorStream(), encoding);
|
||||
}
|
||||
return new HttpResult(respCode, conn.getHeaderFields(), resp);
|
||||
} finally {
|
||||
conn.connect();
|
||||
|
||||
int respCode = conn.getResponseCode();
|
||||
String resp = null;
|
||||
|
||||
if (HttpURLConnection.HTTP_OK == respCode) {
|
||||
resp = IOUtils.toString(conn.getInputStream(), encoding);
|
||||
} else {
|
||||
resp = IOUtils.toString(conn.getErrorStream(), encoding);
|
||||
}
|
||||
return new HttpResult(respCode, conn.getHeaderFields(), resp);
|
||||
} finally {
|
||||
if (conn != null) {
|
||||
conn.disconnect();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 发送GET请求。
|
||||
*/
|
||||
static public HttpResult httpGet(String url, List<String> headers, List<String> paramValues, String encoding,
|
||||
long readTimeoutMs) throws IOException {
|
||||
return httpGet(url, headers, paramValues, encoding, readTimeoutMs, false);
|
||||
}
|
||||
/**
|
||||
* 发送GET请求。
|
||||
*/
|
||||
static public HttpResult httpGet(String url, List<String> headers, List<String> paramValues, String encoding,
|
||||
long readTimeoutMs) throws IOException {
|
||||
return httpGet(url, headers, paramValues, encoding, readTimeoutMs, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* 发送POST请求。
|
||||
*
|
||||
*
|
||||
* @param url
|
||||
* @param headers
|
||||
* 请求Header,可以为null
|
||||
* @param paramValues
|
||||
* 参数,可以为null
|
||||
* @param encoding
|
||||
* URL编码使用的字符集
|
||||
* @param readTimeoutMs
|
||||
* 响应超时
|
||||
* @param isSSL
|
||||
* 是否https
|
||||
* @param headers 请求Header,可以为null
|
||||
* @param paramValues 参数,可以为null
|
||||
* @param encoding URL编码使用的字符集
|
||||
* @param readTimeoutMs 响应超时
|
||||
* @param isSSL 是否https
|
||||
* @return
|
||||
* @throws IOException
|
||||
*/
|
||||
static public HttpResult httpPost(String url, List<String> headers, List<String> paramValues,
|
||||
String encoding, long readTimeoutMs, boolean isSSL) throws IOException {
|
||||
String encodedContent = encodingParams(paramValues, encoding);
|
||||
if (Limiter.isLimit(MD5.getInstance().getMD5String(
|
||||
new StringBuilder(url).append(encodedContent).toString()))) {
|
||||
return new HttpResult(NacosException.CLIENT_OVER_THRESHOLD,
|
||||
"More than client-side current limit threshold");
|
||||
}
|
||||
String encoding, long readTimeoutMs, boolean isSSL) throws IOException {
|
||||
String encodedContent = encodingParams(paramValues, encoding);
|
||||
if (Limiter.isLimit(MD5.getInstance().getMD5String(
|
||||
new StringBuilder(url).append(encodedContent).toString()))) {
|
||||
return new HttpResult(NacosException.CLIENT_OVER_THRESHOLD,
|
||||
"More than client-side current limit threshold");
|
||||
}
|
||||
HttpURLConnection conn = null;
|
||||
try {
|
||||
conn = (HttpURLConnection) new URL(url).openConnection();
|
||||
conn = (HttpURLConnection)new URL(url).openConnection();
|
||||
conn.setRequestMethod("POST");
|
||||
conn.setConnectTimeout(ParamUtil.getConnectTimeout() > 3000 ? ParamUtil.getConnectTimeout() : 3000);
|
||||
conn.setReadTimeout((int) readTimeoutMs);
|
||||
conn.setReadTimeout((int)readTimeoutMs);
|
||||
conn.setDoOutput(true);
|
||||
conn.setDoInput(true);
|
||||
List<String> newHeaders = getHeaders(url, headers, paramValues);
|
||||
setHeaders(conn, newHeaders, encoding);
|
||||
List<String> newHeaders = getHeaders(url, headers, paramValues);
|
||||
setHeaders(conn, newHeaders, encoding);
|
||||
|
||||
conn.getOutputStream().write(encodedContent.getBytes(encoding));
|
||||
|
||||
@ -141,81 +133,75 @@ public class HttpSimpleClient {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 发送POST请求。
|
||||
*
|
||||
* @param url
|
||||
* @param headers
|
||||
* 请求Header,可以为null
|
||||
* @param paramValues
|
||||
* 参数,可以为null
|
||||
* @param encoding
|
||||
* URL编码使用的字符集
|
||||
* @param readTimeoutMs
|
||||
* 响应超时
|
||||
* @return
|
||||
* @throws IOException
|
||||
*/
|
||||
static public HttpResult httpPost(String url, List<String> headers, List<String> paramValues, String encoding,
|
||||
long readTimeoutMs) throws IOException {
|
||||
return httpPost(url, headers, paramValues, encoding, readTimeoutMs, false);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 发送POST请求。
|
||||
*
|
||||
* @param url
|
||||
* @param headers 请求Header,可以为null
|
||||
* @param paramValues 参数,可以为null
|
||||
* @param encoding URL编码使用的字符集
|
||||
* @param readTimeoutMs 响应超时
|
||||
* @return
|
||||
* @throws IOException
|
||||
*/
|
||||
static public HttpResult httpPost(String url, List<String> headers, List<String> paramValues, String encoding,
|
||||
long readTimeoutMs) throws IOException {
|
||||
return httpPost(url, headers, paramValues, encoding, readTimeoutMs, false);
|
||||
}
|
||||
|
||||
static public HttpResult httpDelete(String url, List<String> headers, List<String> paramValues,
|
||||
String encoding, long readTimeoutMs, boolean isSSL) throws IOException{
|
||||
String encodedContent = encodingParams(paramValues, encoding);
|
||||
String encoding, long readTimeoutMs, boolean isSSL) throws IOException {
|
||||
String encodedContent = encodingParams(paramValues, encoding);
|
||||
url += (null == encodedContent) ? "" : ("?" + encodedContent);
|
||||
if (Limiter.isLimit(MD5.getInstance().getMD5String(
|
||||
new StringBuilder(url).append(encodedContent).toString()))) {
|
||||
return new HttpResult(NacosException.CLIENT_OVER_THRESHOLD,
|
||||
"More than client-side current limit threshold");
|
||||
}
|
||||
|
||||
if (Limiter.isLimit(MD5.getInstance().getMD5String(
|
||||
new StringBuilder(url).append(encodedContent).toString()))) {
|
||||
return new HttpResult(NacosException.CLIENT_OVER_THRESHOLD,
|
||||
"More than client-side current limit threshold");
|
||||
}
|
||||
|
||||
HttpURLConnection conn = null;
|
||||
|
||||
try {
|
||||
conn = (HttpURLConnection) new URL(url).openConnection();
|
||||
conn.setRequestMethod("DELETE");
|
||||
conn.setConnectTimeout(ParamUtil.getConnectTimeout() > 100 ? ParamUtil.getConnectTimeout() : 100);
|
||||
conn.setReadTimeout((int) readTimeoutMs);
|
||||
List<String> newHeaders = getHeaders(url, headers, paramValues);
|
||||
setHeaders(conn, newHeaders, encoding);
|
||||
|
||||
conn.connect();
|
||||
|
||||
int respCode = conn.getResponseCode();
|
||||
String resp = null;
|
||||
try {
|
||||
conn = (HttpURLConnection)new URL(url).openConnection();
|
||||
conn.setRequestMethod("DELETE");
|
||||
conn.setConnectTimeout(ParamUtil.getConnectTimeout() > 100 ? ParamUtil.getConnectTimeout() : 100);
|
||||
conn.setReadTimeout((int)readTimeoutMs);
|
||||
List<String> newHeaders = getHeaders(url, headers, paramValues);
|
||||
setHeaders(conn, newHeaders, encoding);
|
||||
|
||||
if (HttpURLConnection.HTTP_OK == respCode) {
|
||||
resp = IOUtils.toString(conn.getInputStream(), encoding);
|
||||
} else {
|
||||
resp = IOUtils.toString(conn.getErrorStream(), encoding);
|
||||
}
|
||||
return new HttpResult(respCode, conn.getHeaderFields(), resp);
|
||||
} finally {
|
||||
conn.connect();
|
||||
|
||||
int respCode = conn.getResponseCode();
|
||||
String resp = null;
|
||||
|
||||
if (HttpURLConnection.HTTP_OK == respCode) {
|
||||
resp = IOUtils.toString(conn.getInputStream(), encoding);
|
||||
} else {
|
||||
resp = IOUtils.toString(conn.getErrorStream(), encoding);
|
||||
}
|
||||
return new HttpResult(respCode, conn.getHeaderFields(), resp);
|
||||
} finally {
|
||||
if (conn != null) {
|
||||
conn.disconnect();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static public HttpResult httpDelete(String url, List<String> headers, List<String> paramValues, String encoding,
|
||||
long readTimeoutMs) throws IOException {
|
||||
return httpGet(url, headers, paramValues, encoding, readTimeoutMs, false);
|
||||
}
|
||||
|
||||
static public HttpResult httpDelete(String url, List<String> headers, List<String> paramValues, String encoding,
|
||||
long readTimeoutMs) throws IOException {
|
||||
return httpGet(url, headers, paramValues, encoding, readTimeoutMs, false);
|
||||
}
|
||||
|
||||
static private void setHeaders(HttpURLConnection conn, List<String> headers, String encoding) {
|
||||
if (null != headers) {
|
||||
for (Iterator<String> iter = headers.iterator(); iter.hasNext();) {
|
||||
for (Iterator<String> iter = headers.iterator(); iter.hasNext(); ) {
|
||||
conn.addRequestProperty(iter.next(), iter.next());
|
||||
}
|
||||
}
|
||||
conn.addRequestProperty("Client-Version", ParamUtil.getClientVersion());
|
||||
conn.addRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=" + encoding);
|
||||
|
||||
|
||||
String ts = String.valueOf(System.currentTimeMillis());
|
||||
String token = MD5.getInstance().getMD5String(ts + ParamUtil.getAppKey());
|
||||
|
||||
@ -224,27 +210,27 @@ public class HttpSimpleClient {
|
||||
conn.addRequestProperty(Constants.CLIENT_REQUEST_TOKEN_HEADER, token);
|
||||
}
|
||||
|
||||
private static List<String> getHeaders(String url, List<String> headers, List<String> paramValues)
|
||||
throws IOException {
|
||||
List<String> newHeaders = new ArrayList<String>();
|
||||
newHeaders.add("exConfigInfo");
|
||||
newHeaders.add("true");
|
||||
newHeaders.add("RequestId");
|
||||
newHeaders.add(UuidUtil.generateUuid());
|
||||
if (headers!=null) {
|
||||
newHeaders.addAll(headers);
|
||||
}
|
||||
return newHeaders;
|
||||
}
|
||||
|
||||
private static List<String> getHeaders(String url, List<String> headers, List<String> paramValues)
|
||||
throws IOException {
|
||||
List<String> newHeaders = new ArrayList<String>();
|
||||
newHeaders.add("exConfigInfo");
|
||||
newHeaders.add("true");
|
||||
newHeaders.add("RequestId");
|
||||
newHeaders.add(UuidUtil.generateUuid());
|
||||
if (headers != null) {
|
||||
newHeaders.addAll(headers);
|
||||
}
|
||||
return newHeaders;
|
||||
}
|
||||
|
||||
static private String encodingParams(List<String> paramValues, String encoding)
|
||||
throws UnsupportedEncodingException {
|
||||
throws UnsupportedEncodingException {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
if (null == paramValues) {
|
||||
return null;
|
||||
}
|
||||
|
||||
for (Iterator<String> iter = paramValues.iterator(); iter.hasNext();) {
|
||||
|
||||
for (Iterator<String> iter = paramValues.iterator(); iter.hasNext(); ) {
|
||||
sb.append(iter.next()).append("=");
|
||||
sb.append(URLEncoder.encode(iter.next(), encoding));
|
||||
if (iter.hasNext()) {
|
||||
@ -253,23 +239,23 @@ public class HttpSimpleClient {
|
||||
}
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
|
||||
static public class HttpResult {
|
||||
final public int code;
|
||||
final public Map<String,List<String>> headers;
|
||||
final public Map<String, List<String>> headers;
|
||||
final public String content;
|
||||
|
||||
public HttpResult(int code, String content) {
|
||||
this.code = code;
|
||||
this.headers = null;
|
||||
this.content = content;
|
||||
}
|
||||
|
||||
public HttpResult(int code, Map<String, List<String>> headers, String content) {
|
||||
this.code = code;
|
||||
this.headers = headers;
|
||||
this.content = content;
|
||||
}
|
||||
public HttpResult(int code, String content) {
|
||||
this.code = code;
|
||||
this.headers = null;
|
||||
this.content = content;
|
||||
}
|
||||
|
||||
public HttpResult(int code, Map<String, List<String>> headers, String content) {
|
||||
this.code = code;
|
||||
this.headers = headers;
|
||||
this.content = content;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
@ -27,53 +27,52 @@ import com.google.common.util.concurrent.RateLimiter;
|
||||
|
||||
/**
|
||||
* Limiter
|
||||
*
|
||||
* @author Nacos
|
||||
*
|
||||
* @author Nacos
|
||||
*/
|
||||
public class Limiter {
|
||||
|
||||
static final public Logger log = LogUtils.logger(Limiter.class);
|
||||
private static int CAPACITY_SIZE = 1000;
|
||||
private static int LIMIT_TIME = 1000;
|
||||
private static Cache<String, RateLimiter> cache = CacheBuilder.newBuilder()
|
||||
.initialCapacity(CAPACITY_SIZE).expireAfterAccess(1, TimeUnit.MINUTES)
|
||||
.build();
|
||||
static final public Logger log = LogUtils.logger(Limiter.class);
|
||||
private static int CAPACITY_SIZE = 1000;
|
||||
private static int LIMIT_TIME = 1000;
|
||||
private static Cache<String, RateLimiter> cache = CacheBuilder.newBuilder()
|
||||
.initialCapacity(CAPACITY_SIZE).expireAfterAccess(1, TimeUnit.MINUTES)
|
||||
.build();
|
||||
|
||||
/**
|
||||
* qps 5
|
||||
*/
|
||||
private static final String DEFAULT_LIMIT = "5";
|
||||
private static double limit = 5;
|
||||
/**
|
||||
* qps 5
|
||||
*/
|
||||
private static final String DEFAULT_LIMIT = "5";
|
||||
private static double limit = 5;
|
||||
|
||||
static {
|
||||
try {
|
||||
String limitTimeStr = System
|
||||
.getProperty("limitTime", DEFAULT_LIMIT);
|
||||
limit = Double.parseDouble(limitTimeStr);
|
||||
log.info("limitTime:{}", limit);
|
||||
} catch (Exception e) {
|
||||
log.error("Nacos-xxx", "init limitTime fail", e);
|
||||
}
|
||||
}
|
||||
static {
|
||||
try {
|
||||
String limitTimeStr = System
|
||||
.getProperty("limitTime", DEFAULT_LIMIT);
|
||||
limit = Double.parseDouble(limitTimeStr);
|
||||
log.info("limitTime:{}", limit);
|
||||
} catch (Exception e) {
|
||||
log.error("Nacos-xxx", "init limitTime fail", e);
|
||||
}
|
||||
}
|
||||
|
||||
public static boolean isLimit(String accessKeyID) {
|
||||
RateLimiter rateLimiter = null;
|
||||
try {
|
||||
rateLimiter = cache.get(accessKeyID, new Callable<RateLimiter>() {
|
||||
@Override
|
||||
public RateLimiter call() throws Exception {
|
||||
return RateLimiter.create(limit);
|
||||
}
|
||||
});
|
||||
} catch (ExecutionException e) {
|
||||
log.error("Nacos-XXX", "create limit fail", e);
|
||||
}
|
||||
if (rateLimiter != null && !rateLimiter.tryAcquire(LIMIT_TIME, TimeUnit.MILLISECONDS)) {
|
||||
log.error("Nacos-XXX", "access_key_id:{} limited", accessKeyID);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
public static boolean isLimit(String accessKeyID) {
|
||||
RateLimiter rateLimiter = null;
|
||||
try {
|
||||
rateLimiter = cache.get(accessKeyID, new Callable<RateLimiter>() {
|
||||
@Override
|
||||
public RateLimiter call() throws Exception {
|
||||
return RateLimiter.create(limit);
|
||||
}
|
||||
});
|
||||
} catch (ExecutionException e) {
|
||||
log.error("Nacos-XXX", "create limit fail", e);
|
||||
}
|
||||
if (rateLimiter != null && !rateLimiter.tryAcquire(LIMIT_TIME, TimeUnit.MILLISECONDS)) {
|
||||
log.error("Nacos-XXX", "access_key_id:{} limited", accessKeyID);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -25,169 +25,166 @@ import java.io.FileInputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
|
||||
|
||||
/**
|
||||
* Local Disaster Recovery Directory Tool
|
||||
*
|
||||
*
|
||||
* @author Nacos
|
||||
*/
|
||||
public class LocalConfigInfoProcessor {
|
||||
|
||||
final static public Logger log = LogUtils.logger(LocalConfigInfoProcessor.class);
|
||||
|
||||
final static public Logger log = LogUtils.logger(LocalConfigInfoProcessor.class);
|
||||
|
||||
static public String getFailover(String serverName, String dataId, String group, String tenant) {
|
||||
File localPath = getFailoverFile(serverName, dataId, group, tenant);
|
||||
if (!localPath.exists() || !localPath.isFile()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
return readFile(localPath);
|
||||
} catch (IOException ioe) {
|
||||
log.error(serverName, "NACOS-XXXX","get failover error, " + localPath + ioe.toString());
|
||||
return null;
|
||||
}
|
||||
File localPath = getFailoverFile(serverName, dataId, group, tenant);
|
||||
if (!localPath.exists() || !localPath.isFile()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
return readFile(localPath);
|
||||
} catch (IOException ioe) {
|
||||
log.error(serverName, "NACOS-XXXX", "get failover error, " + localPath + ioe.toString());
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 获取本地缓存文件内容。NULL表示没有本地文件或抛出异常。
|
||||
*/
|
||||
static public String getSnapshot(String name, String dataId, String group, String tenant) {
|
||||
if (!SnapShotSwitch.getIsSnapShot()) {
|
||||
return null;
|
||||
}
|
||||
File file = getSnapshotFile(name, dataId, group, tenant);
|
||||
if (!file.exists() || !file.isFile()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
return readFile(file);
|
||||
} catch (IOException ioe) {
|
||||
log.error(name, "NACOS-XXXX","get snapshot error, " + file + ", " + ioe.toString());
|
||||
return null;
|
||||
}
|
||||
if (!SnapShotSwitch.getIsSnapShot()) {
|
||||
return null;
|
||||
}
|
||||
File file = getSnapshotFile(name, dataId, group, tenant);
|
||||
if (!file.exists() || !file.isFile()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
return readFile(file);
|
||||
} catch (IOException ioe) {
|
||||
log.error(name, "NACOS-XXXX", "get snapshot error, " + file + ", " + ioe.toString());
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
static private String readFile(File file) throws IOException {
|
||||
if (!file.exists() || !file.isFile()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (JVMUtil.isMultiInstance()) {
|
||||
return ConcurrentDiskUtil.getFileContent(file, Constants.ENCODE);
|
||||
} else {
|
||||
InputStream is = null;
|
||||
try {
|
||||
is = new FileInputStream(file);
|
||||
return IOUtils.toString(is, Constants.ENCODE);
|
||||
} finally {
|
||||
try {
|
||||
if (null != is) {
|
||||
is.close();
|
||||
}
|
||||
} catch (IOException ioe) {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
static private String readFile(File file) throws IOException {
|
||||
if (!file.exists() || !file.isFile()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (JVMUtil.isMultiInstance()) {
|
||||
return ConcurrentDiskUtil.getFileContent(file, Constants.ENCODE);
|
||||
} else {
|
||||
InputStream is = null;
|
||||
try {
|
||||
is = new FileInputStream(file);
|
||||
return IOUtils.toString(is, Constants.ENCODE);
|
||||
} finally {
|
||||
try {
|
||||
if (null != is) {
|
||||
is.close();
|
||||
}
|
||||
} catch (IOException ioe) {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static public void saveSnapshot(String envName, String dataId, String group, String tenant, String config) {
|
||||
if (!SnapShotSwitch.getIsSnapShot()) {
|
||||
return;
|
||||
}
|
||||
if (!SnapShotSwitch.getIsSnapShot()) {
|
||||
return;
|
||||
}
|
||||
File file = getSnapshotFile(envName, dataId, group, tenant);
|
||||
if (null == config) {
|
||||
try {
|
||||
IOUtils.delete(file);
|
||||
} catch (IOException ioe) {
|
||||
log.error(envName, "NACOS-XXXX","delete snapshot error, " + file + ", " + ioe.toString());
|
||||
log.error(envName, "NACOS-XXXX", "delete snapshot error, " + file + ", " + ioe.toString());
|
||||
}
|
||||
} else {
|
||||
try {
|
||||
boolean isMdOk = file.getParentFile().mkdirs();
|
||||
if (!isMdOk) {
|
||||
log.error(envName, "NACOS-XXXX", "save snapshot error");
|
||||
}
|
||||
if (JVMUtil.isMultiInstance()) {
|
||||
ConcurrentDiskUtil.writeFileContent(file, config,
|
||||
Constants.ENCODE);
|
||||
} else {
|
||||
IOUtils.writeStringToFile(file, config, Constants.ENCODE);
|
||||
}
|
||||
boolean isMdOk = file.getParentFile().mkdirs();
|
||||
if (!isMdOk) {
|
||||
log.error(envName, "NACOS-XXXX", "save snapshot error");
|
||||
}
|
||||
if (JVMUtil.isMultiInstance()) {
|
||||
ConcurrentDiskUtil.writeFileContent(file, config,
|
||||
Constants.ENCODE);
|
||||
} else {
|
||||
IOUtils.writeStringToFile(file, config, Constants.ENCODE);
|
||||
}
|
||||
} catch (IOException ioe) {
|
||||
log.error(envName, "NACOS-XXXX","save snapshot error, " + file + ", " + ioe.toString());
|
||||
log.error(envName, "NACOS-XXXX", "save snapshot error, " + file + ", " + ioe.toString());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 清除snapshot目录下所有缓存文件。
|
||||
*/
|
||||
static public void cleanAllSnapshot() {
|
||||
try {
|
||||
File rootFile = new File(LOCAL_SNAPSHOT_PATH);
|
||||
File[] files = rootFile.listFiles();
|
||||
if (files == null || files.length == 0) {
|
||||
return;
|
||||
}
|
||||
for(File file : files){
|
||||
if(file.getName().endsWith("_nacos")){
|
||||
IOUtils.cleanDirectory(file);
|
||||
}
|
||||
}
|
||||
File rootFile = new File(LOCAL_SNAPSHOT_PATH);
|
||||
File[] files = rootFile.listFiles();
|
||||
if (files == null || files.length == 0) {
|
||||
return;
|
||||
}
|
||||
for (File file : files) {
|
||||
if (file.getName().endsWith("_nacos")) {
|
||||
IOUtils.cleanDirectory(file);
|
||||
}
|
||||
}
|
||||
} catch (IOException ioe) {
|
||||
log.error("NACOS-XXXX","clean all snapshot error, " + ioe.toString(), ioe);
|
||||
log.error("NACOS-XXXX", "clean all snapshot error, " + ioe.toString(), ioe);
|
||||
}
|
||||
}
|
||||
|
||||
static public void cleanEnvSnapshot(String envName){
|
||||
File tmp = new File(LOCAL_SNAPSHOT_PATH, envName + "_nacos");
|
||||
tmp = new File(tmp, "snapshot");
|
||||
try {
|
||||
IOUtils.cleanDirectory(tmp);
|
||||
log.info("success delete " + envName + "-snapshot");
|
||||
} catch (IOException e) {
|
||||
log.info("fail delete " + envName + "-snapshot, " + e.toString());
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
static public void cleanEnvSnapshot(String envName) {
|
||||
File tmp = new File(LOCAL_SNAPSHOT_PATH, envName + "_nacos");
|
||||
tmp = new File(tmp, "snapshot");
|
||||
try {
|
||||
IOUtils.cleanDirectory(tmp);
|
||||
log.info("success delete " + envName + "-snapshot");
|
||||
} catch (IOException e) {
|
||||
log.info("fail delete " + envName + "-snapshot, " + e.toString());
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static File getFailoverFile(String serverName, String dataId, String group, String tenant) {
|
||||
File tmp = new File(LOCAL_SNAPSHOT_PATH, serverName + "_nacos");
|
||||
tmp = new File(tmp, "data");
|
||||
if (StringUtils.isBlank(tenant)) {
|
||||
tmp = new File(tmp, "config-data");
|
||||
} else
|
||||
{
|
||||
tmp = new File(tmp, "config-data-tenant");
|
||||
tmp = new File(tmp, tenant);
|
||||
}
|
||||
return new File(new File(tmp, group), dataId);
|
||||
}
|
||||
|
||||
static File getSnapshotFile(String envName, String dataId, String group, String tenant) {
|
||||
File tmp = new File(LOCAL_SNAPSHOT_PATH, envName + "_nacos");
|
||||
if (StringUtils.isBlank(tenant)) {
|
||||
tmp = new File(tmp, "snapshot");
|
||||
} else {
|
||||
tmp = new File(tmp, "snapshot-tenant");
|
||||
tmp = new File(tmp, tenant);
|
||||
}
|
||||
|
||||
File tmp = new File(LOCAL_SNAPSHOT_PATH, serverName + "_nacos");
|
||||
tmp = new File(tmp, "data");
|
||||
if (StringUtils.isBlank(tenant)) {
|
||||
tmp = new File(tmp, "config-data");
|
||||
} else {
|
||||
tmp = new File(tmp, "config-data-tenant");
|
||||
tmp = new File(tmp, tenant);
|
||||
}
|
||||
return new File(new File(tmp, group), dataId);
|
||||
}
|
||||
|
||||
|
||||
static File getSnapshotFile(String envName, String dataId, String group, String tenant) {
|
||||
File tmp = new File(LOCAL_SNAPSHOT_PATH, envName + "_nacos");
|
||||
if (StringUtils.isBlank(tenant)) {
|
||||
tmp = new File(tmp, "snapshot");
|
||||
} else {
|
||||
tmp = new File(tmp, "snapshot-tenant");
|
||||
tmp = new File(tmp, tenant);
|
||||
}
|
||||
|
||||
return new File(new File(tmp, group), dataId);
|
||||
}
|
||||
|
||||
public static final String LOCAL_FILEROOT_PATH;
|
||||
public static final String LOCAL_SNAPSHOT_PATH;
|
||||
static {
|
||||
LOCAL_FILEROOT_PATH = System.getProperty("JM.LOG.PATH", System.getProperty("user.home")) + File.separator
|
||||
+ "nacos" + File.separator + "config";
|
||||
LOCAL_SNAPSHOT_PATH = System.getProperty("JM.SNAPSHOT.PATH", System.getProperty("user.home")) + File.separator
|
||||
+ "nacos" + File.separator + "config";
|
||||
log.warn("LOCAL_SNAPSHOT_PATH:{}", LOCAL_SNAPSHOT_PATH);
|
||||
}
|
||||
|
||||
static {
|
||||
LOCAL_FILEROOT_PATH = System.getProperty("JM.LOG.PATH", System.getProperty("user.home")) + File.separator
|
||||
+ "nacos" + File.separator + "config";
|
||||
LOCAL_SNAPSHOT_PATH = System.getProperty("JM.SNAPSHOT.PATH", System.getProperty("user.home")) + File.separator
|
||||
+ "nacos" + File.separator + "config";
|
||||
log.warn("LOCAL_SNAPSHOT_PATH:{}", LOCAL_SNAPSHOT_PATH);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -41,351 +41,352 @@ import java.util.List;
|
||||
import java.util.Properties;
|
||||
|
||||
/**
|
||||
* Server Agent
|
||||
*
|
||||
* @author water.lyl
|
||||
* Server Agent
|
||||
*
|
||||
* @author water.lyl
|
||||
*/
|
||||
public class ServerHttpAgent {
|
||||
|
||||
final static public Logger log = LogUtils.logger(ServerHttpAgent.class);
|
||||
/**
|
||||
* @param path
|
||||
* 相对于web应用根,以/开头
|
||||
* @param headers
|
||||
* @param paramValues
|
||||
* @param encoding
|
||||
* @param readTimeoutMs
|
||||
* @return
|
||||
* @throws IOException
|
||||
*/
|
||||
public HttpResult httpGet(String path, List<String> headers, List<String> paramValues, String encoding,
|
||||
long readTimeoutMs) throws IOException {
|
||||
final long endTime = System.currentTimeMillis() + readTimeoutMs;
|
||||
final static public Logger log = LogUtils.logger(ServerHttpAgent.class);
|
||||
|
||||
boolean isSSL = false;
|
||||
|
||||
do {
|
||||
try {
|
||||
List<String> newHeaders = getSpasHeaders(paramValues);
|
||||
if (headers != null) {
|
||||
newHeaders.addAll(headers);
|
||||
}
|
||||
HttpResult result = HttpSimpleClient.httpGet(
|
||||
getUrl(serverListMgr.getCurrentServerAddr(), path, isSSL), newHeaders, paramValues, encoding,
|
||||
readTimeoutMs, isSSL);
|
||||
if (result.code == HttpURLConnection.HTTP_INTERNAL_ERROR
|
||||
|| result.code == HttpURLConnection.HTTP_BAD_GATEWAY
|
||||
|| result.code == HttpURLConnection.HTTP_UNAVAILABLE) {
|
||||
log.error("NACOS ConnectException", "currentServerAddr:{}. httpCode:",
|
||||
new Object[] { serverListMgr.getCurrentServerAddr(), result.code });
|
||||
} else {
|
||||
return result;
|
||||
}
|
||||
} catch (ConnectException ce) {
|
||||
log.error("NACOS ConnectException", "currentServerAddr:{}",
|
||||
new Object[] { serverListMgr.getCurrentServerAddr() });
|
||||
serverListMgr.refreshCurrentServerAddr();
|
||||
} catch (SocketTimeoutException stoe) {
|
||||
log.error("NACOS SocketTimeoutException", "currentServerAddr:{}",
|
||||
new Object[] { serverListMgr.getCurrentServerAddr()});
|
||||
serverListMgr.refreshCurrentServerAddr();
|
||||
} catch (IOException ioe) {
|
||||
log.error("NACOS IOException", "currentServerAddr:{}",
|
||||
new Object[] { serverListMgr.getCurrentServerAddr()});
|
||||
throw ioe;
|
||||
}
|
||||
} while (System.currentTimeMillis() <= endTime);
|
||||
/**
|
||||
* @param path 相对于web应用根,以/开头
|
||||
* @param headers
|
||||
* @param paramValues
|
||||
* @param encoding
|
||||
* @param readTimeoutMs
|
||||
* @return
|
||||
* @throws IOException
|
||||
*/
|
||||
public HttpResult httpGet(String path, List<String> headers, List<String> paramValues, String encoding,
|
||||
long readTimeoutMs) throws IOException {
|
||||
final long endTime = System.currentTimeMillis() + readTimeoutMs;
|
||||
|
||||
log.error("NACOS-0002",
|
||||
LoggerHelper.getErrorCodeStr("NACOS", "NACOS-0002", "环境问题", "no available server"));
|
||||
throw new ConnectException("no available server");
|
||||
}
|
||||
boolean isSSL = false;
|
||||
|
||||
public HttpResult httpPost(String path, List<String> headers, List<String> paramValues, String encoding,
|
||||
long readTimeoutMs) throws IOException {
|
||||
final long endTime = System.currentTimeMillis() + readTimeoutMs;
|
||||
boolean isSSL = false;
|
||||
do {
|
||||
try {
|
||||
List<String> newHeaders = getSpasHeaders(paramValues);
|
||||
if (headers != null) {
|
||||
newHeaders.addAll(headers);
|
||||
}
|
||||
HttpResult result = HttpSimpleClient.httpPost(
|
||||
getUrl(serverListMgr.getCurrentServerAddr(), path, isSSL), newHeaders, paramValues, encoding,
|
||||
readTimeoutMs, isSSL);
|
||||
if (result.code == HttpURLConnection.HTTP_INTERNAL_ERROR
|
||||
|| result.code == HttpURLConnection.HTTP_BAD_GATEWAY
|
||||
|| result.code == HttpURLConnection.HTTP_UNAVAILABLE) {
|
||||
log.error("NACOS ConnectException", "currentServerAddr:{}. httpCode:",
|
||||
new Object[] { serverListMgr.getCurrentServerAddr(), result.code });
|
||||
} else {
|
||||
return result;
|
||||
}
|
||||
} catch (ConnectException ce) {
|
||||
log.error("NACOS ConnectException", "currentServerAddr:{}",
|
||||
new Object[] { serverListMgr.getCurrentServerAddr()});
|
||||
serverListMgr.refreshCurrentServerAddr();
|
||||
} catch (SocketTimeoutException stoe) {
|
||||
log.error("NACOS SocketTimeoutException", "currentServerAddr:{}",
|
||||
new Object[] { serverListMgr.getCurrentServerAddr()});
|
||||
serverListMgr.refreshCurrentServerAddr();
|
||||
} catch (IOException ioe) {
|
||||
log.error("NACOS IOException", "currentServerAddr:{}",
|
||||
new Object[] { serverListMgr.getCurrentServerAddr()});
|
||||
throw ioe;
|
||||
}
|
||||
do {
|
||||
try {
|
||||
List<String> newHeaders = getSpasHeaders(paramValues);
|
||||
if (headers != null) {
|
||||
newHeaders.addAll(headers);
|
||||
}
|
||||
HttpResult result = HttpSimpleClient.httpGet(
|
||||
getUrl(serverListMgr.getCurrentServerAddr(), path, isSSL), newHeaders, paramValues, encoding,
|
||||
readTimeoutMs, isSSL);
|
||||
if (result.code == HttpURLConnection.HTTP_INTERNAL_ERROR
|
||||
|| result.code == HttpURLConnection.HTTP_BAD_GATEWAY
|
||||
|| result.code == HttpURLConnection.HTTP_UNAVAILABLE) {
|
||||
log.error("NACOS ConnectException", "currentServerAddr:{}. httpCode:",
|
||||
new Object[] {serverListMgr.getCurrentServerAddr(), result.code});
|
||||
} else {
|
||||
return result;
|
||||
}
|
||||
} catch (ConnectException ce) {
|
||||
log.error("NACOS ConnectException", "currentServerAddr:{}",
|
||||
new Object[] {serverListMgr.getCurrentServerAddr()});
|
||||
serverListMgr.refreshCurrentServerAddr();
|
||||
} catch (SocketTimeoutException stoe) {
|
||||
log.error("NACOS SocketTimeoutException", "currentServerAddr:{}",
|
||||
new Object[] {serverListMgr.getCurrentServerAddr()});
|
||||
serverListMgr.refreshCurrentServerAddr();
|
||||
} catch (IOException ioe) {
|
||||
log.error("NACOS IOException", "currentServerAddr:{}",
|
||||
new Object[] {serverListMgr.getCurrentServerAddr()});
|
||||
throw ioe;
|
||||
}
|
||||
} while (System.currentTimeMillis() <= endTime);
|
||||
|
||||
} while (System.currentTimeMillis() <= endTime);
|
||||
log.error("NACOS-0002",
|
||||
LoggerHelper.getErrorCodeStr("NACOS", "NACOS-0002", "环境问题", "no available server"));
|
||||
throw new ConnectException("no available server");
|
||||
}
|
||||
|
||||
log.error("NACOS-0002",
|
||||
LoggerHelper.getErrorCodeStr("NACOS", "NACOS-0002", "环境问题", "no available server"));
|
||||
throw new ConnectException("no available server");
|
||||
}
|
||||
|
||||
public HttpResult httpDelete(String path, List<String> headers, List<String> paramValues, String encoding,
|
||||
long readTimeoutMs) throws IOException {
|
||||
final long endTime = System.currentTimeMillis() + readTimeoutMs;
|
||||
boolean isSSL = false;
|
||||
do {
|
||||
try {
|
||||
List<String> newHeaders = getSpasHeaders(paramValues);
|
||||
if (headers != null) {
|
||||
newHeaders.addAll(headers);
|
||||
}
|
||||
HttpResult result = HttpSimpleClient.httpDelete(
|
||||
getUrl(serverListMgr.getCurrentServerAddr(), path, isSSL), newHeaders, paramValues, encoding,
|
||||
readTimeoutMs, isSSL);
|
||||
if (result.code == HttpURLConnection.HTTP_INTERNAL_ERROR
|
||||
|| result.code == HttpURLConnection.HTTP_BAD_GATEWAY
|
||||
|| result.code == HttpURLConnection.HTTP_UNAVAILABLE) {
|
||||
log.error("NACOS ConnectException", "currentServerAddr:{}. httpCode:",
|
||||
new Object[] { serverListMgr.getCurrentServerAddr(), result.code });
|
||||
} else {
|
||||
return result;
|
||||
}
|
||||
} catch (ConnectException ce) {
|
||||
log.error("NACOS ConnectException", "currentServerAddr:{}",
|
||||
new Object[] { serverListMgr.getCurrentServerAddr()});
|
||||
serverListMgr.refreshCurrentServerAddr();
|
||||
} catch (SocketTimeoutException stoe) {
|
||||
log.error("NACOS SocketTimeoutException", "currentServerAddr:{}",
|
||||
new Object[] { serverListMgr.getCurrentServerAddr()});
|
||||
serverListMgr.refreshCurrentServerAddr();
|
||||
} catch (IOException ioe) {
|
||||
log.error("NACOS IOException", "currentServerAddr:{}",
|
||||
new Object[] { serverListMgr.getCurrentServerAddr()});
|
||||
throw ioe;
|
||||
}
|
||||
|
||||
} while (System.currentTimeMillis() <= endTime);
|
||||
|
||||
log.error("NACOS-0002",
|
||||
LoggerHelper.getErrorCodeStr("NACOS", "NACOS-0002", "环境问题", "no available server"));
|
||||
throw new ConnectException("no available server");
|
||||
}
|
||||
public HttpResult httpPost(String path, List<String> headers, List<String> paramValues, String encoding,
|
||||
long readTimeoutMs) throws IOException {
|
||||
final long endTime = System.currentTimeMillis() + readTimeoutMs;
|
||||
boolean isSSL = false;
|
||||
do {
|
||||
try {
|
||||
List<String> newHeaders = getSpasHeaders(paramValues);
|
||||
if (headers != null) {
|
||||
newHeaders.addAll(headers);
|
||||
}
|
||||
HttpResult result = HttpSimpleClient.httpPost(
|
||||
getUrl(serverListMgr.getCurrentServerAddr(), path, isSSL), newHeaders, paramValues, encoding,
|
||||
readTimeoutMs, isSSL);
|
||||
if (result.code == HttpURLConnection.HTTP_INTERNAL_ERROR
|
||||
|| result.code == HttpURLConnection.HTTP_BAD_GATEWAY
|
||||
|| result.code == HttpURLConnection.HTTP_UNAVAILABLE) {
|
||||
log.error("NACOS ConnectException", "currentServerAddr:{}. httpCode:",
|
||||
new Object[] {serverListMgr.getCurrentServerAddr(), result.code});
|
||||
} else {
|
||||
return result;
|
||||
}
|
||||
} catch (ConnectException ce) {
|
||||
log.error("NACOS ConnectException", "currentServerAddr:{}",
|
||||
new Object[] {serverListMgr.getCurrentServerAddr()});
|
||||
serverListMgr.refreshCurrentServerAddr();
|
||||
} catch (SocketTimeoutException stoe) {
|
||||
log.error("NACOS SocketTimeoutException", "currentServerAddr:{}",
|
||||
new Object[] {serverListMgr.getCurrentServerAddr()});
|
||||
serverListMgr.refreshCurrentServerAddr();
|
||||
} catch (IOException ioe) {
|
||||
log.error("NACOS IOException", "currentServerAddr:{}",
|
||||
new Object[] {serverListMgr.getCurrentServerAddr()});
|
||||
throw ioe;
|
||||
}
|
||||
|
||||
private String getUrl(String serverAddr, String relativePath, boolean isSSL) {
|
||||
String httpPrefix = "http://";
|
||||
if (isSSL) {
|
||||
httpPrefix = "https://";
|
||||
}
|
||||
return httpPrefix + serverAddr + "/" + serverListMgr.getContentPath() + relativePath;
|
||||
}
|
||||
} while (System.currentTimeMillis() <= endTime);
|
||||
|
||||
public static String getAppname() {
|
||||
return ParamUtil.getAppName();
|
||||
}
|
||||
log.error("NACOS-0002",
|
||||
LoggerHelper.getErrorCodeStr("NACOS", "NACOS-0002", "环境问题", "no available server"));
|
||||
throw new ConnectException("no available server");
|
||||
}
|
||||
|
||||
public ServerHttpAgent(ServerListManager mgr) {
|
||||
serverListMgr = mgr;
|
||||
}
|
||||
|
||||
public ServerHttpAgent(ServerListManager mgr, Properties properties) {
|
||||
serverListMgr = mgr;
|
||||
String ak = properties.getProperty(PropertyKeyConst.ACCESS_KEY);
|
||||
if (StringUtils.isBlank(ak)) {
|
||||
accessKey = SpasAdapter.getAk();
|
||||
} else {
|
||||
accessKey = ak;
|
||||
}
|
||||
public HttpResult httpDelete(String path, List<String> headers, List<String> paramValues, String encoding,
|
||||
long readTimeoutMs) throws IOException {
|
||||
final long endTime = System.currentTimeMillis() + readTimeoutMs;
|
||||
boolean isSSL = false;
|
||||
do {
|
||||
try {
|
||||
List<String> newHeaders = getSpasHeaders(paramValues);
|
||||
if (headers != null) {
|
||||
newHeaders.addAll(headers);
|
||||
}
|
||||
HttpResult result = HttpSimpleClient.httpDelete(
|
||||
getUrl(serverListMgr.getCurrentServerAddr(), path, isSSL), newHeaders, paramValues, encoding,
|
||||
readTimeoutMs, isSSL);
|
||||
if (result.code == HttpURLConnection.HTTP_INTERNAL_ERROR
|
||||
|| result.code == HttpURLConnection.HTTP_BAD_GATEWAY
|
||||
|| result.code == HttpURLConnection.HTTP_UNAVAILABLE) {
|
||||
log.error("NACOS ConnectException", "currentServerAddr:{}. httpCode:",
|
||||
new Object[] {serverListMgr.getCurrentServerAddr(), result.code});
|
||||
} else {
|
||||
return result;
|
||||
}
|
||||
} catch (ConnectException ce) {
|
||||
log.error("NACOS ConnectException", "currentServerAddr:{}",
|
||||
new Object[] {serverListMgr.getCurrentServerAddr()});
|
||||
serverListMgr.refreshCurrentServerAddr();
|
||||
} catch (SocketTimeoutException stoe) {
|
||||
log.error("NACOS SocketTimeoutException", "currentServerAddr:{}",
|
||||
new Object[] {serverListMgr.getCurrentServerAddr()});
|
||||
serverListMgr.refreshCurrentServerAddr();
|
||||
} catch (IOException ioe) {
|
||||
log.error("NACOS IOException", "currentServerAddr:{}",
|
||||
new Object[] {serverListMgr.getCurrentServerAddr()});
|
||||
throw ioe;
|
||||
}
|
||||
|
||||
String sk = properties.getProperty(PropertyKeyConst.SECRET_KEY);
|
||||
if (StringUtils.isBlank(sk)) {
|
||||
secretKey = SpasAdapter.getSk();
|
||||
} else {
|
||||
secretKey = sk;
|
||||
}
|
||||
}
|
||||
|
||||
public ServerHttpAgent(Properties properties) throws NacosException {
|
||||
String encodeTmp = properties.getProperty(PropertyKeyConst.ENCODE);
|
||||
if (StringUtils.isBlank(encodeTmp)) {
|
||||
encode = Constants.ENCODE;
|
||||
} else {
|
||||
encode = encodeTmp.trim();
|
||||
}
|
||||
serverListMgr = new ServerListManager(properties);
|
||||
String ak = properties.getProperty(PropertyKeyConst.ACCESS_KEY);
|
||||
if (StringUtils.isBlank(ak)) {
|
||||
accessKey = SpasAdapter.getAk();
|
||||
} else {
|
||||
accessKey = ak;
|
||||
}
|
||||
|
||||
String sk = properties.getProperty(PropertyKeyConst.SECRET_KEY);
|
||||
if (StringUtils.isBlank(sk)) {
|
||||
secretKey = SpasAdapter.getSk();
|
||||
} else {
|
||||
secretKey = sk;
|
||||
}
|
||||
}
|
||||
} while (System.currentTimeMillis() <= endTime);
|
||||
|
||||
public synchronized void start() throws NacosException {
|
||||
serverListMgr.start();
|
||||
}
|
||||
|
||||
private List<String> getSpasHeaders(List<String> paramValues) throws IOException {
|
||||
List<String> newHeaders = new ArrayList<String>();
|
||||
// STS 临时凭证鉴权的优先级高于 AK/SK 鉴权
|
||||
if (STSConfig.getInstance().isSTSOn()) {
|
||||
STSCredential sTSCredential = getSTSCredential();
|
||||
accessKey = sTSCredential.accessKeyId;
|
||||
secretKey = sTSCredential.accessKeySecret;
|
||||
newHeaders.add("Spas-SecurityToken");
|
||||
newHeaders.add(sTSCredential.securityToken);
|
||||
}
|
||||
log.error("NACOS-0002",
|
||||
LoggerHelper.getErrorCodeStr("NACOS", "NACOS-0002", "环境问题", "no available server"));
|
||||
throw new ConnectException("no available server");
|
||||
}
|
||||
|
||||
if (StringUtils.isNotEmpty(accessKey) && StringUtils.isNotEmpty(secretKey)) {
|
||||
newHeaders.add("Spas-AccessKey");
|
||||
newHeaders.add(accessKey);
|
||||
List<String> signHeaders = SpasAdapter.getSignHeaders(paramValues, secretKey);
|
||||
if (signHeaders != null) {
|
||||
newHeaders.addAll(signHeaders);
|
||||
}
|
||||
}
|
||||
return newHeaders;
|
||||
}
|
||||
private String getUrl(String serverAddr, String relativePath, boolean isSSL) {
|
||||
String httpPrefix = "http://";
|
||||
if (isSSL) {
|
||||
httpPrefix = "https://";
|
||||
}
|
||||
return httpPrefix + serverAddr + "/" + serverListMgr.getContentPath() + relativePath;
|
||||
}
|
||||
|
||||
private STSCredential getSTSCredential() throws IOException {
|
||||
boolean cacheSecurityCredentials = STSConfig.getInstance().isCacheSecurityCredentials();
|
||||
if (cacheSecurityCredentials && sTSCredential != null) {
|
||||
long currentTime = System.currentTimeMillis();
|
||||
long expirationTime = sTSCredential.expiration.getTime();
|
||||
int timeToRefreshInMillisecond = STSConfig.getInstance().getTimeToRefreshInMillisecond();
|
||||
if (expirationTime - currentTime > timeToRefreshInMillisecond) {
|
||||
return sTSCredential;
|
||||
}
|
||||
}
|
||||
String stsResponse = getSTSResponse();
|
||||
STSCredential stsCredentialTmp = (STSCredential)JSONUtils.deserializeObject(stsResponse,
|
||||
new TypeReference<STSCredential>() {});
|
||||
sTSCredential = stsCredentialTmp;
|
||||
log.info("getSTSCredential", "code:{}, accessKeyId:{}, lastUpdated:{}, expiration:{}", sTSCredential.getCode(),
|
||||
sTSCredential.getAccessKeyId(), sTSCredential.getLastUpdated(), sTSCredential.getExpiration());
|
||||
return sTSCredential;
|
||||
}
|
||||
public static String getAppname() {
|
||||
return ParamUtil.getAppName();
|
||||
}
|
||||
|
||||
private static String getSTSResponse() throws IOException {
|
||||
String securityCredentials = STSConfig.getInstance().getSecurityCredentials();
|
||||
if (securityCredentials != null) {
|
||||
return securityCredentials;
|
||||
}
|
||||
String securityCredentialsUrl = STSConfig.getInstance().getSecurityCredentialsUrl();
|
||||
HttpURLConnection conn = null;
|
||||
int respCode;
|
||||
String response;
|
||||
try {
|
||||
conn = (HttpURLConnection)new URL(securityCredentialsUrl).openConnection();
|
||||
conn.setRequestMethod("GET");
|
||||
conn.setConnectTimeout(ParamUtil.getConnectTimeout() > 100 ? ParamUtil.getConnectTimeout() : 100);
|
||||
conn.setReadTimeout(1000);
|
||||
conn.connect();
|
||||
respCode = conn.getResponseCode();
|
||||
if (HttpURLConnection.HTTP_OK == respCode) {
|
||||
response = IOUtils.toString(conn.getInputStream(), Constants.ENCODE);
|
||||
} else {
|
||||
response = IOUtils.toString(conn.getErrorStream(), Constants.ENCODE);
|
||||
}
|
||||
} catch (IOException e) {
|
||||
log.error("500", "can not get security credentials", e);
|
||||
throw e;
|
||||
} finally {
|
||||
if (null != conn) {
|
||||
conn.disconnect();
|
||||
}
|
||||
}
|
||||
if (HttpURLConnection.HTTP_OK == respCode) {
|
||||
return response;
|
||||
}
|
||||
log.error(respCode + "", "can not get security credentials, securityCredentialsUrl:{}, response:{}",
|
||||
new Object[] {securityCredentialsUrl, response});
|
||||
throw new IOException("can not get security credentials, responseCode: " + respCode + ", response: " + response);
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return serverListMgr.getName();
|
||||
}
|
||||
public ServerHttpAgent(ServerListManager mgr) {
|
||||
serverListMgr = mgr;
|
||||
}
|
||||
|
||||
public String getNamespace() {
|
||||
return serverListMgr.getNamespace();
|
||||
}
|
||||
public String getTenant() {
|
||||
return serverListMgr.getTenant();
|
||||
}
|
||||
public ServerHttpAgent(ServerListManager mgr, Properties properties) {
|
||||
serverListMgr = mgr;
|
||||
String ak = properties.getProperty(PropertyKeyConst.ACCESS_KEY);
|
||||
if (StringUtils.isBlank(ak)) {
|
||||
accessKey = SpasAdapter.getAk();
|
||||
} else {
|
||||
accessKey = ak;
|
||||
}
|
||||
|
||||
public String getEncode() {
|
||||
return encode;
|
||||
}
|
||||
String sk = properties.getProperty(PropertyKeyConst.SECRET_KEY);
|
||||
if (StringUtils.isBlank(sk)) {
|
||||
secretKey = SpasAdapter.getSk();
|
||||
} else {
|
||||
secretKey = sk;
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings("PMD.ClassNamingShouldBeCamelRule")
|
||||
private static class STSCredential {
|
||||
@JsonProperty(value = "AccessKeyId")
|
||||
private String accessKeyId;
|
||||
@JsonProperty(value = "AccessKeySecret")
|
||||
private String accessKeySecret;
|
||||
@JsonProperty(value = "Expiration")
|
||||
private Date expiration;
|
||||
@JsonProperty(value = "SecurityToken")
|
||||
private String securityToken;
|
||||
@JsonProperty(value = "LastUpdated")
|
||||
private Date lastUpdated;
|
||||
@JsonProperty(value = "Code")
|
||||
private String code;
|
||||
public ServerHttpAgent(Properties properties) throws NacosException {
|
||||
String encodeTmp = properties.getProperty(PropertyKeyConst.ENCODE);
|
||||
if (StringUtils.isBlank(encodeTmp)) {
|
||||
encode = Constants.ENCODE;
|
||||
} else {
|
||||
encode = encodeTmp.trim();
|
||||
}
|
||||
serverListMgr = new ServerListManager(properties);
|
||||
String ak = properties.getProperty(PropertyKeyConst.ACCESS_KEY);
|
||||
if (StringUtils.isBlank(ak)) {
|
||||
accessKey = SpasAdapter.getAk();
|
||||
} else {
|
||||
accessKey = ak;
|
||||
}
|
||||
|
||||
public String getAccessKeyId() {
|
||||
return accessKeyId;
|
||||
}
|
||||
String sk = properties.getProperty(PropertyKeyConst.SECRET_KEY);
|
||||
if (StringUtils.isBlank(sk)) {
|
||||
secretKey = SpasAdapter.getSk();
|
||||
} else {
|
||||
secretKey = sk;
|
||||
}
|
||||
}
|
||||
|
||||
public Date getExpiration() {
|
||||
return expiration;
|
||||
}
|
||||
public synchronized void start() throws NacosException {
|
||||
serverListMgr.start();
|
||||
}
|
||||
|
||||
public Date getLastUpdated() {
|
||||
return lastUpdated;
|
||||
}
|
||||
private List<String> getSpasHeaders(List<String> paramValues) throws IOException {
|
||||
List<String> newHeaders = new ArrayList<String>();
|
||||
// STS 临时凭证鉴权的优先级高于 AK/SK 鉴权
|
||||
if (STSConfig.getInstance().isSTSOn()) {
|
||||
STSCredential sTSCredential = getSTSCredential();
|
||||
accessKey = sTSCredential.accessKeyId;
|
||||
secretKey = sTSCredential.accessKeySecret;
|
||||
newHeaders.add("Spas-SecurityToken");
|
||||
newHeaders.add(sTSCredential.securityToken);
|
||||
}
|
||||
|
||||
public String getCode() {
|
||||
return code;
|
||||
}
|
||||
if (StringUtils.isNotEmpty(accessKey) && StringUtils.isNotEmpty(secretKey)) {
|
||||
newHeaders.add("Spas-AccessKey");
|
||||
newHeaders.add(accessKey);
|
||||
List<String> signHeaders = SpasAdapter.getSignHeaders(paramValues, secretKey);
|
||||
if (signHeaders != null) {
|
||||
newHeaders.addAll(signHeaders);
|
||||
}
|
||||
}
|
||||
return newHeaders;
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return "STSCredential{" +
|
||||
"accessKeyId='" + accessKeyId + '\'' +
|
||||
", accessKeySecret='" + accessKeySecret + '\'' +
|
||||
", expiration=" + expiration +
|
||||
", securityToken='" + securityToken + '\'' +
|
||||
", lastUpdated=" + lastUpdated +
|
||||
", code='" + code + '\'' +
|
||||
'}';
|
||||
}
|
||||
}
|
||||
|
||||
private String accessKey;
|
||||
private String secretKey;
|
||||
private String encode;
|
||||
private volatile STSCredential sTSCredential;
|
||||
final ServerListManager serverListMgr;
|
||||
private STSCredential getSTSCredential() throws IOException {
|
||||
boolean cacheSecurityCredentials = STSConfig.getInstance().isCacheSecurityCredentials();
|
||||
if (cacheSecurityCredentials && sTSCredential != null) {
|
||||
long currentTime = System.currentTimeMillis();
|
||||
long expirationTime = sTSCredential.expiration.getTime();
|
||||
int timeToRefreshInMillisecond = STSConfig.getInstance().getTimeToRefreshInMillisecond();
|
||||
if (expirationTime - currentTime > timeToRefreshInMillisecond) {
|
||||
return sTSCredential;
|
||||
}
|
||||
}
|
||||
String stsResponse = getSTSResponse();
|
||||
STSCredential stsCredentialTmp = (STSCredential)JSONUtils.deserializeObject(stsResponse,
|
||||
new TypeReference<STSCredential>() {});
|
||||
sTSCredential = stsCredentialTmp;
|
||||
log.info("getSTSCredential", "code:{}, accessKeyId:{}, lastUpdated:{}, expiration:{}", sTSCredential.getCode(),
|
||||
sTSCredential.getAccessKeyId(), sTSCredential.getLastUpdated(), sTSCredential.getExpiration());
|
||||
return sTSCredential;
|
||||
}
|
||||
|
||||
private static String getSTSResponse() throws IOException {
|
||||
String securityCredentials = STSConfig.getInstance().getSecurityCredentials();
|
||||
if (securityCredentials != null) {
|
||||
return securityCredentials;
|
||||
}
|
||||
String securityCredentialsUrl = STSConfig.getInstance().getSecurityCredentialsUrl();
|
||||
HttpURLConnection conn = null;
|
||||
int respCode;
|
||||
String response;
|
||||
try {
|
||||
conn = (HttpURLConnection)new URL(securityCredentialsUrl).openConnection();
|
||||
conn.setRequestMethod("GET");
|
||||
conn.setConnectTimeout(ParamUtil.getConnectTimeout() > 100 ? ParamUtil.getConnectTimeout() : 100);
|
||||
conn.setReadTimeout(1000);
|
||||
conn.connect();
|
||||
respCode = conn.getResponseCode();
|
||||
if (HttpURLConnection.HTTP_OK == respCode) {
|
||||
response = IOUtils.toString(conn.getInputStream(), Constants.ENCODE);
|
||||
} else {
|
||||
response = IOUtils.toString(conn.getErrorStream(), Constants.ENCODE);
|
||||
}
|
||||
} catch (IOException e) {
|
||||
log.error("500", "can not get security credentials", e);
|
||||
throw e;
|
||||
} finally {
|
||||
if (null != conn) {
|
||||
conn.disconnect();
|
||||
}
|
||||
}
|
||||
if (HttpURLConnection.HTTP_OK == respCode) {
|
||||
return response;
|
||||
}
|
||||
log.error(respCode + "", "can not get security credentials, securityCredentialsUrl:{}, response:{}",
|
||||
new Object[] {securityCredentialsUrl, response});
|
||||
throw new IOException(
|
||||
"can not get security credentials, responseCode: " + respCode + ", response: " + response);
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return serverListMgr.getName();
|
||||
}
|
||||
|
||||
public String getNamespace() {
|
||||
return serverListMgr.getNamespace();
|
||||
}
|
||||
|
||||
public String getTenant() {
|
||||
return serverListMgr.getTenant();
|
||||
}
|
||||
|
||||
public String getEncode() {
|
||||
return encode;
|
||||
}
|
||||
|
||||
@SuppressWarnings("PMD.ClassNamingShouldBeCamelRule")
|
||||
private static class STSCredential {
|
||||
@JsonProperty(value = "AccessKeyId")
|
||||
private String accessKeyId;
|
||||
@JsonProperty(value = "AccessKeySecret")
|
||||
private String accessKeySecret;
|
||||
@JsonProperty(value = "Expiration")
|
||||
private Date expiration;
|
||||
@JsonProperty(value = "SecurityToken")
|
||||
private String securityToken;
|
||||
@JsonProperty(value = "LastUpdated")
|
||||
private Date lastUpdated;
|
||||
@JsonProperty(value = "Code")
|
||||
private String code;
|
||||
|
||||
public String getAccessKeyId() {
|
||||
return accessKeyId;
|
||||
}
|
||||
|
||||
public Date getExpiration() {
|
||||
return expiration;
|
||||
}
|
||||
|
||||
public Date getLastUpdated() {
|
||||
return lastUpdated;
|
||||
}
|
||||
|
||||
public String getCode() {
|
||||
return code;
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return "STSCredential{" +
|
||||
"accessKeyId='" + accessKeyId + '\'' +
|
||||
", accessKeySecret='" + accessKeySecret + '\'' +
|
||||
", expiration=" + expiration +
|
||||
", securityToken='" + securityToken + '\'' +
|
||||
", lastUpdated=" + lastUpdated +
|
||||
", code='" + code + '\'' +
|
||||
'}';
|
||||
}
|
||||
}
|
||||
|
||||
private String accessKey;
|
||||
private String secretKey;
|
||||
private String encode;
|
||||
private volatile STSCredential sTSCredential;
|
||||
final ServerListManager serverListMgr;
|
||||
|
||||
}
|
||||
|
@ -40,212 +40,213 @@ import com.alibaba.nacos.client.utils.StringUtils;
|
||||
|
||||
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
|
||||
|
||||
|
||||
/**
|
||||
* Serverlist Manager
|
||||
*
|
||||
*
|
||||
* @author Nacos
|
||||
*/
|
||||
public class ServerListManager {
|
||||
|
||||
final static public Logger log = LogUtils.logger(ServerListManager.class);
|
||||
public ServerListManager() {
|
||||
isFixed = false;
|
||||
isStarted = false;
|
||||
name = DEFAULT_NAME;
|
||||
}
|
||||
|
||||
public ServerListManager(List<String> fixed) {
|
||||
this(fixed, null);
|
||||
}
|
||||
|
||||
public ServerListManager(List<String> fixed, String namespace) {
|
||||
isFixed = true;
|
||||
isStarted = true;
|
||||
List<String> serverAddrs = new ArrayList<String>();
|
||||
for (String serverAddr : fixed) {
|
||||
String[] serverAddrArr = serverAddr.split(":");
|
||||
if (serverAddrArr.length == 1) {
|
||||
serverAddrs.add(serverAddrArr[0] + ":" + ParamUtil.getDefaultServerPort());
|
||||
} else {
|
||||
serverAddrs.add(serverAddr);
|
||||
}
|
||||
}
|
||||
serverUrls = new ArrayList<String>(serverAddrs);
|
||||
if (StringUtils.isBlank(namespace)) {
|
||||
name = FIXED_NAME + "-" + getFixedNameSuffix(serverAddrs.toArray(new String[serverAddrs.size()]));
|
||||
} else {
|
||||
this.namespace = namespace;
|
||||
name = FIXED_NAME + "-" + getFixedNameSuffix(serverAddrs.toArray(new String[serverAddrs.size()])) + "-"
|
||||
+ namespace;
|
||||
}
|
||||
}
|
||||
final static public Logger log = LogUtils.logger(ServerListManager.class);
|
||||
|
||||
public ServerListManager(String host, int port) {
|
||||
isFixed = false;
|
||||
isStarted = false;
|
||||
name = CUSTOM_NAME + "-" + host + "-" + port;
|
||||
addressServerUrl = String.format("http://%s:%d/%s/%s", host, port, contentPath, serverListName);
|
||||
}
|
||||
public ServerListManager() {
|
||||
isFixed = false;
|
||||
isStarted = false;
|
||||
name = DEFAULT_NAME;
|
||||
}
|
||||
|
||||
public ServerListManager(String endpoint) throws NacosException {
|
||||
this(endpoint, null);
|
||||
}
|
||||
public ServerListManager(List<String> fixed) {
|
||||
this(fixed, null);
|
||||
}
|
||||
|
||||
public ServerListManager(List<String> fixed, String namespace) {
|
||||
isFixed = true;
|
||||
isStarted = true;
|
||||
List<String> serverAddrs = new ArrayList<String>();
|
||||
for (String serverAddr : fixed) {
|
||||
String[] serverAddrArr = serverAddr.split(":");
|
||||
if (serverAddrArr.length == 1) {
|
||||
serverAddrs.add(serverAddrArr[0] + ":" + ParamUtil.getDefaultServerPort());
|
||||
} else {
|
||||
serverAddrs.add(serverAddr);
|
||||
}
|
||||
}
|
||||
serverUrls = new ArrayList<String>(serverAddrs);
|
||||
if (StringUtils.isBlank(namespace)) {
|
||||
name = FIXED_NAME + "-" + getFixedNameSuffix(serverAddrs.toArray(new String[serverAddrs.size()]));
|
||||
} else {
|
||||
this.namespace = namespace;
|
||||
name = FIXED_NAME + "-" + getFixedNameSuffix(serverAddrs.toArray(new String[serverAddrs.size()])) + "-"
|
||||
+ namespace;
|
||||
}
|
||||
}
|
||||
|
||||
public ServerListManager(String host, int port) {
|
||||
isFixed = false;
|
||||
isStarted = false;
|
||||
name = CUSTOM_NAME + "-" + host + "-" + port;
|
||||
addressServerUrl = String.format("http://%s:%d/%s/%s", host, port, contentPath, serverListName);
|
||||
}
|
||||
|
||||
public ServerListManager(String endpoint) throws NacosException {
|
||||
this(endpoint, null);
|
||||
}
|
||||
|
||||
public ServerListManager(String endpoint, String namespace) throws NacosException {
|
||||
isFixed = false;
|
||||
isStarted = false;
|
||||
if (StringUtils.isBlank(endpoint)) {
|
||||
throw new NacosException(NacosException.CLIENT_INVALID_PARAM, "endpoint is blank");
|
||||
}
|
||||
if (StringUtils.isBlank(namespace)) {
|
||||
name = endpoint;
|
||||
addressServerUrl = String.format("http://%s:%d/%s/%s", endpoint, endpointPort, contentPath,
|
||||
serverListName);
|
||||
} else {
|
||||
if (StringUtils.isBlank(endpoint)) {
|
||||
throw new NacosException(NacosException.CLIENT_INVALID_PARAM, "endpoint is blank");
|
||||
}
|
||||
name = endpoint + "-" + namespace;
|
||||
this.namespace = namespace;
|
||||
this.tenant = namespace;
|
||||
addressServerUrl = String.format("http://%s:%d/%s/%s?namespace=%s", endpoint, endpointPort, contentPath,
|
||||
serverListName, namespace);
|
||||
}
|
||||
}
|
||||
|
||||
public ServerListManager(Properties properties) throws NacosException {
|
||||
isStarted = false;
|
||||
String serverAddrsStr = properties.getProperty(PropertyKeyConst.SERVER_ADDR);
|
||||
String namespace = properties.getProperty(PropertyKeyConst.NAMESPACE);
|
||||
initParam(properties);
|
||||
if (StringUtils.isNotEmpty(serverAddrsStr)) {
|
||||
isFixed = true;
|
||||
List<String> serverAddrs = new ArrayList<String>();
|
||||
String[] serverAddrsArr = serverAddrsStr.split(",");
|
||||
for (String serverAddr : serverAddrsArr) {
|
||||
String[] serverAddrArr = serverAddr.split(":");
|
||||
if (serverAddrArr.length == 1) {
|
||||
serverAddrs.add(serverAddrArr[0] + ":" + ParamUtil.getDefaultServerPort());
|
||||
} else {
|
||||
serverAddrs.add(serverAddr);
|
||||
}
|
||||
}
|
||||
serverUrls = serverAddrs;
|
||||
if (StringUtils.isBlank(namespace)) {
|
||||
name = FIXED_NAME + "-" + getFixedNameSuffix(serverUrls.toArray(new String[serverUrls.size()]));
|
||||
} else {
|
||||
this.namespace = namespace;
|
||||
this.tenant = namespace;
|
||||
name = FIXED_NAME + "-" + getFixedNameSuffix(serverUrls.toArray(new String[serverUrls.size()])) + "-"
|
||||
+ namespace;
|
||||
}
|
||||
} else {
|
||||
if (StringUtils.isBlank(endpoint)) {
|
||||
throw new NacosException(NacosException.CLIENT_INVALID_PARAM, "endpoint is blank");
|
||||
}
|
||||
isFixed = false;
|
||||
if (StringUtils.isBlank(namespace)) {
|
||||
name = endpoint;
|
||||
addressServerUrl = String.format("http://%s:%d/%s/%s", endpoint, endpointPort, contentPath,
|
||||
serverListName);
|
||||
} else {
|
||||
this.namespace = namespace;
|
||||
this.tenant = namespace;
|
||||
name = endpoint + "-" + namespace;
|
||||
addressServerUrl = String.format("http://%s:%d/%s/%s?namespace=%s", endpoint, endpointPort,
|
||||
contentPath, serverListName, namespace);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void initParam(Properties properties) {
|
||||
String endpointTmp = properties.getProperty(PropertyKeyConst.ENDPOINT);
|
||||
if (!StringUtils.isBlank(endpointTmp)) {
|
||||
endpoint = endpointTmp;
|
||||
}
|
||||
String contentPathTmp = properties.getProperty(PropertyKeyConst.CONTEXT_PATH);
|
||||
if (!StringUtils.isBlank(contentPathTmp)) {
|
||||
contentPath = contentPathTmp;
|
||||
}
|
||||
String serverListNameTmp = properties.getProperty(PropertyKeyConst.CLUSTER_NAME);
|
||||
if (!StringUtils.isBlank(serverListNameTmp)) {
|
||||
serverListName = serverListNameTmp;
|
||||
}
|
||||
}
|
||||
|
||||
public ServerListManager(String endpoint, String namespace) throws NacosException {
|
||||
isFixed = false;
|
||||
isStarted = false;
|
||||
if (StringUtils.isBlank(endpoint)) {
|
||||
throw new NacosException(NacosException.CLIENT_INVALID_PARAM, "endpoint is blank");
|
||||
}
|
||||
if (StringUtils.isBlank(namespace)) {
|
||||
name = endpoint;
|
||||
addressServerUrl = String.format("http://%s:%d/%s/%s", endpoint, endpointPort, contentPath,
|
||||
serverListName);
|
||||
} else {
|
||||
if (StringUtils.isBlank(endpoint)) {
|
||||
throw new NacosException(NacosException.CLIENT_INVALID_PARAM, "endpoint is blank");
|
||||
}
|
||||
name = endpoint + "-" + namespace;
|
||||
this.namespace = namespace;
|
||||
this.tenant = namespace;
|
||||
addressServerUrl = String.format("http://%s:%d/%s/%s?namespace=%s", endpoint, endpointPort, contentPath,
|
||||
serverListName, namespace);
|
||||
}
|
||||
}
|
||||
|
||||
public ServerListManager(Properties properties) throws NacosException {
|
||||
isStarted = false;
|
||||
String serverAddrsStr = properties.getProperty(PropertyKeyConst.SERVER_ADDR);
|
||||
String namespace = properties.getProperty(PropertyKeyConst.NAMESPACE);
|
||||
initParam(properties);
|
||||
if (StringUtils.isNotEmpty(serverAddrsStr)) {
|
||||
isFixed = true;
|
||||
List<String> serverAddrs = new ArrayList<String>();
|
||||
String[] serverAddrsArr = serverAddrsStr.split(",");
|
||||
for (String serverAddr : serverAddrsArr) {
|
||||
String[] serverAddrArr = serverAddr.split(":");
|
||||
if (serverAddrArr.length == 1) {
|
||||
serverAddrs.add(serverAddrArr[0] + ":" + ParamUtil.getDefaultServerPort());
|
||||
} else {
|
||||
serverAddrs.add(serverAddr);
|
||||
}
|
||||
}
|
||||
serverUrls = serverAddrs;
|
||||
if (StringUtils.isBlank(namespace)) {
|
||||
name = FIXED_NAME + "-" + getFixedNameSuffix(serverUrls.toArray(new String[serverUrls.size()]));
|
||||
} else {
|
||||
this.namespace = namespace;
|
||||
this.tenant = namespace;
|
||||
name = FIXED_NAME + "-" + getFixedNameSuffix(serverUrls.toArray(new String[serverUrls.size()])) + "-"
|
||||
+ namespace;
|
||||
}
|
||||
} else {
|
||||
if (StringUtils.isBlank(endpoint)) {
|
||||
throw new NacosException(NacosException.CLIENT_INVALID_PARAM, "endpoint is blank");
|
||||
}
|
||||
isFixed = false;
|
||||
if (StringUtils.isBlank(namespace)) {
|
||||
name = endpoint;
|
||||
addressServerUrl = String.format("http://%s:%d/%s/%s", endpoint, endpointPort, contentPath,
|
||||
serverListName);
|
||||
} else {
|
||||
this.namespace = namespace;
|
||||
this.tenant = namespace;
|
||||
name = endpoint + "-" + namespace;
|
||||
addressServerUrl = String.format("http://%s:%d/%s/%s?namespace=%s", endpoint, endpointPort,
|
||||
contentPath, serverListName, namespace);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void initParam(Properties properties) {
|
||||
String endpointTmp = properties.getProperty(PropertyKeyConst.ENDPOINT);
|
||||
if (!StringUtils.isBlank(endpointTmp)) {
|
||||
endpoint = endpointTmp;
|
||||
}
|
||||
String contentPathTmp = properties.getProperty(PropertyKeyConst.CONTEXT_PATH);
|
||||
if (!StringUtils.isBlank(contentPathTmp)) {
|
||||
contentPath = contentPathTmp;
|
||||
}
|
||||
String serverListNameTmp = properties.getProperty(PropertyKeyConst.CLUSTER_NAME);
|
||||
if (!StringUtils.isBlank(serverListNameTmp)) {
|
||||
serverListName = serverListNameTmp;
|
||||
}
|
||||
}
|
||||
|
||||
public synchronized void start() throws NacosException {
|
||||
|
||||
|
||||
if (isStarted || isFixed) {
|
||||
return;
|
||||
}
|
||||
|
||||
GetServerListTask getServersTask = new GetServerListTask(addressServerUrl);
|
||||
for (int i = 0; i < initServerlistRetryTimes && serverUrls.isEmpty(); ++i) {
|
||||
getServersTask.run();
|
||||
try {
|
||||
this.wait((i + 1) * 100L);
|
||||
} catch (Exception e) {
|
||||
log.warn("get serverlist fail,url: " + addressServerUrl);
|
||||
}
|
||||
}
|
||||
GetServerListTask getServersTask = new GetServerListTask(addressServerUrl);
|
||||
for (int i = 0; i < initServerlistRetryTimes && serverUrls.isEmpty(); ++i) {
|
||||
getServersTask.run();
|
||||
try {
|
||||
this.wait((i + 1) * 100L);
|
||||
} catch (Exception e) {
|
||||
log.warn("get serverlist fail,url: " + addressServerUrl);
|
||||
}
|
||||
}
|
||||
|
||||
if (serverUrls.isEmpty()) {
|
||||
log.error("NACOS-0008", LoggerHelper.getErrorCodeStr("NACOS", "NACOS-0008", "环境问题",
|
||||
"fail to get NACOS-server serverlist! env:" + name + ", not connnect url:" + addressServerUrl));
|
||||
log.error(name, "NACOS-XXXX", "[init-serverlist] fail to get NACOS-server serverlist!");
|
||||
throw new NacosException(NacosException.SERVER_ERROR,
|
||||
"fail to get NACOS-server serverlist! env:" + name + ", not connnect url:" + addressServerUrl);
|
||||
}
|
||||
if (serverUrls.isEmpty()) {
|
||||
log.error("NACOS-0008", LoggerHelper.getErrorCodeStr("NACOS", "NACOS-0008", "环境问题",
|
||||
"fail to get NACOS-server serverlist! env:" + name + ", not connnect url:" + addressServerUrl));
|
||||
log.error(name, "NACOS-XXXX", "[init-serverlist] fail to get NACOS-server serverlist!");
|
||||
throw new NacosException(NacosException.SERVER_ERROR,
|
||||
"fail to get NACOS-server serverlist! env:" + name + ", not connnect url:" + addressServerUrl);
|
||||
}
|
||||
|
||||
TimerService.scheduleWithFixedDelay(getServersTask, 0L, 30L, TimeUnit.SECONDS);
|
||||
isStarted = true;
|
||||
}
|
||||
|
||||
|
||||
Iterator<String> iterator() {
|
||||
if (serverUrls.isEmpty()) {
|
||||
log.error(name, "NACOS-XXXX", "[iterator-serverlist] No server address defined!");
|
||||
}
|
||||
return new ServerAddressIterator(serverUrls);
|
||||
}
|
||||
|
||||
|
||||
class GetServerListTask implements Runnable {
|
||||
final String url;
|
||||
|
||||
|
||||
GetServerListTask(String url) {
|
||||
this.url = url;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
/**
|
||||
* get serverlist from nameserver
|
||||
*/
|
||||
public void run() {
|
||||
/**
|
||||
* get serverlist from nameserver
|
||||
*/
|
||||
try {
|
||||
updateIfChanged(getApacheServerList(url, name));
|
||||
} catch (Exception e) {
|
||||
log.error(name, "NACOS-XXXX", "[update-serverlist] failed to update serverlist from address server!", e);
|
||||
log.error(name, "NACOS-XXXX", "[update-serverlist] failed to update serverlist from address server!",
|
||||
e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private void updateIfChanged(List<String> newList) {
|
||||
if (null == newList || newList.isEmpty()) {
|
||||
|
||||
log.warn("NACOS-0001", LoggerHelper.getErrorCodeStr("NACOS", "NACOS-0001", "环境问题","[update-serverlist] current serverlist from address server is empty!!!"));
|
||||
|
||||
log.warn("NACOS-0001", LoggerHelper.getErrorCodeStr("NACOS", "NACOS-0001", "环境问题",
|
||||
"[update-serverlist] current serverlist from address server is empty!!!"));
|
||||
log.warn(name, "[update-serverlist] current serverlist from address server is empty!!!");
|
||||
return;
|
||||
}
|
||||
/**
|
||||
* no change
|
||||
*/
|
||||
if (newList.equals(serverUrls)) {
|
||||
/**
|
||||
* no change
|
||||
*/
|
||||
if (newList.equals(serverUrls)) {
|
||||
return;
|
||||
}
|
||||
serverUrls = new ArrayList<String>(newList);
|
||||
currentServerAddr = iterator().next();
|
||||
|
||||
|
||||
EventDispatcher.fireEvent(new ServerlistChangeEvent());
|
||||
log.info(name, "[update-serverlist] serverlist updated to {}", serverUrls);
|
||||
}
|
||||
@ -253,38 +254,38 @@ public class ServerListManager {
|
||||
private List<String> getApacheServerList(String url, String name) {
|
||||
try {
|
||||
HttpResult httpResult = HttpSimpleClient.httpGet(url, null, null, null, 3000);
|
||||
|
||||
if (HttpURLConnection.HTTP_OK == httpResult.code) {
|
||||
if (DEFAULT_NAME.equals(name) ) {
|
||||
EnvUtil.setSelfEnv(httpResult.headers);
|
||||
}
|
||||
|
||||
if (HttpURLConnection.HTTP_OK == httpResult.code) {
|
||||
if (DEFAULT_NAME.equals(name)) {
|
||||
EnvUtil.setSelfEnv(httpResult.headers);
|
||||
}
|
||||
List<String> lines = IOUtils.readLines(new StringReader(httpResult.content));
|
||||
List<String> result = new ArrayList<String>(lines.size());
|
||||
for (String serverAddr : lines) {
|
||||
if (null == serverAddr || serverAddr.trim().isEmpty()) {
|
||||
continue;
|
||||
} else {
|
||||
String[] ipPort = serverAddr.trim().split(":");
|
||||
String ip = ipPort[0].trim();
|
||||
if (ipPort.length == 1) {
|
||||
result.add(ip + ":" + ParamUtil.getDefaultServerPort());
|
||||
} else {
|
||||
result.add(serverAddr);
|
||||
}
|
||||
}
|
||||
}
|
||||
List<String> result = new ArrayList<String>(lines.size());
|
||||
for (String serverAddr : lines) {
|
||||
if (null == serverAddr || serverAddr.trim().isEmpty()) {
|
||||
continue;
|
||||
} else {
|
||||
String[] ipPort = serverAddr.trim().split(":");
|
||||
String ip = ipPort[0].trim();
|
||||
if (ipPort.length == 1) {
|
||||
result.add(ip + ":" + ParamUtil.getDefaultServerPort());
|
||||
} else {
|
||||
result.add(serverAddr);
|
||||
}
|
||||
}
|
||||
}
|
||||
return result;
|
||||
} else {
|
||||
log.error(addressServerUrl, "NACOS-XXXX", "[check-serverlist] error. code={}", httpResult.code);
|
||||
return null;
|
||||
}
|
||||
} catch (IOException e) {
|
||||
log.error("NACOS-0001", LoggerHelper.getErrorCodeStr("NACOS", "NACOS-0001", "环境问题",e.toString()));
|
||||
log.error("NACOS-0001", LoggerHelper.getErrorCodeStr("NACOS", "NACOS-0001", "环境问题", e.toString()));
|
||||
log.error(addressServerUrl, "NACOS-XXXX", "[check-serverlist] exception. msg={}", e.toString(), e);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
String getUrlString() {
|
||||
return serverUrls.toString();
|
||||
}
|
||||
@ -300,99 +301,97 @@ public class ServerListManager {
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
@Override
|
||||
@Override
|
||||
public String toString() {
|
||||
return "ServerManager-" + name + "-" +getUrlString();
|
||||
return "ServerManager-" + name + "-" + getUrlString();
|
||||
}
|
||||
|
||||
public boolean contain(String ip){
|
||||
|
||||
return serverUrls.contains(ip);
|
||||
}
|
||||
public boolean contain(String ip) {
|
||||
|
||||
public void refreshCurrentServerAddr() {
|
||||
currentServerAddr = iterator().next();
|
||||
}
|
||||
return serverUrls.contains(ip);
|
||||
}
|
||||
|
||||
public String getCurrentServerAddr() {
|
||||
if (StringUtils.isBlank(currentServerAddr)) {
|
||||
currentServerAddr = iterator().next();
|
||||
}
|
||||
return currentServerAddr;
|
||||
}
|
||||
public void refreshCurrentServerAddr() {
|
||||
currentServerAddr = iterator().next();
|
||||
}
|
||||
|
||||
|
||||
public String getContentPath() {
|
||||
return contentPath;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public String getNamespace() {
|
||||
return namespace;
|
||||
}
|
||||
public String getCurrentServerAddr() {
|
||||
if (StringUtils.isBlank(currentServerAddr)) {
|
||||
currentServerAddr = iterator().next();
|
||||
}
|
||||
return currentServerAddr;
|
||||
}
|
||||
|
||||
public String getTenant() {
|
||||
return tenant;
|
||||
}
|
||||
|
||||
/**
|
||||
* 不同环境的名称
|
||||
*/
|
||||
private String name;
|
||||
private String namespace = "";
|
||||
private String tenant = "";
|
||||
public String getContentPath() {
|
||||
return contentPath;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public String getNamespace() {
|
||||
return namespace;
|
||||
}
|
||||
|
||||
public String getTenant() {
|
||||
return tenant;
|
||||
}
|
||||
|
||||
/**
|
||||
* 不同环境的名称
|
||||
*/
|
||||
private String name;
|
||||
private String namespace = "";
|
||||
private String tenant = "";
|
||||
static public final String DEFAULT_NAME = "default";
|
||||
static public final String CUSTOM_NAME = "custom";
|
||||
static public final String FIXED_NAME = "fixed";
|
||||
private int initServerlistRetryTimes = 5;
|
||||
/**
|
||||
* 和其他server的连接超时和socket超时
|
||||
*/
|
||||
/**
|
||||
* 和其他server的连接超时和socket超时
|
||||
*/
|
||||
static final int TIMEOUT = 5000;
|
||||
|
||||
|
||||
final boolean isFixed;
|
||||
boolean isStarted = false;
|
||||
private String endpoint;
|
||||
private int endpointPort = 8080;
|
||||
private String contentPath = ParamUtil.getDefaultContextPath();
|
||||
private String serverListName = ParamUtil.getDefaultNodesPath();
|
||||
boolean isStarted = false;
|
||||
private String endpoint;
|
||||
private int endpointPort = 8080;
|
||||
private String contentPath = ParamUtil.getDefaultContextPath();
|
||||
private String serverListName = ParamUtil.getDefaultNodesPath();
|
||||
volatile List<String> serverUrls = new ArrayList<String>();
|
||||
|
||||
private volatile String currentServerAddr;
|
||||
|
||||
public String serverPort = ParamUtil.getDefaultServerPort();
|
||||
|
||||
|
||||
public String serverPort = ParamUtil.getDefaultServerPort();
|
||||
|
||||
public String addressServerUrl;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 对地址列表排序,同机房优先。
|
||||
* 对地址列表排序,同机房优先。
|
||||
*/
|
||||
class ServerAddressIterator implements Iterator<String> {
|
||||
|
||||
static class RandomizedServerAddress implements Comparable<RandomizedServerAddress> {
|
||||
static Random random = new Random();
|
||||
|
||||
|
||||
String serverIp;
|
||||
int priority = 0;
|
||||
int seed;
|
||||
|
||||
public RandomizedServerAddress(String ip) {
|
||||
try {
|
||||
this.serverIp = ip;
|
||||
/**
|
||||
* change random scope from 32 to Integer.MAX_VALUE to fix load balance issue
|
||||
*/
|
||||
this.seed = random.nextInt(Integer.MAX_VALUE);
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
public RandomizedServerAddress(String ip) {
|
||||
try {
|
||||
this.serverIp = ip;
|
||||
/**
|
||||
* change random scope from 32 to Integer.MAX_VALUE to fix load balance issue
|
||||
*/
|
||||
this.seed = random.nextInt(Integer.MAX_VALUE);
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@SuppressFBWarnings("EQ_COMPARETO_USE_OBJECT_EQUALS")
|
||||
@ -425,7 +424,7 @@ class ServerAddressIterator implements Iterator<String> {
|
||||
public void remove() {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
|
||||
final List<RandomizedServerAddress> sorted;
|
||||
final Iterator<RandomizedServerAddress> iter;
|
||||
}
|
||||
|
@ -27,81 +27,79 @@ import java.util.*;
|
||||
|
||||
/**
|
||||
* 适配spas接口
|
||||
*
|
||||
* @author Nacos
|
||||
*
|
||||
* @author Nacos
|
||||
*/
|
||||
public class SpasAdapter {
|
||||
|
||||
public static List<String> getSignHeaders(String resource, String secretKey) {
|
||||
List<String> header = new ArrayList<String>();
|
||||
String timeStamp = String.valueOf(System.currentTimeMillis());
|
||||
header.add("Timestamp");
|
||||
header.add(timeStamp);
|
||||
if (secretKey != null) {
|
||||
header.add("Spas-Signature");
|
||||
String signature = "";
|
||||
if (StringUtils.isBlank(resource)) {
|
||||
signature = signWithhmacSHA1Encrypt(timeStamp, secretKey);
|
||||
} else {
|
||||
signature = signWithhmacSHA1Encrypt(resource + "+" + timeStamp, secretKey);
|
||||
}
|
||||
header.add(signature);
|
||||
}
|
||||
return header;
|
||||
}
|
||||
|
||||
|
||||
public static List<String> getSignHeaders(List<String> paramValues, String secretKey) {
|
||||
if (null == paramValues) {
|
||||
return null;
|
||||
}
|
||||
Map<String, String> signMap = new HashMap<String, String>(5);
|
||||
for (Iterator<String> iter = paramValues.iterator(); iter.hasNext();) {
|
||||
String key = iter.next();
|
||||
if (TENANT_KEY.equals(key) || GROUP_KEY.equals(key)) {
|
||||
signMap.put(key, iter.next());
|
||||
} else {
|
||||
iter.next();
|
||||
}
|
||||
}
|
||||
String resource = "";
|
||||
if (signMap.size() > 1) {
|
||||
resource = signMap.get(TENANT_KEY) + "+" + signMap.get(GROUP_KEY);
|
||||
} else {
|
||||
if (!StringUtils.isBlank(signMap.get(GROUP_KEY))) {
|
||||
resource = signMap.get(GROUP_KEY);
|
||||
}
|
||||
}
|
||||
return getSignHeaders(resource, secretKey);
|
||||
}
|
||||
|
||||
public static String getSk() {
|
||||
return CredentialService.getInstance().getCredential().getSecretKey();
|
||||
}
|
||||
public static List<String> getSignHeaders(String resource, String secretKey) {
|
||||
List<String> header = new ArrayList<String>();
|
||||
String timeStamp = String.valueOf(System.currentTimeMillis());
|
||||
header.add("Timestamp");
|
||||
header.add(timeStamp);
|
||||
if (secretKey != null) {
|
||||
header.add("Spas-Signature");
|
||||
String signature = "";
|
||||
if (StringUtils.isBlank(resource)) {
|
||||
signature = signWithhmacSHA1Encrypt(timeStamp, secretKey);
|
||||
} else {
|
||||
signature = signWithhmacSHA1Encrypt(resource + "+" + timeStamp, secretKey);
|
||||
}
|
||||
header.add(signature);
|
||||
}
|
||||
return header;
|
||||
}
|
||||
|
||||
public static String getAk() {
|
||||
return CredentialService.getInstance().getCredential().getAccessKey();
|
||||
}
|
||||
|
||||
public static String signWithhmacSHA1Encrypt(String encryptText, String encryptKey) {
|
||||
try {
|
||||
byte[] data = encryptKey.getBytes("UTF-8");
|
||||
// 根据给定的字节数组构造一个密钥,第二参数指定一个密钥算法的名称
|
||||
SecretKey secretKey = new SecretKeySpec(data, "HmacSHA1");
|
||||
// 生成一个指定 Mac 算法 的 Mac 对象
|
||||
Mac mac = Mac.getInstance("HmacSHA1");
|
||||
// 用给定密钥初始化 Mac 对象
|
||||
mac.init(secretKey);
|
||||
byte[] text = encryptText.getBytes("UTF-8");
|
||||
byte[] textFinal = mac.doFinal(text);
|
||||
// 完成 Mac 操作, base64编码,将byte数组转换为字符串
|
||||
return new String(Base64.encodeBase64(textFinal), Constants.ENCODE);
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("signWithhmacSHA1Encrypt fail", e);
|
||||
}
|
||||
}
|
||||
|
||||
private static String GROUP_KEY = "group";
|
||||
private static String TENANT_KEY = "tenant";
|
||||
public static List<String> getSignHeaders(List<String> paramValues, String secretKey) {
|
||||
if (null == paramValues) {
|
||||
return null;
|
||||
}
|
||||
Map<String, String> signMap = new HashMap<String, String>(5);
|
||||
for (Iterator<String> iter = paramValues.iterator(); iter.hasNext(); ) {
|
||||
String key = iter.next();
|
||||
if (TENANT_KEY.equals(key) || GROUP_KEY.equals(key)) {
|
||||
signMap.put(key, iter.next());
|
||||
} else {
|
||||
iter.next();
|
||||
}
|
||||
}
|
||||
String resource = "";
|
||||
if (signMap.size() > 1) {
|
||||
resource = signMap.get(TENANT_KEY) + "+" + signMap.get(GROUP_KEY);
|
||||
} else {
|
||||
if (!StringUtils.isBlank(signMap.get(GROUP_KEY))) {
|
||||
resource = signMap.get(GROUP_KEY);
|
||||
}
|
||||
}
|
||||
return getSignHeaders(resource, secretKey);
|
||||
}
|
||||
|
||||
public static String getSk() {
|
||||
return CredentialService.getInstance().getCredential().getSecretKey();
|
||||
}
|
||||
|
||||
public static String getAk() {
|
||||
return CredentialService.getInstance().getCredential().getAccessKey();
|
||||
}
|
||||
|
||||
public static String signWithhmacSHA1Encrypt(String encryptText, String encryptKey) {
|
||||
try {
|
||||
byte[] data = encryptKey.getBytes("UTF-8");
|
||||
// 根据给定的字节数组构造一个密钥,第二参数指定一个密钥算法的名称
|
||||
SecretKey secretKey = new SecretKeySpec(data, "HmacSHA1");
|
||||
// 生成一个指定 Mac 算法 的 Mac 对象
|
||||
Mac mac = Mac.getInstance("HmacSHA1");
|
||||
// 用给定密钥初始化 Mac 对象
|
||||
mac.init(secretKey);
|
||||
byte[] text = encryptText.getBytes("UTF-8");
|
||||
byte[] textFinal = mac.doFinal(text);
|
||||
// 完成 Mac 操作, base64编码,将byte数组转换为字符串
|
||||
return new String(Base64.encodeBase64(textFinal), Constants.ENCODE);
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("signWithhmacSHA1Encrypt fail", e);
|
||||
}
|
||||
}
|
||||
|
||||
private static String GROUP_KEY = "group";
|
||||
private static String TENANT_KEY = "tenant";
|
||||
}
|
||||
|
@ -21,28 +21,27 @@ import java.util.concurrent.ScheduledFuture;
|
||||
import java.util.concurrent.ThreadFactory;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
|
||||
/**
|
||||
* Time Service
|
||||
* @author Nacos
|
||||
*
|
||||
* @author Nacos
|
||||
*/
|
||||
public class TimerService {
|
||||
|
||||
static public ScheduledFuture<?> scheduleWithFixedDelay(Runnable command, long initialDelay,
|
||||
long delay, TimeUnit unit) {
|
||||
long delay, TimeUnit unit) {
|
||||
return scheduledExecutor.scheduleWithFixedDelay(command, initialDelay, delay, unit);
|
||||
}
|
||||
|
||||
|
||||
@SuppressWarnings("PMD.ThreadPoolCreationRule")
|
||||
static ScheduledExecutorService scheduledExecutor = Executors
|
||||
.newSingleThreadScheduledExecutor(new ThreadFactory() {
|
||||
public Thread newThread(Runnable r) {
|
||||
Thread t = new Thread(r);
|
||||
t.setName("com.alibaba.nacos.client.Timer");
|
||||
t.setDaemon(true);
|
||||
return t;
|
||||
}
|
||||
});
|
||||
|
||||
.newSingleThreadScheduledExecutor(new ThreadFactory() {
|
||||
public Thread newThread(Runnable r) {
|
||||
Thread t = new Thread(r);
|
||||
t.setName("com.alibaba.nacos.client.Timer");
|
||||
t.setDaemon(true);
|
||||
return t;
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
|
@ -26,14 +26,13 @@ import java.util.Properties;
|
||||
|
||||
/**
|
||||
* Properties Listener
|
||||
*
|
||||
* @author Nacos
|
||||
*
|
||||
* @author Nacos
|
||||
*/
|
||||
@SuppressWarnings("PMD.AbstractClassShouldStartWithAbstractNamingRule")
|
||||
public abstract class PropertiesListener extends AbstractListener {
|
||||
final static public Logger log = LogUtils.logger(PropertiesListener.class);
|
||||
|
||||
final static public Logger log = LogUtils.logger(PropertiesListener.class);
|
||||
|
||||
public void receiveConfigInfo(String configInfo) {
|
||||
if (StringUtils.isEmpty(configInfo)) {
|
||||
return;
|
||||
@ -43,19 +42,17 @@ public abstract class PropertiesListener extends AbstractListener {
|
||||
try {
|
||||
properties.load(new StringReader(configInfo));
|
||||
innerReceive(properties);
|
||||
}
|
||||
catch (IOException e) {
|
||||
log.error("NACOS-XXXX","load properties error:" + configInfo, e);
|
||||
} catch (IOException e) {
|
||||
log.error("NACOS-XXXX", "load properties error:" + configInfo, e);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* properties type for receiver
|
||||
*
|
||||
* @param properties
|
||||
* properties
|
||||
*/
|
||||
public abstract void innerReceive(Properties properties);
|
||||
/**
|
||||
* properties type for receiver
|
||||
*
|
||||
* @param properties properties
|
||||
*/
|
||||
public abstract void innerReceive(Properties properties);
|
||||
|
||||
}
|
||||
|
@ -30,217 +30,199 @@ import java.nio.charset.CharsetDecoder;
|
||||
|
||||
/**
|
||||
* concurrent disk util;op file with file lock
|
||||
*
|
||||
* @author configCenter
|
||||
*
|
||||
* @author configCenter
|
||||
*/
|
||||
public class ConcurrentDiskUtil {
|
||||
|
||||
/**
|
||||
* get file content
|
||||
*
|
||||
* @param path
|
||||
* file path
|
||||
* @param charsetName
|
||||
* charsetName
|
||||
* @return content
|
||||
* @throws IOException
|
||||
* IOException
|
||||
*/
|
||||
public static String getFileContent(String path, String charsetName)
|
||||
throws IOException {
|
||||
File file = new File(path);
|
||||
return getFileContent(file, charsetName);
|
||||
}
|
||||
/**
|
||||
* get file content
|
||||
*
|
||||
* @param path file path
|
||||
* @param charsetName charsetName
|
||||
* @return content
|
||||
* @throws IOException IOException
|
||||
*/
|
||||
public static String getFileContent(String path, String charsetName)
|
||||
throws IOException {
|
||||
File file = new File(path);
|
||||
return getFileContent(file, charsetName);
|
||||
}
|
||||
|
||||
/**
|
||||
* get file content
|
||||
*
|
||||
* @param file
|
||||
* file
|
||||
* @param charsetName
|
||||
* charsetName
|
||||
* @return content
|
||||
* @throws IOException
|
||||
* IOException
|
||||
*/
|
||||
public static String getFileContent(File file, String charsetName)
|
||||
throws IOException {
|
||||
RandomAccessFile fis = null;
|
||||
FileLock rlock = null;
|
||||
try {
|
||||
fis = new RandomAccessFile(file, "r");
|
||||
FileChannel fcin = fis.getChannel();
|
||||
int i = 0;
|
||||
do {
|
||||
try {
|
||||
rlock = fcin.tryLock(0L, Long.MAX_VALUE, true);
|
||||
} catch (Exception e) {
|
||||
++i;
|
||||
if (i > RETRY_COUNT) {
|
||||
log.error("read {} fail;retryed time:{}",
|
||||
file.getName(), i);
|
||||
throw new IOException("read " + file.getAbsolutePath()
|
||||
+ " conflict");
|
||||
}
|
||||
sleep(SLEEP_BASETIME * i);
|
||||
log.warn("read {} conflict;retry time:{}", file.getName(),
|
||||
i);
|
||||
}
|
||||
} while (null == rlock);
|
||||
int fileSize = (int) fcin.size();
|
||||
ByteBuffer byteBuffer = ByteBuffer.allocate(fileSize);
|
||||
fcin.read(byteBuffer);
|
||||
byteBuffer.flip();
|
||||
return byteBufferToString(byteBuffer, charsetName);
|
||||
} finally {
|
||||
if (rlock != null) {
|
||||
rlock.release();
|
||||
rlock = null;
|
||||
}
|
||||
if (fis != null) {
|
||||
fis.close();
|
||||
fis = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* get file content
|
||||
*
|
||||
* @param file file
|
||||
* @param charsetName charsetName
|
||||
* @return content
|
||||
* @throws IOException IOException
|
||||
*/
|
||||
public static String getFileContent(File file, String charsetName)
|
||||
throws IOException {
|
||||
RandomAccessFile fis = null;
|
||||
FileLock rlock = null;
|
||||
try {
|
||||
fis = new RandomAccessFile(file, "r");
|
||||
FileChannel fcin = fis.getChannel();
|
||||
int i = 0;
|
||||
do {
|
||||
try {
|
||||
rlock = fcin.tryLock(0L, Long.MAX_VALUE, true);
|
||||
} catch (Exception e) {
|
||||
++i;
|
||||
if (i > RETRY_COUNT) {
|
||||
log.error("read {} fail;retryed time:{}",
|
||||
file.getName(), i);
|
||||
throw new IOException("read " + file.getAbsolutePath()
|
||||
+ " conflict");
|
||||
}
|
||||
sleep(SLEEP_BASETIME * i);
|
||||
log.warn("read {} conflict;retry time:{}", file.getName(),
|
||||
i);
|
||||
}
|
||||
} while (null == rlock);
|
||||
int fileSize = (int)fcin.size();
|
||||
ByteBuffer byteBuffer = ByteBuffer.allocate(fileSize);
|
||||
fcin.read(byteBuffer);
|
||||
byteBuffer.flip();
|
||||
return byteBufferToString(byteBuffer, charsetName);
|
||||
} finally {
|
||||
if (rlock != null) {
|
||||
rlock.release();
|
||||
rlock = null;
|
||||
}
|
||||
if (fis != null) {
|
||||
fis.close();
|
||||
fis = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* write file content
|
||||
*
|
||||
* @param path
|
||||
* file path
|
||||
* @param content
|
||||
* content
|
||||
* @param charsetName
|
||||
* charsetName
|
||||
* @return whether write ok
|
||||
* @throws IOException
|
||||
* IOException
|
||||
*/
|
||||
public static Boolean writeFileContent(String path, String content,
|
||||
String charsetName) throws IOException {
|
||||
File file = new File(path);
|
||||
return writeFileContent(file, content, charsetName);
|
||||
}
|
||||
/**
|
||||
* write file content
|
||||
*
|
||||
* @param path file path
|
||||
* @param content content
|
||||
* @param charsetName charsetName
|
||||
* @return whether write ok
|
||||
* @throws IOException IOException
|
||||
*/
|
||||
public static Boolean writeFileContent(String path, String content,
|
||||
String charsetName) throws IOException {
|
||||
File file = new File(path);
|
||||
return writeFileContent(file, content, charsetName);
|
||||
}
|
||||
|
||||
/**
|
||||
* write file content
|
||||
*
|
||||
* @param file
|
||||
* file
|
||||
* @param content
|
||||
* content
|
||||
* @param charsetName
|
||||
* charsetName
|
||||
* @return whether write ok
|
||||
* @throws IOException
|
||||
* IOException
|
||||
*/
|
||||
public static Boolean writeFileContent(File file, String content,
|
||||
String charsetName) throws IOException {
|
||||
if (!file.exists()) {
|
||||
boolean isCreateOk = file.createNewFile();
|
||||
if (!isCreateOk) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
FileChannel channel = null;
|
||||
FileLock lock = null;
|
||||
RandomAccessFile raf = null;
|
||||
try {
|
||||
raf = new RandomAccessFile(file, "rw");
|
||||
channel = raf.getChannel();
|
||||
int i = 0;
|
||||
do {
|
||||
try {
|
||||
lock = channel.tryLock();
|
||||
} catch (Exception e) {
|
||||
++i;
|
||||
if (i > RETRY_COUNT) {
|
||||
log.error("write {} fail;retryed time:{}",
|
||||
file.getName(), i);
|
||||
throw new IOException("write " + file.getAbsolutePath()
|
||||
+ " conflict");
|
||||
}
|
||||
sleep(SLEEP_BASETIME * i);
|
||||
log.warn("write {} conflict;retry time:{}", file.getName(),
|
||||
i);
|
||||
}
|
||||
} while (null == lock);
|
||||
/**
|
||||
* write file content
|
||||
*
|
||||
* @param file file
|
||||
* @param content content
|
||||
* @param charsetName charsetName
|
||||
* @return whether write ok
|
||||
* @throws IOException IOException
|
||||
*/
|
||||
public static Boolean writeFileContent(File file, String content,
|
||||
String charsetName) throws IOException {
|
||||
if (!file.exists()) {
|
||||
boolean isCreateOk = file.createNewFile();
|
||||
if (!isCreateOk) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
FileChannel channel = null;
|
||||
FileLock lock = null;
|
||||
RandomAccessFile raf = null;
|
||||
try {
|
||||
raf = new RandomAccessFile(file, "rw");
|
||||
channel = raf.getChannel();
|
||||
int i = 0;
|
||||
do {
|
||||
try {
|
||||
lock = channel.tryLock();
|
||||
} catch (Exception e) {
|
||||
++i;
|
||||
if (i > RETRY_COUNT) {
|
||||
log.error("write {} fail;retryed time:{}",
|
||||
file.getName(), i);
|
||||
throw new IOException("write " + file.getAbsolutePath()
|
||||
+ " conflict");
|
||||
}
|
||||
sleep(SLEEP_BASETIME * i);
|
||||
log.warn("write {} conflict;retry time:{}", file.getName(),
|
||||
i);
|
||||
}
|
||||
} while (null == lock);
|
||||
|
||||
ByteBuffer sendBuffer = ByteBuffer.wrap(content
|
||||
.getBytes(charsetName));
|
||||
while (sendBuffer.hasRemaining()) {
|
||||
channel.write(sendBuffer);
|
||||
}
|
||||
channel.truncate(content.length());
|
||||
} catch (FileNotFoundException e) {
|
||||
throw new IOException("file not exist");
|
||||
} finally {
|
||||
if (lock != null) {
|
||||
try {
|
||||
lock.release();
|
||||
lock = null;
|
||||
} catch (IOException e) {
|
||||
log.warn("close wrong", e);
|
||||
}
|
||||
}
|
||||
if (channel != null) {
|
||||
try {
|
||||
channel.close();
|
||||
channel = null;
|
||||
} catch (IOException e) {
|
||||
log.warn("close wrong", e);
|
||||
}
|
||||
}
|
||||
if (raf != null) {
|
||||
try {
|
||||
raf.close();
|
||||
raf = null;
|
||||
} catch (IOException e) {
|
||||
log.warn("close wrong", e);
|
||||
}
|
||||
}
|
||||
ByteBuffer sendBuffer = ByteBuffer.wrap(content
|
||||
.getBytes(charsetName));
|
||||
while (sendBuffer.hasRemaining()) {
|
||||
channel.write(sendBuffer);
|
||||
}
|
||||
channel.truncate(content.length());
|
||||
} catch (FileNotFoundException e) {
|
||||
throw new IOException("file not exist");
|
||||
} finally {
|
||||
if (lock != null) {
|
||||
try {
|
||||
lock.release();
|
||||
lock = null;
|
||||
} catch (IOException e) {
|
||||
log.warn("close wrong", e);
|
||||
}
|
||||
}
|
||||
if (channel != null) {
|
||||
try {
|
||||
channel.close();
|
||||
channel = null;
|
||||
} catch (IOException e) {
|
||||
log.warn("close wrong", e);
|
||||
}
|
||||
}
|
||||
if (raf != null) {
|
||||
try {
|
||||
raf.close();
|
||||
raf = null;
|
||||
} catch (IOException e) {
|
||||
log.warn("close wrong", e);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* transfer ByteBuffer to String
|
||||
*
|
||||
* @param buffer
|
||||
* buffer
|
||||
* @param charsetName
|
||||
* charsetName
|
||||
* @return String
|
||||
* @throws IOException
|
||||
* IOException
|
||||
*/
|
||||
public static String byteBufferToString(ByteBuffer buffer,
|
||||
String charsetName) throws IOException {
|
||||
Charset charset = null;
|
||||
CharsetDecoder decoder = null;
|
||||
CharBuffer charBuffer = null;
|
||||
charset = Charset.forName(charsetName);
|
||||
decoder = charset.newDecoder();
|
||||
charBuffer = decoder.decode(buffer.asReadOnlyBuffer());
|
||||
return charBuffer.toString();
|
||||
}
|
||||
/**
|
||||
* transfer ByteBuffer to String
|
||||
*
|
||||
* @param buffer buffer
|
||||
* @param charsetName charsetName
|
||||
* @return String
|
||||
* @throws IOException IOException
|
||||
*/
|
||||
public static String byteBufferToString(ByteBuffer buffer,
|
||||
String charsetName) throws IOException {
|
||||
Charset charset = null;
|
||||
CharsetDecoder decoder = null;
|
||||
CharBuffer charBuffer = null;
|
||||
charset = Charset.forName(charsetName);
|
||||
decoder = charset.newDecoder();
|
||||
charBuffer = decoder.decode(buffer.asReadOnlyBuffer());
|
||||
return charBuffer.toString();
|
||||
}
|
||||
|
||||
private static void sleep(int time) {
|
||||
try {
|
||||
Thread.sleep(time);
|
||||
} catch (InterruptedException e) {
|
||||
log.warn("sleep wrong", e);
|
||||
}
|
||||
}
|
||||
private static void sleep(int time) {
|
||||
try {
|
||||
Thread.sleep(time);
|
||||
} catch (InterruptedException e) {
|
||||
log.warn("sleep wrong", e);
|
||||
}
|
||||
}
|
||||
|
||||
static final public Logger log = LogUtils.logger(ConcurrentDiskUtil.class);
|
||||
static final int RETRY_COUNT = 10;
|
||||
/**
|
||||
* ms
|
||||
*/
|
||||
static final int SLEEP_BASETIME = 10;
|
||||
static final public Logger log = LogUtils.logger(ConcurrentDiskUtil.class);
|
||||
static final int RETRY_COUNT = 10;
|
||||
/**
|
||||
* ms
|
||||
*/
|
||||
static final int SLEEP_BASETIME = 10;
|
||||
}
|
||||
|
@ -21,9 +21,8 @@ import static com.alibaba.nacos.api.common.Constants.WORD_SEPARATOR;
|
||||
|
||||
/**
|
||||
* Content Util
|
||||
*
|
||||
* @author Nacos
|
||||
*
|
||||
* @author Nacos
|
||||
*/
|
||||
public class ContentUtils {
|
||||
|
||||
@ -43,7 +42,6 @@ public class ContentUtils {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static String getContentIdentity(String content) {
|
||||
int index = content.indexOf(WORD_SEPARATOR);
|
||||
if (index == -1) {
|
||||
@ -52,7 +50,6 @@ public class ContentUtils {
|
||||
return content.substring(0, index);
|
||||
}
|
||||
|
||||
|
||||
public static String getContent(String content) {
|
||||
int index = content.indexOf(WORD_SEPARATOR);
|
||||
if (index == -1) {
|
||||
@ -61,18 +58,15 @@ public class ContentUtils {
|
||||
return content.substring(index + 1);
|
||||
}
|
||||
|
||||
|
||||
public static String truncateContent(String content) {
|
||||
if (content == null) {
|
||||
return "";
|
||||
}
|
||||
else if (content.length() <= SHOW_CONTENT_SIZE) {
|
||||
} else if (content.length() <= SHOW_CONTENT_SIZE) {
|
||||
return content;
|
||||
}
|
||||
else {
|
||||
return content.substring(0, SHOW_CONTENT_SIZE) + "...";
|
||||
} else {
|
||||
return content.substring(0, SHOW_CONTENT_SIZE) + "...";
|
||||
}
|
||||
}
|
||||
|
||||
private static int SHOW_CONTENT_SIZE = 100;
|
||||
private static int SHOW_CONTENT_SIZE = 100;
|
||||
}
|
||||
|
@ -21,21 +21,19 @@ import java.io.*;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
|
||||
/**
|
||||
* IO Util
|
||||
*
|
||||
* @author Nacos
|
||||
*
|
||||
* @author Nacos
|
||||
*/
|
||||
@SuppressWarnings("PMD.ClassNamingShouldBeCamelRule")
|
||||
public class IOUtils {
|
||||
|
||||
static public String toString(InputStream input, String encoding) throws IOException {
|
||||
return (null == encoding) ? toString(new InputStreamReader(input, Constants.ENCODE))
|
||||
: toString(new InputStreamReader(input, encoding));
|
||||
: toString(new InputStreamReader(input, encoding));
|
||||
}
|
||||
|
||||
|
||||
static public String toString(Reader reader) throws IOException {
|
||||
CharArrayWriter sw = new CharArrayWriter();
|
||||
copy(reader, sw);
|
||||
@ -45,7 +43,7 @@ public class IOUtils {
|
||||
static public long copy(Reader input, Writer output) throws IOException {
|
||||
char[] buffer = new char[1 << 12];
|
||||
long count = 0;
|
||||
for (int n = 0; (n = input.read(buffer)) >= 0;) {
|
||||
for (int n = 0; (n = input.read(buffer)) >= 0; ) {
|
||||
output.write(buffer, 0, n);
|
||||
count += n;
|
||||
}
|
||||
@ -59,7 +57,7 @@ public class IOUtils {
|
||||
BufferedReader reader = toBufferedReader(input);
|
||||
List<String> list = new ArrayList<String>();
|
||||
String line = null;
|
||||
for (;;) {
|
||||
for (; ; ) {
|
||||
line = reader.readLine();
|
||||
if (null != line) {
|
||||
list.add(line);
|
||||
@ -71,8 +69,8 @@ public class IOUtils {
|
||||
}
|
||||
|
||||
static private BufferedReader toBufferedReader(Reader reader) {
|
||||
return reader instanceof BufferedReader ? (BufferedReader) reader : new BufferedReader(
|
||||
reader);
|
||||
return reader instanceof BufferedReader ? (BufferedReader)reader : new BufferedReader(
|
||||
reader);
|
||||
}
|
||||
|
||||
public static void delete(File fileOrDir) throws IOException {
|
||||
@ -82,16 +80,16 @@ public class IOUtils {
|
||||
|
||||
if (fileOrDir.isDirectory()) {
|
||||
cleanDirectory(fileOrDir);
|
||||
} else {
|
||||
if (fileOrDir.exists()) {
|
||||
boolean isDeleteOk = fileOrDir.delete();
|
||||
if (!isDeleteOk) {
|
||||
throw new IOException("delete fail");
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (fileOrDir.exists()) {
|
||||
boolean isDeleteOk = fileOrDir.delete();
|
||||
if (!isDeleteOk) {
|
||||
throw new IOException("delete fail");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 清理目录下的内容
|
||||
*/
|
||||
@ -107,10 +105,10 @@ public class IOUtils {
|
||||
}
|
||||
|
||||
File[] files = directory.listFiles();
|
||||
/**
|
||||
* null if security restricted
|
||||
*/
|
||||
if (files == null) {
|
||||
/**
|
||||
* null if security restricted
|
||||
*/
|
||||
if (files == null) {
|
||||
throw new IOException("Failed to list contents of " + directory);
|
||||
}
|
||||
|
||||
@ -129,7 +127,7 @@ public class IOUtils {
|
||||
}
|
||||
|
||||
public static void writeStringToFile(File file, String data, String encoding)
|
||||
throws IOException {
|
||||
throws IOException {
|
||||
OutputStream os = null;
|
||||
try {
|
||||
os = new FileOutputStream(file);
|
||||
|
@ -19,31 +19,30 @@ import com.alibaba.nacos.client.logger.Logger;
|
||||
|
||||
/**
|
||||
* Get jvm config
|
||||
*
|
||||
* @author Nacos
|
||||
*
|
||||
* @author Nacos
|
||||
*/
|
||||
@SuppressWarnings("PMD.ClassNamingShouldBeCamelRule")
|
||||
public class JVMUtil {
|
||||
|
||||
/**
|
||||
* whether is multi instance
|
||||
*
|
||||
* @return whether multi
|
||||
*/
|
||||
public static Boolean isMultiInstance() {
|
||||
return isMultiInstance;
|
||||
}
|
||||
/**
|
||||
* whether is multi instance
|
||||
*
|
||||
* @return whether multi
|
||||
*/
|
||||
public static Boolean isMultiInstance() {
|
||||
return isMultiInstance;
|
||||
}
|
||||
|
||||
private static Boolean isMultiInstance = false;
|
||||
private static String TRUE = "true";
|
||||
static final public Logger log = LogUtils.logger(JVMUtil.class);
|
||||
private static Boolean isMultiInstance = false;
|
||||
private static String TRUE = "true";
|
||||
static final public Logger log = LogUtils.logger(JVMUtil.class);
|
||||
|
||||
static {
|
||||
String multiDeploy = System.getProperty("isMultiInstance", "false");
|
||||
if (TRUE.equals(multiDeploy)) {
|
||||
isMultiInstance = true;
|
||||
}
|
||||
log.info("isMultiInstance:{}", isMultiInstance);
|
||||
}
|
||||
static {
|
||||
String multiDeploy = System.getProperty("isMultiInstance", "false");
|
||||
if (TRUE.equals(multiDeploy)) {
|
||||
isMultiInstance = true;
|
||||
}
|
||||
log.info("isMultiInstance:{}", isMultiInstance);
|
||||
}
|
||||
}
|
||||
|
@ -22,38 +22,38 @@ import com.alibaba.nacos.client.logger.LoggerFactory;
|
||||
|
||||
/**
|
||||
* Log Util
|
||||
*
|
||||
* @author Nacos
|
||||
*
|
||||
* @author Nacos
|
||||
*/
|
||||
public class LogUtils {
|
||||
|
||||
static int JM_LOG_RETAIN_COUNT = 7;
|
||||
static String JM_LOG_FILE_SIZE = "10MB";
|
||||
static int JM_LOG_RETAIN_COUNT = 7;
|
||||
static String JM_LOG_FILE_SIZE = "10MB";
|
||||
|
||||
static {
|
||||
String tmp = "7";
|
||||
String tmp = "7";
|
||||
try {
|
||||
/**
|
||||
* change timeout from 100 to 200
|
||||
*/
|
||||
tmp = System.getProperty("JM.LOG.RETAIN.COUNT","7");
|
||||
/**
|
||||
* change timeout from 100 to 200
|
||||
*/
|
||||
tmp = System.getProperty("JM.LOG.RETAIN.COUNT", "7");
|
||||
JM_LOG_RETAIN_COUNT = Integer.parseInt(tmp);
|
||||
} catch (NumberFormatException e) {
|
||||
e.printStackTrace();
|
||||
throw e;
|
||||
e.printStackTrace();
|
||||
throw e;
|
||||
}
|
||||
|
||||
JM_LOG_FILE_SIZE = System.getProperty("JM.LOG.FILE.SIZE","10MB");
|
||||
|
||||
|
||||
JM_LOG_FILE_SIZE = System.getProperty("JM.LOG.FILE.SIZE", "10MB");
|
||||
|
||||
// logger init
|
||||
Logger logger = LoggerFactory.getLogger("com.alibaba.nacos.client.config");
|
||||
logger.setLevel(Level.INFO);
|
||||
logger.setAdditivity(false);
|
||||
logger.activateAppenderWithSizeRolling("nacos", "config.log", Constants.ENCODE, JM_LOG_FILE_SIZE, JM_LOG_RETAIN_COUNT);
|
||||
logger.activateAppenderWithSizeRolling("nacos", "config.log", Constants.ENCODE, JM_LOG_FILE_SIZE,
|
||||
JM_LOG_RETAIN_COUNT);
|
||||
}
|
||||
|
||||
public static Logger logger(Class<?> clazz) {
|
||||
return LoggerFactory.getLogger(clazz);
|
||||
}
|
||||
public static Logger logger(Class<?> clazz) {
|
||||
return LoggerFactory.getLogger(clazz);
|
||||
}
|
||||
}
|
||||
|
@ -25,16 +25,16 @@ import java.util.concurrent.locks.ReentrantLock;
|
||||
|
||||
/**
|
||||
* MD5 util
|
||||
*
|
||||
* @author Nacos
|
||||
*
|
||||
* @author Nacos
|
||||
*/
|
||||
@SuppressWarnings("PMD.ClassNamingShouldBeCamelRule")
|
||||
public class MD5 {
|
||||
private static int DIGITS_SIZE = 16;
|
||||
private static char[] digits = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
|
||||
private static int DIGITS_SIZE = 16;
|
||||
private static char[] digits = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
|
||||
|
||||
private static Map<Character, Integer> rDigits = new HashMap<Character, Integer>(16);
|
||||
|
||||
static {
|
||||
for (int i = 0; i < digits.length; ++i) {
|
||||
rDigits.put(digits[i], i);
|
||||
@ -45,41 +45,34 @@ public class MD5 {
|
||||
private MessageDigest mHasher;
|
||||
private ReentrantLock opLock = new ReentrantLock();
|
||||
|
||||
|
||||
private MD5() {
|
||||
try {
|
||||
mHasher = MessageDigest.getInstance("md5");
|
||||
}
|
||||
catch (Exception e) {
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
public static MD5 getInstance() {
|
||||
return me;
|
||||
}
|
||||
|
||||
|
||||
public String getMD5String(String content) {
|
||||
return bytes2string(hash(content));
|
||||
}
|
||||
|
||||
|
||||
public String getMD5String(byte[] content) {
|
||||
return bytes2string(hash(content));
|
||||
}
|
||||
|
||||
|
||||
public byte[] getMD5Bytes(byte[] content) {
|
||||
return hash(content);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 对字符串进行md5
|
||||
*
|
||||
*
|
||||
* @param str
|
||||
* @return md5 byte[16]
|
||||
*/
|
||||
@ -91,19 +84,16 @@ public class MD5 {
|
||||
throw new IllegalArgumentException("md5 need");
|
||||
}
|
||||
return bt;
|
||||
}
|
||||
catch (UnsupportedEncodingException e) {
|
||||
} catch (UnsupportedEncodingException e) {
|
||||
throw new RuntimeException("unsupported utf-8 encoding", e);
|
||||
}
|
||||
finally {
|
||||
} finally {
|
||||
opLock.unlock();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 对二进制数据进行md5
|
||||
*
|
||||
*
|
||||
* @param data
|
||||
* @return md5 byte[16]
|
||||
*/
|
||||
@ -115,16 +105,14 @@ public class MD5 {
|
||||
throw new IllegalArgumentException("md5 need");
|
||||
}
|
||||
return bt;
|
||||
}
|
||||
finally {
|
||||
} finally {
|
||||
opLock.unlock();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 将一个字节数组转化为可见的字符串
|
||||
*
|
||||
*
|
||||
* @param bt
|
||||
* @return
|
||||
*/
|
||||
@ -141,5 +129,4 @@ public class MD5 {
|
||||
return new String(out);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
@ -23,18 +23,16 @@ import com.alibaba.nacos.client.utils.StringUtils;
|
||||
|
||||
/**
|
||||
* Param check util
|
||||
*
|
||||
*
|
||||
* @author Nacos
|
||||
*
|
||||
*/
|
||||
public class ParamUtils {
|
||||
|
||||
private static char[] validChars = new char[] { '_', '-', '.', ':' };
|
||||
|
||||
private static char[] validChars = new char[] {'_', '-', '.', ':'};
|
||||
|
||||
/**
|
||||
* 白名单的方式检查, 合法的参数只能包含字母、数字、以及validChars中的字符, 并且不能为空
|
||||
*
|
||||
*
|
||||
* @param param
|
||||
* @return
|
||||
*/
|
||||
@ -47,18 +45,15 @@ public class ParamUtils {
|
||||
char ch = param.charAt(i);
|
||||
if (Character.isLetterOrDigit(ch)) {
|
||||
continue;
|
||||
}
|
||||
else if (isValidChar(ch)) {
|
||||
} else if (isValidChar(ch)) {
|
||||
continue;
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
private static boolean isValidChar(char ch) {
|
||||
for (char c : validChars) {
|
||||
if (c == ch) {
|
||||
@ -67,88 +62,88 @@ public class ParamUtils {
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public static void checkKeyParam(String dataId, String group) throws NacosException {
|
||||
if (StringUtils.isBlank(dataId) || !ParamUtils.isValid(dataId)) {
|
||||
throw new NacosException(NacosException.CLIENT_INVALID_PARAM, "dataId invalid");
|
||||
}
|
||||
if (StringUtils.isBlank(group) || !ParamUtils.isValid(group)) {
|
||||
throw new NacosException(NacosException.CLIENT_INVALID_PARAM, "group invalid");
|
||||
}
|
||||
}
|
||||
|
||||
public static void checkTDG(String tenant, String dataId, String group) throws NacosException {
|
||||
checkTenant(tenant);
|
||||
if (StringUtils.isBlank(dataId) || !ParamUtils.isValid(dataId)) {
|
||||
throw new NacosException(NacosException.CLIENT_INVALID_PARAM, "dataId invalid");
|
||||
}
|
||||
if (StringUtils.isBlank(group) || !ParamUtils.isValid(group)) {
|
||||
throw new NacosException(NacosException.CLIENT_INVALID_PARAM, "group invalid");
|
||||
}
|
||||
}
|
||||
|
||||
public static void checkKeyParam(String dataId, String group, String datumId)
|
||||
throws NacosException {
|
||||
if (StringUtils.isBlank(dataId) || !ParamUtils.isValid(dataId)) {
|
||||
throw new NacosException(NacosException.CLIENT_INVALID_PARAM, "dataId invalid");
|
||||
}
|
||||
if (StringUtils.isBlank(group) || !ParamUtils.isValid(group)) {
|
||||
throw new NacosException(NacosException.CLIENT_INVALID_PARAM, "group invalid");
|
||||
}
|
||||
if (StringUtils.isBlank(datumId) || !ParamUtils.isValid(datumId)) {
|
||||
throw new NacosException(NacosException.CLIENT_INVALID_PARAM, "datumId invalid");
|
||||
}
|
||||
}
|
||||
|
||||
public static void checkKeyParam(List<String> dataIds, String group) throws NacosException {
|
||||
if (dataIds == null || dataIds.size() == 0) {
|
||||
throw new NacosException(NacosException.CLIENT_INVALID_PARAM, "dataIds invalid");
|
||||
}
|
||||
for (String dataId : dataIds) {
|
||||
if (StringUtils.isBlank(dataId) || !ParamUtils.isValid(dataId)) {
|
||||
throw new NacosException(NacosException.CLIENT_INVALID_PARAM, "dataId invalid");
|
||||
}
|
||||
}
|
||||
if (StringUtils.isBlank(group) || !ParamUtils.isValid(group)) {
|
||||
throw new NacosException(NacosException.CLIENT_INVALID_PARAM, "group invalid");
|
||||
}
|
||||
}
|
||||
|
||||
public static void checkParam(String dataId, String group, String content) throws NacosException {
|
||||
checkKeyParam(dataId, group);
|
||||
if (StringUtils.isBlank(content)) {
|
||||
throw new NacosException(NacosException.CLIENT_INVALID_PARAM, "content invalid");
|
||||
}
|
||||
}
|
||||
|
||||
public static void checkParam(String dataId, String group, String datumId, String content) throws NacosException {
|
||||
checkKeyParam(dataId, group, datumId);
|
||||
if (StringUtils.isBlank(content)) {
|
||||
throw new NacosException(NacosException.CLIENT_INVALID_PARAM, "content invalid");
|
||||
}
|
||||
}
|
||||
public static void checkKeyParam(String dataId, String group) throws NacosException {
|
||||
if (StringUtils.isBlank(dataId) || !ParamUtils.isValid(dataId)) {
|
||||
throw new NacosException(NacosException.CLIENT_INVALID_PARAM, "dataId invalid");
|
||||
}
|
||||
if (StringUtils.isBlank(group) || !ParamUtils.isValid(group)) {
|
||||
throw new NacosException(NacosException.CLIENT_INVALID_PARAM, "group invalid");
|
||||
}
|
||||
}
|
||||
|
||||
public static void checkTenant(String tenant) throws NacosException {
|
||||
if (StringUtils.isBlank(tenant) || !ParamUtils.isValid(tenant)) {
|
||||
throw new NacosException(NacosException.CLIENT_INVALID_PARAM, "tenant invalid");
|
||||
}
|
||||
}
|
||||
|
||||
public static void checkBetaIps(String betaIps) throws NacosException {
|
||||
if (StringUtils.isBlank(betaIps)) {
|
||||
throw new NacosException(NacosException.CLIENT_INVALID_PARAM, "betaIps invalid");
|
||||
}
|
||||
String[] ipsArr = betaIps.split(",");
|
||||
for (String ip : ipsArr) {
|
||||
if (!IPUtil.isIPV4(ip)) {
|
||||
throw new NacosException(NacosException.CLIENT_INVALID_PARAM, "betaIps invalid");
|
||||
}
|
||||
}
|
||||
}
|
||||
public static void checkTDG(String tenant, String dataId, String group) throws NacosException {
|
||||
checkTenant(tenant);
|
||||
if (StringUtils.isBlank(dataId) || !ParamUtils.isValid(dataId)) {
|
||||
throw new NacosException(NacosException.CLIENT_INVALID_PARAM, "dataId invalid");
|
||||
}
|
||||
if (StringUtils.isBlank(group) || !ParamUtils.isValid(group)) {
|
||||
throw new NacosException(NacosException.CLIENT_INVALID_PARAM, "group invalid");
|
||||
}
|
||||
}
|
||||
|
||||
public static void checkContent(String content) throws NacosException {
|
||||
if (StringUtils.isBlank(content)) {
|
||||
throw new NacosException(NacosException.CLIENT_INVALID_PARAM, "content invalid");
|
||||
}
|
||||
}
|
||||
public static void checkKeyParam(String dataId, String group, String datumId)
|
||||
throws NacosException {
|
||||
if (StringUtils.isBlank(dataId) || !ParamUtils.isValid(dataId)) {
|
||||
throw new NacosException(NacosException.CLIENT_INVALID_PARAM, "dataId invalid");
|
||||
}
|
||||
if (StringUtils.isBlank(group) || !ParamUtils.isValid(group)) {
|
||||
throw new NacosException(NacosException.CLIENT_INVALID_PARAM, "group invalid");
|
||||
}
|
||||
if (StringUtils.isBlank(datumId) || !ParamUtils.isValid(datumId)) {
|
||||
throw new NacosException(NacosException.CLIENT_INVALID_PARAM, "datumId invalid");
|
||||
}
|
||||
}
|
||||
|
||||
public static void checkKeyParam(List<String> dataIds, String group) throws NacosException {
|
||||
if (dataIds == null || dataIds.size() == 0) {
|
||||
throw new NacosException(NacosException.CLIENT_INVALID_PARAM, "dataIds invalid");
|
||||
}
|
||||
for (String dataId : dataIds) {
|
||||
if (StringUtils.isBlank(dataId) || !ParamUtils.isValid(dataId)) {
|
||||
throw new NacosException(NacosException.CLIENT_INVALID_PARAM, "dataId invalid");
|
||||
}
|
||||
}
|
||||
if (StringUtils.isBlank(group) || !ParamUtils.isValid(group)) {
|
||||
throw new NacosException(NacosException.CLIENT_INVALID_PARAM, "group invalid");
|
||||
}
|
||||
}
|
||||
|
||||
public static void checkParam(String dataId, String group, String content) throws NacosException {
|
||||
checkKeyParam(dataId, group);
|
||||
if (StringUtils.isBlank(content)) {
|
||||
throw new NacosException(NacosException.CLIENT_INVALID_PARAM, "content invalid");
|
||||
}
|
||||
}
|
||||
|
||||
public static void checkParam(String dataId, String group, String datumId, String content) throws NacosException {
|
||||
checkKeyParam(dataId, group, datumId);
|
||||
if (StringUtils.isBlank(content)) {
|
||||
throw new NacosException(NacosException.CLIENT_INVALID_PARAM, "content invalid");
|
||||
}
|
||||
}
|
||||
|
||||
public static void checkTenant(String tenant) throws NacosException {
|
||||
if (StringUtils.isBlank(tenant) || !ParamUtils.isValid(tenant)) {
|
||||
throw new NacosException(NacosException.CLIENT_INVALID_PARAM, "tenant invalid");
|
||||
}
|
||||
}
|
||||
|
||||
public static void checkBetaIps(String betaIps) throws NacosException {
|
||||
if (StringUtils.isBlank(betaIps)) {
|
||||
throw new NacosException(NacosException.CLIENT_INVALID_PARAM, "betaIps invalid");
|
||||
}
|
||||
String[] ipsArr = betaIps.split(",");
|
||||
for (String ip : ipsArr) {
|
||||
if (!IPUtil.isIPV4(ip)) {
|
||||
throw new NacosException(NacosException.CLIENT_INVALID_PARAM, "betaIps invalid");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void checkContent(String content) throws NacosException {
|
||||
if (StringUtils.isBlank(content)) {
|
||||
throw new NacosException(NacosException.CLIENT_INVALID_PARAM, "content invalid");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -19,24 +19,23 @@ import com.alibaba.nacos.client.config.impl.LocalConfigInfoProcessor;
|
||||
|
||||
/**
|
||||
* Snapshot switch
|
||||
*
|
||||
* @author Nacos
|
||||
*
|
||||
* @author Nacos
|
||||
*/
|
||||
public class SnapShotSwitch {
|
||||
|
||||
/**
|
||||
* whether use local cache
|
||||
*/
|
||||
private static Boolean isSnapShot = true;
|
||||
/**
|
||||
* whether use local cache
|
||||
*/
|
||||
private static Boolean isSnapShot = true;
|
||||
|
||||
public static Boolean getIsSnapShot() {
|
||||
return isSnapShot;
|
||||
}
|
||||
public static Boolean getIsSnapShot() {
|
||||
return isSnapShot;
|
||||
}
|
||||
|
||||
public static void setIsSnapShot(Boolean isSnapShot) {
|
||||
SnapShotSwitch.isSnapShot = isSnapShot;
|
||||
LocalConfigInfoProcessor.cleanAllSnapshot();
|
||||
}
|
||||
|
||||
public static void setIsSnapShot(Boolean isSnapShot) {
|
||||
SnapShotSwitch.isSnapShot = isSnapShot;
|
||||
LocalConfigInfoProcessor.cleanAllSnapshot();
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -19,26 +19,25 @@ import com.alibaba.nacos.client.utils.StringUtils;
|
||||
|
||||
/**
|
||||
* Tenant Util
|
||||
*
|
||||
* @author Nacos
|
||||
*
|
||||
* @author Nacos
|
||||
*/
|
||||
public class TenantUtil {
|
||||
|
||||
static String userTenant = "";
|
||||
|
||||
static {
|
||||
userTenant = System.getProperty("tenant.id", "");
|
||||
if (StringUtils.isBlank(userTenant)) {
|
||||
userTenant = System.getProperty("acm.namespace", "");
|
||||
}
|
||||
}
|
||||
static String userTenant = "";
|
||||
|
||||
public static String getUserTenant() {
|
||||
return userTenant;
|
||||
}
|
||||
static {
|
||||
userTenant = System.getProperty("tenant.id", "");
|
||||
if (StringUtils.isBlank(userTenant)) {
|
||||
userTenant = System.getProperty("acm.namespace", "");
|
||||
}
|
||||
}
|
||||
|
||||
public static void setUserTenant(String userTenant) {
|
||||
TenantUtil.userTenant = userTenant;
|
||||
}
|
||||
public static String getUserTenant() {
|
||||
return userTenant;
|
||||
}
|
||||
|
||||
public static void setUserTenant(String userTenant) {
|
||||
TenantUtil.userTenant = userTenant;
|
||||
}
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -17,16 +17,15 @@ package com.alibaba.nacos.client.identify;
|
||||
|
||||
/**
|
||||
* Identify Constants
|
||||
*
|
||||
* @author Nacos
|
||||
*
|
||||
* @author Nacos
|
||||
*/
|
||||
public class Constants {
|
||||
public static final String ACCESS_KEY = "accessKey";
|
||||
|
||||
public static final String SECRET_KEY = "secretKey";
|
||||
|
||||
public static final String PROPERTIES_FILENAME = "spas.properties";
|
||||
public static final String ACCESS_KEY = "accessKey";
|
||||
|
||||
public static final String SECRET_KEY = "secretKey";
|
||||
|
||||
public static final String PROPERTIES_FILENAME = "spas.properties";
|
||||
|
||||
public static final String CREDENTIAL_PATH = "/home/admin/.spas_key/";
|
||||
|
||||
|
@ -17,13 +17,12 @@ package com.alibaba.nacos.client.identify;
|
||||
|
||||
/**
|
||||
* Credential Listener
|
||||
*
|
||||
* @author Nacos
|
||||
*
|
||||
* @author Nacos
|
||||
*/
|
||||
public interface CredentialListener {
|
||||
/**
|
||||
* update Credential
|
||||
*/
|
||||
/**
|
||||
* update Credential
|
||||
*/
|
||||
public void onUpdateCredential();
|
||||
}
|
||||
|
@ -23,34 +23,33 @@ import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
/**
|
||||
* Credential Service
|
||||
*
|
||||
* @author Nacos
|
||||
*
|
||||
* @author Nacos
|
||||
*/
|
||||
public final class CredentialService implements SpasCredentialLoader {
|
||||
static final public Logger log = LogUtils.logger(CredentialService.class);
|
||||
private static ConcurrentHashMap<String, CredentialService> instances = new ConcurrentHashMap<String, CredentialService>();
|
||||
static final public Logger log = LogUtils.logger(CredentialService.class);
|
||||
private static ConcurrentHashMap<String, CredentialService> instances
|
||||
= new ConcurrentHashMap<String, CredentialService>();
|
||||
|
||||
private String appName;
|
||||
private Credentials credentials = new Credentials();
|
||||
private Credentials credentials = new Credentials();
|
||||
private CredentialWatcher watcher;
|
||||
private CredentialListener listener;
|
||||
|
||||
private CredentialService(String appName) {
|
||||
|
||||
private CredentialService(String appName) {
|
||||
if (appName == null) {
|
||||
String value = System.getProperty("project.name");
|
||||
if (StringUtils.isNotEmpty(value)) {
|
||||
appName = value;
|
||||
}
|
||||
String value = System.getProperty("project.name");
|
||||
if (StringUtils.isNotEmpty(value)) {
|
||||
appName = value;
|
||||
}
|
||||
}
|
||||
this.appName = appName;
|
||||
watcher = new CredentialWatcher(appName, this);
|
||||
}
|
||||
|
||||
|
||||
public static CredentialService getInstance() {
|
||||
}
|
||||
|
||||
public static CredentialService getInstance() {
|
||||
return getInstance(null);
|
||||
}
|
||||
}
|
||||
|
||||
public static CredentialService getInstance(String appName) {
|
||||
String key = appName != null ? appName : Constants.NO_APP_NAME;
|
||||
@ -85,13 +84,13 @@ public final class CredentialService implements SpasCredentialLoader {
|
||||
log.info(appName, this.getClass().getSimpleName() + " is freed");
|
||||
}
|
||||
|
||||
public Credentials getCredential() {
|
||||
public Credentials getCredential() {
|
||||
Credentials localCredential = credentials;
|
||||
if (localCredential.valid()) {
|
||||
return localCredential;
|
||||
}
|
||||
return credentials;
|
||||
}
|
||||
return credentials;
|
||||
}
|
||||
|
||||
public void setCredential(Credentials credential) {
|
||||
boolean changed = !(credentials == credential || (credentials != null && credentials.identical(credential)));
|
||||
@ -113,23 +112,23 @@ public final class CredentialService implements SpasCredentialLoader {
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public void setAccessKey(String accessKey) {
|
||||
credentials.setAccessKey(accessKey);
|
||||
}
|
||||
public void setAccessKey(String accessKey) {
|
||||
credentials.setAccessKey(accessKey);
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public void setSecretKey(String secretKey) {
|
||||
credentials.setSecretKey(secretKey);
|
||||
}
|
||||
public void setSecretKey(String secretKey) {
|
||||
credentials.setSecretKey(secretKey);
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public String getAccessKey() {
|
||||
return credentials.getAccessKey();
|
||||
}
|
||||
public String getAccessKey() {
|
||||
return credentials.getAccessKey();
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public String getSecretKey() {
|
||||
return credentials.getSecretKey();
|
||||
}
|
||||
public String getSecretKey() {
|
||||
return credentials.getSecretKey();
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -31,12 +31,11 @@ import com.alibaba.nacos.client.utils.StringUtils;
|
||||
|
||||
/**
|
||||
* Credential Watcher
|
||||
*
|
||||
* @author Nacos
|
||||
*
|
||||
* @author Nacos
|
||||
*/
|
||||
public class CredentialWatcher {
|
||||
static final public Logger SpasLogger = LogUtils.logger(CredentialWatcher.class);
|
||||
static final public Logger SpasLogger = LogUtils.logger(CredentialWatcher.class);
|
||||
private static final long REFRESH_INTERVAL = 10 * 1000;
|
||||
|
||||
private CredentialService serviceInstance;
|
||||
@ -104,21 +103,20 @@ public class CredentialWatcher {
|
||||
propertyPath = url.getPath();
|
||||
}
|
||||
if (propertyPath == null || propertyPath.isEmpty()) {
|
||||
|
||||
String value = System.getProperty("spas.identity");
|
||||
if (StringUtils.isNotEmpty(value)) {
|
||||
propertyPath = value;
|
||||
}
|
||||
if (propertyPath == null || propertyPath.isEmpty()) {
|
||||
propertyPath = Constants.CREDENTIAL_PATH + (appName == null ? Constants.CREDENTIAL_DEFAULT : appName);
|
||||
|
||||
String value = System.getProperty("spas.identity");
|
||||
if (StringUtils.isNotEmpty(value)) {
|
||||
propertyPath = value;
|
||||
}
|
||||
else {
|
||||
if (propertyPath == null || propertyPath.isEmpty()) {
|
||||
propertyPath = Constants.CREDENTIAL_PATH + (appName == null ? Constants.CREDENTIAL_DEFAULT
|
||||
: appName);
|
||||
} else {
|
||||
if (logWarn) {
|
||||
SpasLogger.info(appName, "Defined credential file: -D" + "spas.identity" + "=" + propertyPath);
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
if (logWarn) {
|
||||
SpasLogger.info(appName, "Load credential file from classpath: " + Constants.PROPERTIES_FILENAME);
|
||||
}
|
||||
@ -130,7 +128,8 @@ public class CredentialWatcher {
|
||||
try {
|
||||
propertiesIS = new FileInputStream(propertyPath);
|
||||
} catch (FileNotFoundException e) {
|
||||
if (appName != null && !appName.equals(Constants.CREDENTIAL_DEFAULT) && propertyPath.equals(Constants.CREDENTIAL_PATH + appName)) {
|
||||
if (appName != null && !appName.equals(Constants.CREDENTIAL_DEFAULT) && propertyPath.equals(
|
||||
Constants.CREDENTIAL_PATH + appName)) {
|
||||
propertyPath = Constants.CREDENTIAL_PATH + Constants.CREDENTIAL_DEFAULT;
|
||||
continue;
|
||||
}
|
||||
@ -154,22 +153,21 @@ public class CredentialWatcher {
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
Properties properties = new Properties();
|
||||
try {
|
||||
properties.load(propertiesIS);
|
||||
} catch (IOException e) {
|
||||
SpasLogger.error("26", "Unable to load credential file, appName:" + appName
|
||||
+ "Unable to load credential file " + propertyPath, e);
|
||||
propertyPath = null;
|
||||
SpasLogger.error("26", "Unable to load credential file, appName:" + appName
|
||||
+ "Unable to load credential file " + propertyPath, e);
|
||||
propertyPath = null;
|
||||
return;
|
||||
} finally {
|
||||
try {
|
||||
propertiesIS.close();
|
||||
} catch (IOException e) {
|
||||
SpasLogger.error("27", "Unable to close credential file, appName:" + appName
|
||||
+ "Unable to close credential file " + propertyPath, e);
|
||||
SpasLogger.error("27", "Unable to close credential file, appName:" + appName
|
||||
+ "Unable to close credential file " + propertyPath, e);
|
||||
}
|
||||
}
|
||||
|
||||
@ -202,12 +200,12 @@ public class CredentialWatcher {
|
||||
}
|
||||
|
||||
Credentials credential = new Credentials(accessKey, secretKey);
|
||||
if (!credential.valid()) {
|
||||
SpasLogger.warn("1", "Credential file missing required property" + appName + "Credential file missing "
|
||||
+ Constants.ACCESS_KEY + " or " + Constants.SECRET_KEY);
|
||||
propertyPath = null;
|
||||
// return;
|
||||
}
|
||||
if (!credential.valid()) {
|
||||
SpasLogger.warn("1", "Credential file missing required property" + appName + "Credential file missing "
|
||||
+ Constants.ACCESS_KEY + " or " + Constants.SECRET_KEY);
|
||||
propertyPath = null;
|
||||
// return;
|
||||
}
|
||||
|
||||
serviceInstance.setCredential(credential);
|
||||
}
|
||||
|
@ -17,40 +17,39 @@ package com.alibaba.nacos.client.identify;
|
||||
|
||||
/**
|
||||
* Credentials
|
||||
*
|
||||
* @author Nacos
|
||||
*
|
||||
* @author Nacos
|
||||
*/
|
||||
public class Credentials implements SpasCredential {
|
||||
|
||||
private volatile String accessKey;
|
||||
|
||||
private volatile String secretKey;
|
||||
|
||||
public Credentials(String accessKey, String secretKey) {
|
||||
this.accessKey = accessKey;
|
||||
this.secretKey = secretKey;
|
||||
}
|
||||
|
||||
public Credentials() {
|
||||
this(null, null);
|
||||
}
|
||||
|
||||
public String getAccessKey() {
|
||||
return accessKey;
|
||||
}
|
||||
|
||||
public void setAccessKey(String accessKey) {
|
||||
this.accessKey = accessKey;
|
||||
}
|
||||
private volatile String accessKey;
|
||||
|
||||
public String getSecretKey() {
|
||||
return secretKey;
|
||||
}
|
||||
private volatile String secretKey;
|
||||
|
||||
public void setSecretKey(String secretKey) {
|
||||
this.secretKey = secretKey;
|
||||
}
|
||||
public Credentials(String accessKey, String secretKey) {
|
||||
this.accessKey = accessKey;
|
||||
this.secretKey = secretKey;
|
||||
}
|
||||
|
||||
public Credentials() {
|
||||
this(null, null);
|
||||
}
|
||||
|
||||
public String getAccessKey() {
|
||||
return accessKey;
|
||||
}
|
||||
|
||||
public void setAccessKey(String accessKey) {
|
||||
this.accessKey = accessKey;
|
||||
}
|
||||
|
||||
public String getSecretKey() {
|
||||
return secretKey;
|
||||
}
|
||||
|
||||
public void setSecretKey(String secretKey) {
|
||||
this.secretKey = secretKey;
|
||||
}
|
||||
|
||||
public boolean valid() {
|
||||
return accessKey != null && !accessKey.isEmpty() && secretKey != null && !secretKey.isEmpty();
|
||||
@ -58,8 +57,10 @@ public class Credentials implements SpasCredential {
|
||||
|
||||
public boolean identical(Credentials other) {
|
||||
return this == other ||
|
||||
(other != null &&
|
||||
(accessKey == null && other.accessKey == null || accessKey != null && accessKey.equals(other.accessKey)) &&
|
||||
(secretKey == null && other.secretKey == null || secretKey != null && secretKey.equals(other.secretKey)));
|
||||
(other != null &&
|
||||
(accessKey == null && other.accessKey == null || accessKey != null && accessKey.equals(other.accessKey))
|
||||
&&
|
||||
(secretKey == null && other.secretKey == null || secretKey != null && secretKey.equals(
|
||||
other.secretKey)));
|
||||
}
|
||||
}
|
||||
|
@ -19,110 +19,110 @@ import com.alibaba.nacos.client.utils.StringUtils;
|
||||
|
||||
/**
|
||||
* Sts config
|
||||
*
|
||||
*
|
||||
* @author Nacos
|
||||
*/
|
||||
@SuppressWarnings("PMD.ClassNamingShouldBeCamelRule")
|
||||
public class STSConfig {
|
||||
private static final String RAM_SECURITY_CREDENTIALS_URL
|
||||
= "";
|
||||
private String ramRoleName;
|
||||
/**
|
||||
* STS 临时凭证有效期剩余多少时开始刷新(允许本地时间比 STS 服务时间最多慢多久)
|
||||
*/
|
||||
private int timeToRefreshInMillisecond = 3 * 60 * 1000;
|
||||
/**
|
||||
* 获取 STS 临时凭证的元数据接口(包含角色名称)
|
||||
*/
|
||||
private String securityCredentialsUrl;
|
||||
/**
|
||||
* 设定 STS 临时凭证,不再通过元数据接口获取
|
||||
*/
|
||||
private String securityCredentials;
|
||||
/**
|
||||
* 是否缓存
|
||||
*/
|
||||
private boolean cacheSecurityCredentials = true;
|
||||
private static final String RAM_SECURITY_CREDENTIALS_URL
|
||||
= "";
|
||||
private String ramRoleName;
|
||||
/**
|
||||
* STS 临时凭证有效期剩余多少时开始刷新(允许本地时间比 STS 服务时间最多慢多久)
|
||||
*/
|
||||
private int timeToRefreshInMillisecond = 3 * 60 * 1000;
|
||||
/**
|
||||
* 获取 STS 临时凭证的元数据接口(包含角色名称)
|
||||
*/
|
||||
private String securityCredentialsUrl;
|
||||
/**
|
||||
* 设定 STS 临时凭证,不再通过元数据接口获取
|
||||
*/
|
||||
private String securityCredentials;
|
||||
/**
|
||||
* 是否缓存
|
||||
*/
|
||||
private boolean cacheSecurityCredentials = true;
|
||||
|
||||
private static class Singleton {
|
||||
private static final STSConfig INSTANCE = new STSConfig();
|
||||
}
|
||||
private static class Singleton {
|
||||
private static final STSConfig INSTANCE = new STSConfig();
|
||||
}
|
||||
|
||||
private STSConfig() {
|
||||
String ramRoleName = System.getProperty("ram.role.name");
|
||||
if (!StringUtils.isBlank(ramRoleName)) {
|
||||
setRamRoleName(ramRoleName);
|
||||
}
|
||||
private STSConfig() {
|
||||
String ramRoleName = System.getProperty("ram.role.name");
|
||||
if (!StringUtils.isBlank(ramRoleName)) {
|
||||
setRamRoleName(ramRoleName);
|
||||
}
|
||||
|
||||
String timeToRefreshInMillisecond = System.getProperty("time.to.refresh.in.millisecond");
|
||||
if (!StringUtils.isBlank(timeToRefreshInMillisecond)) {
|
||||
setTimeToRefreshInMillisecond(Integer.parseInt(timeToRefreshInMillisecond));
|
||||
}
|
||||
String timeToRefreshInMillisecond = System.getProperty("time.to.refresh.in.millisecond");
|
||||
if (!StringUtils.isBlank(timeToRefreshInMillisecond)) {
|
||||
setTimeToRefreshInMillisecond(Integer.parseInt(timeToRefreshInMillisecond));
|
||||
}
|
||||
|
||||
String securityCredentials = System.getProperty("security.credentials");
|
||||
if (!StringUtils.isBlank(securityCredentials)) {
|
||||
setSecurityCredentials(securityCredentials);
|
||||
}
|
||||
String securityCredentials = System.getProperty("security.credentials");
|
||||
if (!StringUtils.isBlank(securityCredentials)) {
|
||||
setSecurityCredentials(securityCredentials);
|
||||
}
|
||||
|
||||
String securityCredentialsUrl = System.getProperty("security.credentials.url");
|
||||
if (!StringUtils.isBlank(securityCredentialsUrl)) {
|
||||
setSecurityCredentialsUrl(securityCredentialsUrl);
|
||||
}
|
||||
String securityCredentialsUrl = System.getProperty("security.credentials.url");
|
||||
if (!StringUtils.isBlank(securityCredentialsUrl)) {
|
||||
setSecurityCredentialsUrl(securityCredentialsUrl);
|
||||
}
|
||||
|
||||
String cacheSecurityCredentials = System.getProperty("cache.security.credentials");
|
||||
if (!StringUtils.isBlank(cacheSecurityCredentials)) {
|
||||
setCacheSecurityCredentials(Boolean.valueOf(cacheSecurityCredentials));
|
||||
}
|
||||
}
|
||||
String cacheSecurityCredentials = System.getProperty("cache.security.credentials");
|
||||
if (!StringUtils.isBlank(cacheSecurityCredentials)) {
|
||||
setCacheSecurityCredentials(Boolean.valueOf(cacheSecurityCredentials));
|
||||
}
|
||||
}
|
||||
|
||||
public static STSConfig getInstance() {
|
||||
return Singleton.INSTANCE;
|
||||
}
|
||||
public static STSConfig getInstance() {
|
||||
return Singleton.INSTANCE;
|
||||
}
|
||||
|
||||
public String getRamRoleName() {
|
||||
return ramRoleName;
|
||||
}
|
||||
public String getRamRoleName() {
|
||||
return ramRoleName;
|
||||
}
|
||||
|
||||
public void setRamRoleName(String ramRoleName) {
|
||||
this.ramRoleName = ramRoleName;
|
||||
}
|
||||
public void setRamRoleName(String ramRoleName) {
|
||||
this.ramRoleName = ramRoleName;
|
||||
}
|
||||
|
||||
public int getTimeToRefreshInMillisecond() {
|
||||
return timeToRefreshInMillisecond;
|
||||
}
|
||||
public int getTimeToRefreshInMillisecond() {
|
||||
return timeToRefreshInMillisecond;
|
||||
}
|
||||
|
||||
public void setTimeToRefreshInMillisecond(int timeToRefreshInMillisecond) {
|
||||
this.timeToRefreshInMillisecond = timeToRefreshInMillisecond;
|
||||
}
|
||||
public void setTimeToRefreshInMillisecond(int timeToRefreshInMillisecond) {
|
||||
this.timeToRefreshInMillisecond = timeToRefreshInMillisecond;
|
||||
}
|
||||
|
||||
public String getSecurityCredentialsUrl() {
|
||||
if (securityCredentialsUrl == null && ramRoleName != null) {
|
||||
return RAM_SECURITY_CREDENTIALS_URL + ramRoleName;
|
||||
}
|
||||
return securityCredentialsUrl;
|
||||
}
|
||||
public String getSecurityCredentialsUrl() {
|
||||
if (securityCredentialsUrl == null && ramRoleName != null) {
|
||||
return RAM_SECURITY_CREDENTIALS_URL + ramRoleName;
|
||||
}
|
||||
return securityCredentialsUrl;
|
||||
}
|
||||
|
||||
public void setSecurityCredentialsUrl(String securityCredentialsUrl) {
|
||||
this.securityCredentialsUrl = securityCredentialsUrl;
|
||||
}
|
||||
public void setSecurityCredentialsUrl(String securityCredentialsUrl) {
|
||||
this.securityCredentialsUrl = securityCredentialsUrl;
|
||||
}
|
||||
|
||||
public String getSecurityCredentials() {
|
||||
return securityCredentials;
|
||||
}
|
||||
public String getSecurityCredentials() {
|
||||
return securityCredentials;
|
||||
}
|
||||
|
||||
public void setSecurityCredentials(String securityCredentials) {
|
||||
this.securityCredentials = securityCredentials;
|
||||
}
|
||||
public void setSecurityCredentials(String securityCredentials) {
|
||||
this.securityCredentials = securityCredentials;
|
||||
}
|
||||
|
||||
public boolean isSTSOn() {
|
||||
return StringUtils.isNotEmpty(getSecurityCredentials()) || StringUtils.isNotEmpty(getSecurityCredentialsUrl());
|
||||
}
|
||||
public boolean isSTSOn() {
|
||||
return StringUtils.isNotEmpty(getSecurityCredentials()) || StringUtils.isNotEmpty(getSecurityCredentialsUrl());
|
||||
}
|
||||
|
||||
public boolean isCacheSecurityCredentials() {
|
||||
return cacheSecurityCredentials;
|
||||
}
|
||||
public boolean isCacheSecurityCredentials() {
|
||||
return cacheSecurityCredentials;
|
||||
}
|
||||
|
||||
public void setCacheSecurityCredentials(boolean cacheSecurityCredentials) {
|
||||
this.cacheSecurityCredentials = cacheSecurityCredentials;
|
||||
}
|
||||
public void setCacheSecurityCredentials(boolean cacheSecurityCredentials) {
|
||||
this.cacheSecurityCredentials = cacheSecurityCredentials;
|
||||
}
|
||||
}
|
||||
|
@ -17,22 +17,21 @@ package com.alibaba.nacos.client.identify;
|
||||
|
||||
/**
|
||||
* Spas Credential Interface
|
||||
*
|
||||
* @author Nacos
|
||||
*
|
||||
* @author Nacos
|
||||
*/
|
||||
public interface SpasCredential {
|
||||
/**
|
||||
* get AccessKey
|
||||
*
|
||||
* @return AccessKey
|
||||
*/
|
||||
public String getAccessKey();
|
||||
/**
|
||||
* get AccessKey
|
||||
*
|
||||
* @return AccessKey
|
||||
*/
|
||||
public String getAccessKey();
|
||||
|
||||
/**
|
||||
* get SecretKey
|
||||
*
|
||||
* @return SecretKey
|
||||
*/
|
||||
public String getSecretKey();
|
||||
/**
|
||||
* get SecretKey
|
||||
*
|
||||
* @return SecretKey
|
||||
*/
|
||||
public String getSecretKey();
|
||||
}
|
||||
|
@ -17,15 +17,14 @@ package com.alibaba.nacos.client.identify;
|
||||
|
||||
/**
|
||||
* Spas Credential Loader
|
||||
*
|
||||
* @author Nacos
|
||||
*
|
||||
* @author Nacos
|
||||
*/
|
||||
public interface SpasCredentialLoader {
|
||||
/**
|
||||
* get Credential
|
||||
*
|
||||
* @return Credential
|
||||
*/
|
||||
/**
|
||||
* get Credential
|
||||
*
|
||||
* @return Credential
|
||||
*/
|
||||
SpasCredential getCredential();
|
||||
}
|
||||
|
@ -17,14 +17,18 @@ package com.alibaba.nacos.client.logger;
|
||||
|
||||
/**
|
||||
* 阿里中间件日志级别
|
||||
*
|
||||
*
|
||||
* @author zhuyong 2014年3月20日 上午9:57:27
|
||||
*/
|
||||
public enum Level {
|
||||
/**
|
||||
* log level
|
||||
*/
|
||||
DEBUG("DEBUG"), INFO("INFO"), WARN("WARN"), ERROR("ERROR"), OFF("OFF");
|
||||
/**
|
||||
* log level
|
||||
*/
|
||||
DEBUG("DEBUG"),
|
||||
INFO("INFO"),
|
||||
WARN("WARN"),
|
||||
ERROR("ERROR"),
|
||||
OFF("OFF");
|
||||
|
||||
private String name;
|
||||
|
||||
|
@ -20,7 +20,7 @@ import com.alibaba.nacos.client.logger.option.ActivateOption;
|
||||
/**
|
||||
* <pre>
|
||||
* 阿里中间件日志API,用于输出定制化的日志
|
||||
*
|
||||
*
|
||||
* 定制格式如下:01 %d{yyyy-MM-dd HH:mm:ss.SSS} %p [%-5t:%c{2}] %m%n
|
||||
* 其中:
|
||||
* 01 日志API版本,后续如果格式有变化,会修改此版本号,方便机器解析
|
||||
@ -29,17 +29,17 @@ import com.alibaba.nacos.client.logger.option.ActivateOption;
|
||||
* [%-5t:%c{2}] 线程名:日志名
|
||||
* %m 日志信息
|
||||
* %n 换行
|
||||
*
|
||||
*
|
||||
* 关于%m,也有其中的格式要求:[Context] [STAT-INFO] [ERROR-CODE]
|
||||
* 其中:
|
||||
* Context 打印时间时的上下文信息,如果没有,则内容为空,但'[]'这个占位符仍要输出
|
||||
* STAT-INFO 待定
|
||||
* ERROR-CODE 常见的错误码,帮助用户解决问题
|
||||
*
|
||||
*
|
||||
* 在异常中,也需要输出ErrorCode及对应的TraceUrl,可以使用
|
||||
* com.alibaba.nacos.client.logger.support.LoggerHelper.getErrorCodeStr(String errorCode)来获取格式化后的串
|
||||
* </pre>
|
||||
*
|
||||
*
|
||||
* @author zhuyong 2014年3月20日 上午9:58:27
|
||||
*/
|
||||
public interface Logger extends ActivateOption {
|
||||
@ -55,7 +55,7 @@ public interface Logger extends ActivateOption {
|
||||
* 输出Debug日志
|
||||
*
|
||||
* @param format 日志信息格式化字符串,比如 'Hi,{} {} {}'(当使用ResourceBundle用于国际化日志输出时,message为对应的key, since 0.1.5)
|
||||
* @param args 格式化串参数数组
|
||||
* @param args 格式化串参数数组
|
||||
*/
|
||||
void debug(String format, Object... args);
|
||||
|
||||
@ -71,8 +71,8 @@ public interface Logger extends ActivateOption {
|
||||
* 输出Debug日志
|
||||
*
|
||||
* @param context 日志上下文信息
|
||||
* @param format 日志信息格式化字符串,比如 'Hi,{} {} {}'(当使用ResourceBundle用于国际化日志输出时,message为对应的key, since 0.1.5)
|
||||
* @param args 格式化串参数数组
|
||||
* @param format 日志信息格式化字符串,比如 'Hi,{} {} {}'(当使用ResourceBundle用于国际化日志输出时,message为对应的key, since 0.1.5)
|
||||
* @param args 格式化串参数数组
|
||||
*/
|
||||
void debug(String context, String format, Object... args);
|
||||
|
||||
@ -87,7 +87,7 @@ public interface Logger extends ActivateOption {
|
||||
* 输出Info日志
|
||||
*
|
||||
* @param format 日志信息格式化字符串,比如 'Hi,{} {} {}'(当使用ResourceBundle用于国际化日志输出时,message为对应的key, since 0.1.5)
|
||||
* @param args 格式化串参数数组
|
||||
* @param args 格式化串参数数组
|
||||
*/
|
||||
void info(String format, Object... args);
|
||||
|
||||
@ -103,8 +103,8 @@ public interface Logger extends ActivateOption {
|
||||
* 输出Info日志
|
||||
*
|
||||
* @param context 日志上下文信息
|
||||
* @param format 日志信息格式化字符串,比如 'Hi,{} {} {}'(当使用ResourceBundle用于国际化日志输出时,message为对应的key, since 0.1.5)
|
||||
* @param args 格式化串参数数组
|
||||
* @param format 日志信息格式化字符串,比如 'Hi,{} {} {}'(当使用ResourceBundle用于国际化日志输出时,message为对应的key, since 0.1.5)
|
||||
* @param args 格式化串参数数组
|
||||
*/
|
||||
void info(String context, String format, Object... args);
|
||||
|
||||
@ -119,7 +119,7 @@ public interface Logger extends ActivateOption {
|
||||
* 输出Warn日志
|
||||
*
|
||||
* @param message 日志信息(当使用ResourceBundle用于国际化日志输出时,message为对应的key, since 0.1.5)
|
||||
* @param t 异常信息
|
||||
* @param t 异常信息
|
||||
* @since 0.1.5
|
||||
*/
|
||||
void warn(String message, Throwable t);
|
||||
@ -128,7 +128,7 @@ public interface Logger extends ActivateOption {
|
||||
* 输出Warn日志
|
||||
*
|
||||
* @param format 日志信息格式化字符串,比如 'Hi,{} {} {}'(当使用ResourceBundle用于国际化日志输出时,message为对应的key, since 0.1.5)
|
||||
* @param args 格式化串参数数组
|
||||
* @param args 格式化串参数数组
|
||||
*/
|
||||
void warn(String format, Object... args);
|
||||
|
||||
@ -144,8 +144,8 @@ public interface Logger extends ActivateOption {
|
||||
* 输出Warn日志
|
||||
*
|
||||
* @param context 日志上下文信息
|
||||
* @param format 日志信息格式化字符串,比如 'Hi,{} {} {}'(当使用ResourceBundle用于国际化日志输出时,message为对应的key, since 0.1.5)
|
||||
* @param args 格式化串参数数组
|
||||
* @param format 日志信息格式化字符串,比如 'Hi,{} {} {}'(当使用ResourceBundle用于国际化日志输出时,message为对应的key, since 0.1.5)
|
||||
* @param args 格式化串参数数组
|
||||
*/
|
||||
void warn(String context, String format, Object... args);
|
||||
|
||||
@ -153,7 +153,7 @@ public interface Logger extends ActivateOption {
|
||||
* 输出Error日志
|
||||
*
|
||||
* @param errorCode 错误码,如HSF-0001
|
||||
* @param message 日志信息(当使用ResourceBundle用于国际化日志输出时,message为对应的key, since 0.1.5)
|
||||
* @param message 日志信息(当使用ResourceBundle用于国际化日志输出时,message为对应的key, since 0.1.5)
|
||||
*/
|
||||
void error(String errorCode, String message);
|
||||
|
||||
@ -161,8 +161,8 @@ public interface Logger extends ActivateOption {
|
||||
* 输出Error日志
|
||||
*
|
||||
* @param errorCode 错误码,如HSF-0001
|
||||
* @param message 日志信息(当使用ResourceBundle用于国际化日志输出时,message为对应的key, since 0.1.5)
|
||||
* @param t 异常信息
|
||||
* @param message 日志信息(当使用ResourceBundle用于国际化日志输出时,message为对应的key, since 0.1.5)
|
||||
* @param t 异常信息
|
||||
*/
|
||||
void error(String errorCode, String message, Throwable t);
|
||||
|
||||
@ -170,68 +170,71 @@ public interface Logger extends ActivateOption {
|
||||
* 输出Error日志
|
||||
*
|
||||
* @param errorCode 错误码,如HSF-0001
|
||||
* @param format 日志信息格式化字符串,比如 'Hi,{} {} {}'(当使用ResourceBundle用于国际化日志输出时,message为对应的key, since 0.1.5)
|
||||
* @param objs 格式化串参数数组
|
||||
* @param format 日志信息格式化字符串,比如 'Hi,{} {} {}'(当使用ResourceBundle用于国际化日志输出时,message为对应的key, since 0.1.5)
|
||||
* @param objs 格式化串参数数组
|
||||
*/
|
||||
void error(String errorCode, String format, Object... objs);
|
||||
|
||||
/**
|
||||
* 输出Error日志
|
||||
*
|
||||
* @param context 日志上下文信息
|
||||
* @param context 日志上下文信息
|
||||
* @param errorCode 错误码
|
||||
* @param message 日志信息(当使用ResourceBundle用于国际化日志输出时,message为对应的key, since 0.1.5)
|
||||
* @param message 日志信息(当使用ResourceBundle用于国际化日志输出时,message为对应的key, since 0.1.5)
|
||||
*/
|
||||
void error(String context, String errorCode, String message);
|
||||
|
||||
/**
|
||||
* 输出Error日志
|
||||
*
|
||||
* @param context 日志上下文信息
|
||||
* @param context 日志上下文信息
|
||||
* @param errorCode 错误码
|
||||
* @param message 日志信息(当使用ResourceBundle用于国际化日志输出时,message为对应的key, since 0.1.5)
|
||||
* @param t 异常信息
|
||||
* @param message 日志信息(当使用ResourceBundle用于国际化日志输出时,message为对应的key, since 0.1.5)
|
||||
* @param t 异常信息
|
||||
*/
|
||||
void error(String context, String errorCode, String message, Throwable t);
|
||||
|
||||
/**
|
||||
* 输出Error日志
|
||||
*
|
||||
* @param context 日志上下文信息
|
||||
* @param context 日志上下文信息
|
||||
* @param errorCode 错误码
|
||||
* @param format 日志信息格式化字符串,比如 'Hi,{} {} {}'(当使用ResourceBundle用于国际化日志输出时,message为对应的key, since 0.1.5)
|
||||
* @param args 格式化串参数
|
||||
* @param format 日志信息格式化字符串,比如 'Hi,{} {} {}'(当使用ResourceBundle用于国际化日志输出时,message为对应的key, since 0.1.5)
|
||||
* @param args 格式化串参数
|
||||
*/
|
||||
void error(String context, String errorCode, String format, Object... args);
|
||||
|
||||
/**
|
||||
* 判断Debug级别是否开启
|
||||
*
|
||||
* @return Debug级别是否开启
|
||||
*/
|
||||
/**
|
||||
* 判断Debug级别是否开启
|
||||
*
|
||||
* @return Debug级别是否开启
|
||||
*/
|
||||
boolean isDebugEnabled();
|
||||
|
||||
/**
|
||||
* 判断Info级别是否开启
|
||||
*
|
||||
* @return Info级别是否开启
|
||||
*/
|
||||
boolean isInfoEnabled();
|
||||
|
||||
/**
|
||||
* 判断Warn级别是否开启
|
||||
*
|
||||
* @return Warn级别是否开启
|
||||
*/
|
||||
boolean isWarnEnabled();
|
||||
|
||||
/**
|
||||
* 判断Error级别是否开启
|
||||
*
|
||||
* @return Error级别是否开启
|
||||
*/
|
||||
/**
|
||||
* 判断Error级别是否开启
|
||||
*
|
||||
* @return Error级别是否开启
|
||||
*/
|
||||
boolean isErrorEnabled();
|
||||
|
||||
/**
|
||||
* * 获取内部日志实现对象
|
||||
*
|
||||
* @return 内部日志实现对象
|
||||
*/
|
||||
Object getDelegate();
|
||||
|
@ -61,7 +61,7 @@ public class LoggerFactory {
|
||||
} catch (Throwable e2) {
|
||||
setLoggerFactory(new NopLoggerFactory());
|
||||
LogLog.warn("Init JM logger with NopLoggerFactory, pay attention. "
|
||||
+ LoggerFactory.class.getClassLoader(), e2);
|
||||
+ LoggerFactory.class.getClassLoader(), e2);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -28,371 +28,367 @@ import java.util.Iterator;
|
||||
|
||||
/**
|
||||
* A JSON array. JSONObject supports java.util.List interface.
|
||||
*
|
||||
* @author FangYidong<fangyidong@yahoo.com.cn>
|
||||
*
|
||||
* @author FangYidong<fangyidong @ yahoo.com.cn>
|
||||
*/
|
||||
@SuppressWarnings("PMD.ClassNamingShouldBeCamelRule")
|
||||
public class JSONArray extends ArrayList implements JSONAware, JSONStreamAware {
|
||||
private static final long serialVersionUID = 3957988303675231981L;
|
||||
|
||||
/**
|
||||
* Constructs an empty JSONArray.
|
||||
*/
|
||||
public JSONArray(){
|
||||
super();
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructs a JSONArray containing the elements of the specified
|
||||
* collection, in the order they are returned by the collection's iterator.
|
||||
*
|
||||
* @param c the collection whose elements are to be placed into this JSONArray
|
||||
*/
|
||||
public JSONArray(Collection c){
|
||||
super(c);
|
||||
}
|
||||
|
||||
private static final long serialVersionUID = 3957988303675231981L;
|
||||
|
||||
/**
|
||||
* Encode a list into JSON text and write it to out.
|
||||
* If this list is also a JSONStreamAware or a JSONAware, JSONStreamAware and JSONAware specific behaviours will be ignored at this top level.
|
||||
*
|
||||
* @see com.alibaba.nacos.client.logger.json.JSONValue#writeJSONString(Object, Writer)
|
||||
*
|
||||
* Constructs an empty JSONArray.
|
||||
*/
|
||||
public JSONArray() {
|
||||
super();
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructs a JSONArray containing the elements of the specified collection, in the order they are returned by the
|
||||
* collection's iterator.
|
||||
*
|
||||
* @param c the collection whose elements are to be placed into this JSONArray
|
||||
*/
|
||||
public JSONArray(Collection c) {
|
||||
super(c);
|
||||
}
|
||||
|
||||
/**
|
||||
* Encode a list into JSON text and write it to out. If this list is also a JSONStreamAware or a JSONAware,
|
||||
* JSONStreamAware and JSONAware specific behaviours will be ignored at this top level.
|
||||
*
|
||||
* @param collection
|
||||
* @param out
|
||||
* @see com.alibaba.nacos.client.logger.json.JSONValue#writeJSONString(Object, Writer)
|
||||
*/
|
||||
public static void writeJSONString(Collection collection, Writer out) throws IOException{
|
||||
if(collection == null){
|
||||
out.write("null");
|
||||
return;
|
||||
}
|
||||
|
||||
boolean first = true;
|
||||
Iterator iter=collection.iterator();
|
||||
|
||||
public static void writeJSONString(Collection collection, Writer out) throws IOException {
|
||||
if (collection == null) {
|
||||
out.write("null");
|
||||
return;
|
||||
}
|
||||
|
||||
boolean first = true;
|
||||
Iterator iter = collection.iterator();
|
||||
|
||||
out.write('[');
|
||||
while(iter.hasNext()){
|
||||
if(first) {
|
||||
while (iter.hasNext()) {
|
||||
if (first) {
|
||||
first = false;
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
out.write(',');
|
||||
}
|
||||
Object value=iter.next();
|
||||
if(value == null){
|
||||
out.write("null");
|
||||
continue;
|
||||
}
|
||||
|
||||
JSONValue.writeJSONString(value, out);
|
||||
}
|
||||
out.write(']');
|
||||
}
|
||||
|
||||
public void writeJSONString(Writer out) throws IOException{
|
||||
writeJSONString(this, out);
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert a list to JSON text. The result is a JSON array.
|
||||
* If this list is also a JSONAware, JSONAware specific behaviours will be omitted at this top level.
|
||||
*
|
||||
* @see com.alibaba.nacos.client.logger.json.JSONValue#toJSONString(Object)
|
||||
*
|
||||
* @param collection
|
||||
* @return JSON text, or "null" if list is null.
|
||||
*/
|
||||
public static String toJSONString(Collection collection){
|
||||
final StringWriter writer = new StringWriter();
|
||||
|
||||
try {
|
||||
writeJSONString(collection, writer);
|
||||
return writer.toString();
|
||||
} catch(IOException e){
|
||||
// This should never happen for a StringWriter
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
Object value = iter.next();
|
||||
if (value == null) {
|
||||
out.write("null");
|
||||
continue;
|
||||
}
|
||||
|
||||
public static void writeJSONString(byte[] array, Writer out) throws IOException{
|
||||
if(array == null){
|
||||
out.write("null");
|
||||
} else if(array.length == 0) {
|
||||
out.write("[]");
|
||||
} else {
|
||||
out.write("[");
|
||||
out.write(String.valueOf(array[0]));
|
||||
|
||||
for(int i = 1; i < array.length; i++){
|
||||
out.write(",");
|
||||
out.write(String.valueOf(array[i]));
|
||||
}
|
||||
|
||||
out.write("]");
|
||||
}
|
||||
}
|
||||
|
||||
public static String toJSONString(byte[] array){
|
||||
final StringWriter writer = new StringWriter();
|
||||
|
||||
try {
|
||||
writeJSONString(array, writer);
|
||||
return writer.toString();
|
||||
} catch(IOException e){
|
||||
// This should never happen for a StringWriter
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
public static void writeJSONString(short[] array, Writer out) throws IOException{
|
||||
if(array == null){
|
||||
out.write("null");
|
||||
} else if(array.length == 0) {
|
||||
out.write("[]");
|
||||
} else {
|
||||
out.write("[");
|
||||
out.write(String.valueOf(array[0]));
|
||||
|
||||
for(int i = 1; i < array.length; i++){
|
||||
out.write(",");
|
||||
out.write(String.valueOf(array[i]));
|
||||
}
|
||||
|
||||
out.write("]");
|
||||
}
|
||||
}
|
||||
|
||||
public static String toJSONString(short[] array){
|
||||
final StringWriter writer = new StringWriter();
|
||||
|
||||
try {
|
||||
writeJSONString(array, writer);
|
||||
return writer.toString();
|
||||
} catch(IOException e){
|
||||
// This should never happen for a StringWriter
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
public static void writeJSONString(int[] array, Writer out) throws IOException{
|
||||
if(array == null){
|
||||
out.write("null");
|
||||
} else if(array.length == 0) {
|
||||
out.write("[]");
|
||||
} else {
|
||||
out.write("[");
|
||||
out.write(String.valueOf(array[0]));
|
||||
|
||||
for(int i = 1; i < array.length; i++){
|
||||
out.write(",");
|
||||
out.write(String.valueOf(array[i]));
|
||||
}
|
||||
|
||||
out.write("]");
|
||||
}
|
||||
}
|
||||
|
||||
public static String toJSONString(int[] array){
|
||||
final StringWriter writer = new StringWriter();
|
||||
|
||||
try {
|
||||
writeJSONString(array, writer);
|
||||
return writer.toString();
|
||||
} catch(IOException e){
|
||||
// This should never happen for a StringWriter
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
public static void writeJSONString(long[] array, Writer out) throws IOException{
|
||||
if(array == null){
|
||||
out.write("null");
|
||||
} else if(array.length == 0) {
|
||||
out.write("[]");
|
||||
} else {
|
||||
out.write("[");
|
||||
out.write(String.valueOf(array[0]));
|
||||
|
||||
for(int i = 1; i < array.length; i++){
|
||||
out.write(",");
|
||||
out.write(String.valueOf(array[i]));
|
||||
}
|
||||
|
||||
out.write("]");
|
||||
}
|
||||
}
|
||||
|
||||
public static String toJSONString(long[] array){
|
||||
final StringWriter writer = new StringWriter();
|
||||
|
||||
try {
|
||||
writeJSONString(array, writer);
|
||||
return writer.toString();
|
||||
} catch(IOException e){
|
||||
// This should never happen for a StringWriter
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
public static void writeJSONString(float[] array, Writer out) throws IOException{
|
||||
if(array == null){
|
||||
out.write("null");
|
||||
} else if(array.length == 0) {
|
||||
out.write("[]");
|
||||
} else {
|
||||
out.write("[");
|
||||
out.write(String.valueOf(array[0]));
|
||||
|
||||
for(int i = 1; i < array.length; i++){
|
||||
out.write(",");
|
||||
out.write(String.valueOf(array[i]));
|
||||
}
|
||||
|
||||
out.write("]");
|
||||
}
|
||||
}
|
||||
|
||||
public static String toJSONString(float[] array){
|
||||
final StringWriter writer = new StringWriter();
|
||||
|
||||
try {
|
||||
writeJSONString(array, writer);
|
||||
return writer.toString();
|
||||
} catch(IOException e){
|
||||
// This should never happen for a StringWriter
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
public static void writeJSONString(double[] array, Writer out) throws IOException{
|
||||
if(array == null){
|
||||
out.write("null");
|
||||
} else if(array.length == 0) {
|
||||
out.write("[]");
|
||||
} else {
|
||||
out.write("[");
|
||||
out.write(String.valueOf(array[0]));
|
||||
|
||||
for(int i = 1; i < array.length; i++){
|
||||
out.write(",");
|
||||
out.write(String.valueOf(array[i]));
|
||||
}
|
||||
|
||||
out.write("]");
|
||||
}
|
||||
}
|
||||
|
||||
public static String toJSONString(double[] array){
|
||||
final StringWriter writer = new StringWriter();
|
||||
|
||||
try {
|
||||
writeJSONString(array, writer);
|
||||
return writer.toString();
|
||||
} catch(IOException e){
|
||||
// This should never happen for a StringWriter
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
public static void writeJSONString(boolean[] array, Writer out) throws IOException{
|
||||
if(array == null){
|
||||
out.write("null");
|
||||
} else if(array.length == 0) {
|
||||
out.write("[]");
|
||||
} else {
|
||||
out.write("[");
|
||||
out.write(String.valueOf(array[0]));
|
||||
|
||||
for(int i = 1; i < array.length; i++){
|
||||
out.write(",");
|
||||
out.write(String.valueOf(array[i]));
|
||||
}
|
||||
|
||||
out.write("]");
|
||||
}
|
||||
}
|
||||
|
||||
public static String toJSONString(boolean[] array){
|
||||
final StringWriter writer = new StringWriter();
|
||||
|
||||
try {
|
||||
writeJSONString(array, writer);
|
||||
return writer.toString();
|
||||
} catch(IOException e){
|
||||
// This should never happen for a StringWriter
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
public static void writeJSONString(char[] array, Writer out) throws IOException{
|
||||
if(array == null){
|
||||
out.write("null");
|
||||
} else if(array.length == 0) {
|
||||
out.write("[]");
|
||||
} else {
|
||||
out.write("[\"");
|
||||
out.write(String.valueOf(array[0]));
|
||||
|
||||
for(int i = 1; i < array.length; i++){
|
||||
out.write("\",\"");
|
||||
out.write(String.valueOf(array[i]));
|
||||
}
|
||||
|
||||
out.write("\"]");
|
||||
}
|
||||
}
|
||||
|
||||
public static String toJSONString(char[] array){
|
||||
final StringWriter writer = new StringWriter();
|
||||
|
||||
try {
|
||||
writeJSONString(array, writer);
|
||||
return writer.toString();
|
||||
} catch(IOException e){
|
||||
// This should never happen for a StringWriter
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
public static void writeJSONString(Object[] array, Writer out) throws IOException{
|
||||
if(array == null){
|
||||
out.write("null");
|
||||
} else if(array.length == 0) {
|
||||
out.write("[]");
|
||||
} else {
|
||||
out.write("[");
|
||||
JSONValue.writeJSONString(array[0], out);
|
||||
|
||||
for(int i = 1; i < array.length; i++){
|
||||
out.write(",");
|
||||
JSONValue.writeJSONString(array[i], out);
|
||||
}
|
||||
|
||||
out.write("]");
|
||||
}
|
||||
}
|
||||
|
||||
public static String toJSONString(Object[] array){
|
||||
final StringWriter writer = new StringWriter();
|
||||
|
||||
try {
|
||||
writeJSONString(array, writer);
|
||||
return writer.toString();
|
||||
} catch(IOException e){
|
||||
// This should never happen for a StringWriter
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
public String toJSONString(){
|
||||
return toJSONString(this);
|
||||
}
|
||||
JSONValue.writeJSONString(value, out);
|
||||
}
|
||||
out.write(']');
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a string representation of this array. This is equivalent to
|
||||
* calling {@link JSONArray#toJSONString()}.
|
||||
*/
|
||||
public String toString() {
|
||||
return toJSONString();
|
||||
}
|
||||
public void writeJSONString(Writer out) throws IOException {
|
||||
writeJSONString(this, out);
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert a list to JSON text. The result is a JSON array. If this list is also a JSONAware, JSONAware specific
|
||||
* behaviours will be omitted at this top level.
|
||||
*
|
||||
* @param collection
|
||||
* @return JSON text, or "null" if list is null.
|
||||
* @see com.alibaba.nacos.client.logger.json.JSONValue#toJSONString(Object)
|
||||
*/
|
||||
public static String toJSONString(Collection collection) {
|
||||
final StringWriter writer = new StringWriter();
|
||||
|
||||
try {
|
||||
writeJSONString(collection, writer);
|
||||
return writer.toString();
|
||||
} catch (IOException e) {
|
||||
// This should never happen for a StringWriter
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
public static void writeJSONString(byte[] array, Writer out) throws IOException {
|
||||
if (array == null) {
|
||||
out.write("null");
|
||||
} else if (array.length == 0) {
|
||||
out.write("[]");
|
||||
} else {
|
||||
out.write("[");
|
||||
out.write(String.valueOf(array[0]));
|
||||
|
||||
for (int i = 1; i < array.length; i++) {
|
||||
out.write(",");
|
||||
out.write(String.valueOf(array[i]));
|
||||
}
|
||||
|
||||
out.write("]");
|
||||
}
|
||||
}
|
||||
|
||||
public static String toJSONString(byte[] array) {
|
||||
final StringWriter writer = new StringWriter();
|
||||
|
||||
try {
|
||||
writeJSONString(array, writer);
|
||||
return writer.toString();
|
||||
} catch (IOException e) {
|
||||
// This should never happen for a StringWriter
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
public static void writeJSONString(short[] array, Writer out) throws IOException {
|
||||
if (array == null) {
|
||||
out.write("null");
|
||||
} else if (array.length == 0) {
|
||||
out.write("[]");
|
||||
} else {
|
||||
out.write("[");
|
||||
out.write(String.valueOf(array[0]));
|
||||
|
||||
for (int i = 1; i < array.length; i++) {
|
||||
out.write(",");
|
||||
out.write(String.valueOf(array[i]));
|
||||
}
|
||||
|
||||
out.write("]");
|
||||
}
|
||||
}
|
||||
|
||||
public static String toJSONString(short[] array) {
|
||||
final StringWriter writer = new StringWriter();
|
||||
|
||||
try {
|
||||
writeJSONString(array, writer);
|
||||
return writer.toString();
|
||||
} catch (IOException e) {
|
||||
// This should never happen for a StringWriter
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
public static void writeJSONString(int[] array, Writer out) throws IOException {
|
||||
if (array == null) {
|
||||
out.write("null");
|
||||
} else if (array.length == 0) {
|
||||
out.write("[]");
|
||||
} else {
|
||||
out.write("[");
|
||||
out.write(String.valueOf(array[0]));
|
||||
|
||||
for (int i = 1; i < array.length; i++) {
|
||||
out.write(",");
|
||||
out.write(String.valueOf(array[i]));
|
||||
}
|
||||
|
||||
out.write("]");
|
||||
}
|
||||
}
|
||||
|
||||
public static String toJSONString(int[] array) {
|
||||
final StringWriter writer = new StringWriter();
|
||||
|
||||
try {
|
||||
writeJSONString(array, writer);
|
||||
return writer.toString();
|
||||
} catch (IOException e) {
|
||||
// This should never happen for a StringWriter
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
public static void writeJSONString(long[] array, Writer out) throws IOException {
|
||||
if (array == null) {
|
||||
out.write("null");
|
||||
} else if (array.length == 0) {
|
||||
out.write("[]");
|
||||
} else {
|
||||
out.write("[");
|
||||
out.write(String.valueOf(array[0]));
|
||||
|
||||
for (int i = 1; i < array.length; i++) {
|
||||
out.write(",");
|
||||
out.write(String.valueOf(array[i]));
|
||||
}
|
||||
|
||||
out.write("]");
|
||||
}
|
||||
}
|
||||
|
||||
public static String toJSONString(long[] array) {
|
||||
final StringWriter writer = new StringWriter();
|
||||
|
||||
try {
|
||||
writeJSONString(array, writer);
|
||||
return writer.toString();
|
||||
} catch (IOException e) {
|
||||
// This should never happen for a StringWriter
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
public static void writeJSONString(float[] array, Writer out) throws IOException {
|
||||
if (array == null) {
|
||||
out.write("null");
|
||||
} else if (array.length == 0) {
|
||||
out.write("[]");
|
||||
} else {
|
||||
out.write("[");
|
||||
out.write(String.valueOf(array[0]));
|
||||
|
||||
for (int i = 1; i < array.length; i++) {
|
||||
out.write(",");
|
||||
out.write(String.valueOf(array[i]));
|
||||
}
|
||||
|
||||
out.write("]");
|
||||
}
|
||||
}
|
||||
|
||||
public static String toJSONString(float[] array) {
|
||||
final StringWriter writer = new StringWriter();
|
||||
|
||||
try {
|
||||
writeJSONString(array, writer);
|
||||
return writer.toString();
|
||||
} catch (IOException e) {
|
||||
// This should never happen for a StringWriter
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
public static void writeJSONString(double[] array, Writer out) throws IOException {
|
||||
if (array == null) {
|
||||
out.write("null");
|
||||
} else if (array.length == 0) {
|
||||
out.write("[]");
|
||||
} else {
|
||||
out.write("[");
|
||||
out.write(String.valueOf(array[0]));
|
||||
|
||||
for (int i = 1; i < array.length; i++) {
|
||||
out.write(",");
|
||||
out.write(String.valueOf(array[i]));
|
||||
}
|
||||
|
||||
out.write("]");
|
||||
}
|
||||
}
|
||||
|
||||
public static String toJSONString(double[] array) {
|
||||
final StringWriter writer = new StringWriter();
|
||||
|
||||
try {
|
||||
writeJSONString(array, writer);
|
||||
return writer.toString();
|
||||
} catch (IOException e) {
|
||||
// This should never happen for a StringWriter
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
public static void writeJSONString(boolean[] array, Writer out) throws IOException {
|
||||
if (array == null) {
|
||||
out.write("null");
|
||||
} else if (array.length == 0) {
|
||||
out.write("[]");
|
||||
} else {
|
||||
out.write("[");
|
||||
out.write(String.valueOf(array[0]));
|
||||
|
||||
for (int i = 1; i < array.length; i++) {
|
||||
out.write(",");
|
||||
out.write(String.valueOf(array[i]));
|
||||
}
|
||||
|
||||
out.write("]");
|
||||
}
|
||||
}
|
||||
|
||||
public static String toJSONString(boolean[] array) {
|
||||
final StringWriter writer = new StringWriter();
|
||||
|
||||
try {
|
||||
writeJSONString(array, writer);
|
||||
return writer.toString();
|
||||
} catch (IOException e) {
|
||||
// This should never happen for a StringWriter
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
public static void writeJSONString(char[] array, Writer out) throws IOException {
|
||||
if (array == null) {
|
||||
out.write("null");
|
||||
} else if (array.length == 0) {
|
||||
out.write("[]");
|
||||
} else {
|
||||
out.write("[\"");
|
||||
out.write(String.valueOf(array[0]));
|
||||
|
||||
for (int i = 1; i < array.length; i++) {
|
||||
out.write("\",\"");
|
||||
out.write(String.valueOf(array[i]));
|
||||
}
|
||||
|
||||
out.write("\"]");
|
||||
}
|
||||
}
|
||||
|
||||
public static String toJSONString(char[] array) {
|
||||
final StringWriter writer = new StringWriter();
|
||||
|
||||
try {
|
||||
writeJSONString(array, writer);
|
||||
return writer.toString();
|
||||
} catch (IOException e) {
|
||||
// This should never happen for a StringWriter
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
public static void writeJSONString(Object[] array, Writer out) throws IOException {
|
||||
if (array == null) {
|
||||
out.write("null");
|
||||
} else if (array.length == 0) {
|
||||
out.write("[]");
|
||||
} else {
|
||||
out.write("[");
|
||||
JSONValue.writeJSONString(array[0], out);
|
||||
|
||||
for (int i = 1; i < array.length; i++) {
|
||||
out.write(",");
|
||||
JSONValue.writeJSONString(array[i], out);
|
||||
}
|
||||
|
||||
out.write("]");
|
||||
}
|
||||
}
|
||||
|
||||
public static String toJSONString(Object[] array) {
|
||||
final StringWriter writer = new StringWriter();
|
||||
|
||||
try {
|
||||
writeJSONString(array, writer);
|
||||
return writer.toString();
|
||||
} catch (IOException e) {
|
||||
// This should never happen for a StringWriter
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
public String toJSONString() {
|
||||
return toJSONString(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a string representation of this array. This is equivalent to calling {@link JSONArray#toJSONString()}.
|
||||
*/
|
||||
public String toString() {
|
||||
return toJSONString();
|
||||
}
|
||||
}
|
||||
|
@ -16,15 +16,16 @@
|
||||
package com.alibaba.nacos.client.logger.json;
|
||||
|
||||
/**
|
||||
* Beans that support customized output of JSON text shall implement this interface.
|
||||
* @author FangYidong<fangyidong@yahoo.com.cn>
|
||||
* Beans that support customized output of JSON text shall implement this interface.
|
||||
*
|
||||
* @author FangYidong<fangyidong @ yahoo.com.cn>
|
||||
*/
|
||||
@SuppressWarnings("PMD.ClassNamingShouldBeCamelRule")
|
||||
public interface JSONAware {
|
||||
/**
|
||||
* format change
|
||||
*
|
||||
* @return JSON text
|
||||
*/
|
||||
String toJSONString();
|
||||
/**
|
||||
* format change
|
||||
*
|
||||
* @return JSON text
|
||||
*/
|
||||
String toJSONString();
|
||||
}
|
||||
|
@ -28,125 +28,118 @@ import java.util.Map;
|
||||
|
||||
/**
|
||||
* A JSON object. Key value pairs are unordered. JSONObject supports java.util.Map interface.
|
||||
*
|
||||
* @author FangYidong<fangyidong@yahoo.com.cn>
|
||||
*
|
||||
* @author FangYidong<fangyidong @ yahoo.com.cn>
|
||||
*/
|
||||
@SuppressWarnings("PMD.ClassNamingShouldBeCamelRule")
|
||||
public class JSONObject extends HashMap implements Map, JSONAware, JSONStreamAware{
|
||||
|
||||
private static final long serialVersionUID = -503443796854799292L;
|
||||
|
||||
|
||||
public JSONObject() {
|
||||
super();
|
||||
}
|
||||
public class JSONObject extends HashMap implements Map, JSONAware, JSONStreamAware {
|
||||
|
||||
/**
|
||||
* Allows creation of a JSONObject from a Map. After that, both the
|
||||
* generated JSONObject and the Map can be modified independently.
|
||||
*
|
||||
* @param map
|
||||
*/
|
||||
public JSONObject(Map map) {
|
||||
super(map);
|
||||
}
|
||||
private static final long serialVersionUID = -503443796854799292L;
|
||||
|
||||
public JSONObject() {
|
||||
super();
|
||||
}
|
||||
|
||||
/**
|
||||
* Encode a map into JSON text and write it to out.
|
||||
* If this map is also a JSONAware or JSONStreamAware, JSONAware or JSONStreamAware specific behaviours will be ignored at this top level.
|
||||
*
|
||||
* @see com.alibaba.nacos.client.logger.json.JSONValue#writeJSONString(Object, Writer)
|
||||
*
|
||||
* Allows creation of a JSONObject from a Map. After that, both the generated JSONObject and the Map can be modified
|
||||
* independently.
|
||||
*
|
||||
* @param map
|
||||
*/
|
||||
public JSONObject(Map map) {
|
||||
super(map);
|
||||
}
|
||||
|
||||
/**
|
||||
* Encode a map into JSON text and write it to out. If this map is also a JSONAware or JSONStreamAware, JSONAware or
|
||||
* JSONStreamAware specific behaviours will be ignored at this top level.
|
||||
*
|
||||
* @param map
|
||||
* @param out
|
||||
* @see com.alibaba.nacos.client.logger.json.JSONValue#writeJSONString(Object, Writer)
|
||||
*/
|
||||
public static void writeJSONString(Map map, Writer out) throws IOException {
|
||||
if(map == null){
|
||||
out.write("null");
|
||||
return;
|
||||
}
|
||||
|
||||
boolean first = true;
|
||||
Iterator iter=map.entrySet().iterator();
|
||||
|
||||
public static void writeJSONString(Map map, Writer out) throws IOException {
|
||||
if (map == null) {
|
||||
out.write("null");
|
||||
return;
|
||||
}
|
||||
|
||||
boolean first = true;
|
||||
Iterator iter = map.entrySet().iterator();
|
||||
|
||||
out.write('{');
|
||||
while(iter.hasNext()){
|
||||
if (first) {
|
||||
first = false;
|
||||
}
|
||||
else {
|
||||
out.write(',');
|
||||
}
|
||||
Map.Entry entry = (Map.Entry) iter.next();
|
||||
while (iter.hasNext()) {
|
||||
if (first) {
|
||||
first = false;
|
||||
} else {
|
||||
out.write(',');
|
||||
}
|
||||
Map.Entry entry = (Map.Entry)iter.next();
|
||||
out.write('\"');
|
||||
out.write(escape(String.valueOf(entry.getKey())));
|
||||
out.write('\"');
|
||||
out.write(':');
|
||||
JSONValue.writeJSONString(entry.getValue(), out);
|
||||
}
|
||||
out.write('}');
|
||||
}
|
||||
JSONValue.writeJSONString(entry.getValue(), out);
|
||||
}
|
||||
out.write('}');
|
||||
}
|
||||
|
||||
public void writeJSONString(Writer out) throws IOException{
|
||||
writeJSONString(this, out);
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert a map to JSON text. The result is a JSON object.
|
||||
* If this map is also a JSONAware, JSONAware specific behaviours will be omitted at this top level.
|
||||
*
|
||||
* @see com.alibaba.nacos.client.logger.json.JSONValue#toJSONString(Object)
|
||||
*
|
||||
* @param map
|
||||
* @return JSON text, or "null" if map is null.
|
||||
*/
|
||||
public static String toJSONString(Map map){
|
||||
final StringWriter writer = new StringWriter();
|
||||
|
||||
try {
|
||||
writeJSONString(map, writer);
|
||||
return writer.toString();
|
||||
} catch (IOException e) {
|
||||
// This should never happen with a StringWriter
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
public String toJSONString(){
|
||||
return toJSONString(this);
|
||||
}
|
||||
|
||||
public String toString(){
|
||||
return toJSONString();
|
||||
}
|
||||
public void writeJSONString(Writer out) throws IOException {
|
||||
writeJSONString(this, out);
|
||||
}
|
||||
|
||||
public static String toString(String key,Object value){
|
||||
/**
|
||||
* Convert a map to JSON text. The result is a JSON object. If this map is also a JSONAware, JSONAware specific
|
||||
* behaviours will be omitted at this top level.
|
||||
*
|
||||
* @param map
|
||||
* @return JSON text, or "null" if map is null.
|
||||
* @see com.alibaba.nacos.client.logger.json.JSONValue#toJSONString(Object)
|
||||
*/
|
||||
public static String toJSONString(Map map) {
|
||||
final StringWriter writer = new StringWriter();
|
||||
|
||||
try {
|
||||
writeJSONString(map, writer);
|
||||
return writer.toString();
|
||||
} catch (IOException e) {
|
||||
// This should never happen with a StringWriter
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
public String toJSONString() {
|
||||
return toJSONString(this);
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return toJSONString();
|
||||
}
|
||||
|
||||
public static String toString(String key, Object value) {
|
||||
StringBuffer sb = new StringBuffer();
|
||||
sb.append('\"');
|
||||
if(key == null) {
|
||||
if (key == null) {
|
||||
sb.append("null");
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
JSONValue.escape(key, sb);
|
||||
}
|
||||
sb.append('\"').append(':');
|
||||
|
||||
sb.append(JSONValue.toJSONString(value));
|
||||
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Escape quotes, \, /, \r, \n, \b, \f, \t and other control characters (U+0000 through U+001F).
|
||||
* It's the same as JSONValue.escape() only for compatibility here.
|
||||
*
|
||||
* @see com.alibaba.nacos.client.logger.json.JSONValue#escape(String)
|
||||
*
|
||||
* @param s
|
||||
* @return
|
||||
*/
|
||||
public static String escape(String s){
|
||||
return JSONValue.escape(s);
|
||||
}
|
||||
sb.append('\"').append(':');
|
||||
|
||||
sb.append(JSONValue.toJSONString(value));
|
||||
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Escape quotes, \, /, \r, \n, \b, \f, \t and other control characters (U+0000 through U+001F). It's the same as
|
||||
* JSONValue.escape() only for compatibility here.
|
||||
*
|
||||
* @param s
|
||||
* @return
|
||||
* @see com.alibaba.nacos.client.logger.json.JSONValue#escape(String)
|
||||
*/
|
||||
public static String escape(String s) {
|
||||
return JSONValue.escape(s);
|
||||
}
|
||||
}
|
||||
|
@ -19,20 +19,17 @@ import java.io.IOException;
|
||||
import java.io.Writer;
|
||||
|
||||
/**
|
||||
* Beans that support customized output of JSON text to a writer shall implement
|
||||
* this interface.
|
||||
*
|
||||
* @author FangYidong<fangyidong@yahoo.com.cn>
|
||||
* Beans that support customized output of JSON text to a writer shall implement this interface.
|
||||
*
|
||||
* @author FangYidong<fangyidong @ yahoo.com.cn>
|
||||
*/
|
||||
@SuppressWarnings("PMD.ClassNamingShouldBeCamelRule")
|
||||
public interface JSONStreamAware {
|
||||
/**
|
||||
* write JSON string to out.
|
||||
*
|
||||
* @param out
|
||||
* out writer
|
||||
* @throws IOException
|
||||
* Exception
|
||||
*/
|
||||
void writeJSONString(Writer out) throws IOException;
|
||||
/**
|
||||
* write JSON string to out.
|
||||
*
|
||||
* @param out out writer
|
||||
* @throws IOException Exception
|
||||
*/
|
||||
void writeJSONString(Writer out) throws IOException;
|
||||
}
|
||||
|
@ -30,314 +30,286 @@ import java.util.Map;
|
||||
import com.alibaba.nacos.client.logger.json.parser.JSONParser;
|
||||
import com.alibaba.nacos.client.logger.json.parser.ParseException;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @author FangYidong<fangyidong@yahoo.com.cn>
|
||||
* @author FangYidong<fangyidong @ yahoo.com.cn>
|
||||
*/
|
||||
@SuppressWarnings("PMD.ClassNamingShouldBeCamelRule")
|
||||
public class JSONValue {
|
||||
/**
|
||||
* Parse JSON text into java object from the input source.
|
||||
* Please use parseWithException() if you don't want to ignore the exception.
|
||||
*
|
||||
* @see com.alibaba.nacos.client.logger.jsonparser.JSONParser#parse(Reader)
|
||||
* @see #parseWithException(Reader)
|
||||
*
|
||||
* @param in
|
||||
* @return Instance of the following:
|
||||
* com.alibaba.nacos.client.logger.jsonJSONObject,
|
||||
* com.alibaba.nacos.client.logger.jsonJSONArray,
|
||||
* java.lang.String,
|
||||
* java.lang.Number,
|
||||
* java.lang.Boolean,
|
||||
* null
|
||||
*
|
||||
* @deprecated this method may throw an {@code Error} instead of returning
|
||||
* {@code null}; please use {@link JSONValue#parseWithException(Reader)}
|
||||
* instead
|
||||
*/
|
||||
public static Object parse(Reader in){
|
||||
try{
|
||||
JSONParser parser=new JSONParser();
|
||||
return parser.parse(in);
|
||||
}
|
||||
catch(Exception e){
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse JSON text into java object from the given string.
|
||||
* Please use parseWithException() if you don't want to ignore the exception.
|
||||
*
|
||||
* @see com.alibaba.nacos.client.logger.jsonparser.JSONParser#parse(Reader)
|
||||
* @see #parseWithException(Reader)
|
||||
*
|
||||
* @param s
|
||||
* @return Instance of the following:
|
||||
* com.alibaba.nacos.client.logger.jsonJSONObject,
|
||||
* com.alibaba.nacos.client.logger.jsonJSONArray,
|
||||
* java.lang.String,
|
||||
* java.lang.Number,
|
||||
* java.lang.Boolean,
|
||||
* null
|
||||
*
|
||||
* @deprecated this method may throw an {@code Error} instead of returning
|
||||
* {@code null}; please use {@link JSONValue#parseWithException(String)}
|
||||
* instead
|
||||
*/
|
||||
public static Object parse(String s){
|
||||
StringReader in=new StringReader(s);
|
||||
return parse(in);
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse JSON text into java object from the input source.
|
||||
*
|
||||
* @see com.alibaba.nacos.client.logger.jsonparser.JSONParser
|
||||
*
|
||||
* @param in
|
||||
* @return Instance of the following:
|
||||
* com.alibaba.nacos.client.logger.jsonJSONObject,
|
||||
* com.alibaba.nacos.client.logger.jsonJSONArray,
|
||||
* java.lang.String,
|
||||
* java.lang.Number,
|
||||
* java.lang.Boolean,
|
||||
* null
|
||||
*
|
||||
* @throws IOException
|
||||
* @throws ParseException
|
||||
*/
|
||||
public static Object parseWithException(Reader in) throws IOException, ParseException {
|
||||
JSONParser parser=new JSONParser();
|
||||
return parser.parse(in);
|
||||
}
|
||||
|
||||
public static Object parseWithException(String s) throws ParseException{
|
||||
JSONParser parser=new JSONParser();
|
||||
return parser.parse(s);
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse JSON text into java object from the input source. Please use parseWithException() if you don't want to
|
||||
* ignore the exception.
|
||||
*
|
||||
* @param in
|
||||
* @return Instance of the following: com.alibaba.nacos.client.logger.jsonJSONObject,
|
||||
* com.alibaba.nacos.client.logger.jsonJSONArray, java.lang.String, java.lang.Number, java.lang.Boolean, null
|
||||
* @see com.alibaba.nacos.client.logger.jsonparser.JSONParser#parse(Reader)
|
||||
* @see #parseWithException(Reader)
|
||||
* @deprecated this method may throw an {@code Error} instead of returning {@code null}; please use {@link
|
||||
* JSONValue#parseWithException(Reader)} instead
|
||||
*/
|
||||
public static Object parse(Reader in) {
|
||||
try {
|
||||
JSONParser parser = new JSONParser();
|
||||
return parser.parse(in);
|
||||
} catch (Exception e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse JSON text into java object from the given string. Please use parseWithException() if you don't want to
|
||||
* ignore the exception.
|
||||
*
|
||||
* @param s
|
||||
* @return Instance of the following: com.alibaba.nacos.client.logger.jsonJSONObject,
|
||||
* com.alibaba.nacos.client.logger.jsonJSONArray, java.lang.String, java.lang.Number, java.lang.Boolean, null
|
||||
* @see com.alibaba.nacos.client.logger.jsonparser.JSONParser#parse(Reader)
|
||||
* @see #parseWithException(Reader)
|
||||
* @deprecated this method may throw an {@code Error} instead of returning {@code null}; please use {@link
|
||||
* JSONValue#parseWithException(String)} instead
|
||||
*/
|
||||
public static Object parse(String s) {
|
||||
StringReader in = new StringReader(s);
|
||||
return parse(in);
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse JSON text into java object from the input source.
|
||||
*
|
||||
* @param in
|
||||
* @return Instance of the following: com.alibaba.nacos.client.logger.jsonJSONObject,
|
||||
* com.alibaba.nacos.client.logger.jsonJSONArray, java.lang.String, java.lang.Number, java.lang.Boolean, null
|
||||
* @throws IOException
|
||||
* @throws ParseException
|
||||
* @see com.alibaba.nacos.client.logger.jsonparser.JSONParser
|
||||
*/
|
||||
public static Object parseWithException(Reader in) throws IOException, ParseException {
|
||||
JSONParser parser = new JSONParser();
|
||||
return parser.parse(in);
|
||||
}
|
||||
|
||||
public static Object parseWithException(String s) throws ParseException {
|
||||
JSONParser parser = new JSONParser();
|
||||
return parser.parse(s);
|
||||
}
|
||||
|
||||
/**
|
||||
* Encode an object into JSON text and write it to out.
|
||||
* <p>
|
||||
* If this object is a Map or a List, and it's also a JSONStreamAware or a JSONAware, JSONStreamAware or JSONAware will be considered firstly.
|
||||
* If this object is a Map or a List, and it's also a JSONStreamAware or a JSONAware, JSONStreamAware or JSONAware
|
||||
* will be considered firstly.
|
||||
* <p>
|
||||
* DO NOT call this method from writeJSONString(Writer) of a class that implements both JSONStreamAware and (Map or List) with
|
||||
* "this" as the first parameter, use JSONObject.writeJSONString(Map, Writer) or JSONArray.writeJSONString(List, Writer) instead.
|
||||
*
|
||||
* @see com.alibaba.nacos.client.logger.jsonJSONObject#writeJSONString(Map, Writer)
|
||||
* @see com.alibaba.nacos.client.logger.jsonJSONArray#writeJSONString(List, Writer)
|
||||
*
|
||||
* DO NOT call this method from writeJSONString(Writer) of a class that implements both JSONStreamAware and (Map or
|
||||
* List) with "this" as the first parameter, use JSONObject.writeJSONString(Map, Writer) or
|
||||
* JSONArray.writeJSONString(List, Writer) instead.
|
||||
*
|
||||
* @param value
|
||||
* @param writer
|
||||
* @see com.alibaba.nacos.client.logger.jsonJSONObject#writeJSONString(Map, Writer)
|
||||
* @see com.alibaba.nacos.client.logger.jsonJSONArray#writeJSONString(List, Writer)
|
||||
*/
|
||||
public static void writeJSONString(Object value, Writer out) throws IOException {
|
||||
if(value == null){
|
||||
out.write("null");
|
||||
return;
|
||||
}
|
||||
|
||||
if(value instanceof String){
|
||||
out.write('\"');
|
||||
out.write(escape((String)value));
|
||||
out.write('\"');
|
||||
return;
|
||||
}
|
||||
|
||||
if(value instanceof Double){
|
||||
if(((Double)value).isInfinite() || ((Double)value).isNaN()) {
|
||||
out.write("null");
|
||||
}
|
||||
else {
|
||||
out.write(value.toString());
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if(value instanceof Float){
|
||||
if(((Float)value).isInfinite() || ((Float)value).isNaN()) {
|
||||
out.write("null");
|
||||
}
|
||||
else {
|
||||
out.write(value.toString());
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if(value instanceof Number){
|
||||
out.write(value.toString());
|
||||
return;
|
||||
}
|
||||
|
||||
if(value instanceof Boolean){
|
||||
out.write(value.toString());
|
||||
return;
|
||||
}
|
||||
|
||||
if((value instanceof JSONStreamAware)){
|
||||
((JSONStreamAware)value).writeJSONString(out);
|
||||
return;
|
||||
}
|
||||
|
||||
if((value instanceof JSONAware)){
|
||||
out.write(((JSONAware)value).toJSONString());
|
||||
return;
|
||||
}
|
||||
|
||||
if(value instanceof Map){
|
||||
JSONObject.writeJSONString((Map)value, out);
|
||||
return;
|
||||
}
|
||||
|
||||
if(value instanceof Collection){
|
||||
JSONArray.writeJSONString((Collection)value, out);
|
||||
public static void writeJSONString(Object value, Writer out) throws IOException {
|
||||
if (value == null) {
|
||||
out.write("null");
|
||||
return;
|
||||
}
|
||||
|
||||
if(value instanceof byte[]){
|
||||
JSONArray.writeJSONString((byte[])value, out);
|
||||
return;
|
||||
}
|
||||
|
||||
if(value instanceof short[]){
|
||||
JSONArray.writeJSONString((short[])value, out);
|
||||
return;
|
||||
}
|
||||
|
||||
if(value instanceof int[]){
|
||||
JSONArray.writeJSONString((int[])value, out);
|
||||
return;
|
||||
}
|
||||
|
||||
if(value instanceof long[]){
|
||||
JSONArray.writeJSONString((long[])value, out);
|
||||
return;
|
||||
}
|
||||
|
||||
if(value instanceof float[]){
|
||||
JSONArray.writeJSONString((float[])value, out);
|
||||
return;
|
||||
}
|
||||
|
||||
if(value instanceof double[]){
|
||||
JSONArray.writeJSONString((double[])value, out);
|
||||
return;
|
||||
}
|
||||
|
||||
if(value instanceof boolean[]){
|
||||
JSONArray.writeJSONString((boolean[])value, out);
|
||||
return;
|
||||
}
|
||||
|
||||
if(value instanceof char[]){
|
||||
JSONArray.writeJSONString((char[])value, out);
|
||||
return;
|
||||
}
|
||||
|
||||
if(value instanceof Object[]){
|
||||
JSONArray.writeJSONString((Object[])value, out);
|
||||
return;
|
||||
}
|
||||
|
||||
out.write(value.toString());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert an object to JSON text.
|
||||
* <p>
|
||||
* If this object is a Map or a List, and it's also a JSONAware, JSONAware will be considered firstly.
|
||||
* <p>
|
||||
* DO NOT call this method from toJSONString() of a class that implements both JSONAware and Map or List with
|
||||
* "this" as the parameter, use JSONObject.toJSONString(Map) or JSONArray.toJSONString(List) instead.
|
||||
*
|
||||
* @see com.alibaba.nacos.client.logger.json.JSONObject#toJSONString(Map)
|
||||
*
|
||||
* @param value
|
||||
* @return JSON text, or "null" if value is null or it's an NaN or an INF number.
|
||||
*/
|
||||
public static String toJSONString(Object value){
|
||||
final StringWriter writer = new StringWriter();
|
||||
|
||||
try{
|
||||
writeJSONString(value, writer);
|
||||
return writer.toString();
|
||||
} catch(IOException e){
|
||||
// This should never happen for a StringWriter
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
if (value instanceof String) {
|
||||
out.write('\"');
|
||||
out.write(escape((String)value));
|
||||
out.write('\"');
|
||||
return;
|
||||
}
|
||||
|
||||
/**
|
||||
* Escape quotes, \, /, \r, \n, \b, \f, \t and other control characters (U+0000 through U+001F).
|
||||
* @param s
|
||||
* @return
|
||||
*/
|
||||
public static String escape(String s){
|
||||
if(s==null) {
|
||||
return null;
|
||||
}
|
||||
if (value instanceof Double) {
|
||||
if (((Double)value).isInfinite() || ((Double)value).isNaN()) {
|
||||
out.write("null");
|
||||
} else {
|
||||
out.write(value.toString());
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (value instanceof Float) {
|
||||
if (((Float)value).isInfinite() || ((Float)value).isNaN()) {
|
||||
out.write("null");
|
||||
} else {
|
||||
out.write(value.toString());
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (value instanceof Number) {
|
||||
out.write(value.toString());
|
||||
return;
|
||||
}
|
||||
|
||||
if (value instanceof Boolean) {
|
||||
out.write(value.toString());
|
||||
return;
|
||||
}
|
||||
|
||||
if ((value instanceof JSONStreamAware)) {
|
||||
((JSONStreamAware)value).writeJSONString(out);
|
||||
return;
|
||||
}
|
||||
|
||||
if ((value instanceof JSONAware)) {
|
||||
out.write(((JSONAware)value).toJSONString());
|
||||
return;
|
||||
}
|
||||
|
||||
if (value instanceof Map) {
|
||||
JSONObject.writeJSONString((Map)value, out);
|
||||
return;
|
||||
}
|
||||
|
||||
if (value instanceof Collection) {
|
||||
JSONArray.writeJSONString((Collection)value, out);
|
||||
return;
|
||||
}
|
||||
|
||||
if (value instanceof byte[]) {
|
||||
JSONArray.writeJSONString((byte[])value, out);
|
||||
return;
|
||||
}
|
||||
|
||||
if (value instanceof short[]) {
|
||||
JSONArray.writeJSONString((short[])value, out);
|
||||
return;
|
||||
}
|
||||
|
||||
if (value instanceof int[]) {
|
||||
JSONArray.writeJSONString((int[])value, out);
|
||||
return;
|
||||
}
|
||||
|
||||
if (value instanceof long[]) {
|
||||
JSONArray.writeJSONString((long[])value, out);
|
||||
return;
|
||||
}
|
||||
|
||||
if (value instanceof float[]) {
|
||||
JSONArray.writeJSONString((float[])value, out);
|
||||
return;
|
||||
}
|
||||
|
||||
if (value instanceof double[]) {
|
||||
JSONArray.writeJSONString((double[])value, out);
|
||||
return;
|
||||
}
|
||||
|
||||
if (value instanceof boolean[]) {
|
||||
JSONArray.writeJSONString((boolean[])value, out);
|
||||
return;
|
||||
}
|
||||
|
||||
if (value instanceof char[]) {
|
||||
JSONArray.writeJSONString((char[])value, out);
|
||||
return;
|
||||
}
|
||||
|
||||
if (value instanceof Object[]) {
|
||||
JSONArray.writeJSONString((Object[])value, out);
|
||||
return;
|
||||
}
|
||||
|
||||
out.write(value.toString());
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert an object to JSON text.
|
||||
* <p>
|
||||
* If this object is a Map or a List, and it's also a JSONAware, JSONAware will be considered firstly.
|
||||
* <p>
|
||||
* DO NOT call this method from toJSONString() of a class that implements both JSONAware and Map or List with "this"
|
||||
* as the parameter, use JSONObject.toJSONString(Map) or JSONArray.toJSONString(List) instead.
|
||||
*
|
||||
* @param value
|
||||
* @return JSON text, or "null" if value is null or it's an NaN or an INF number.
|
||||
* @see com.alibaba.nacos.client.logger.json.JSONObject#toJSONString(Map)
|
||||
*/
|
||||
public static String toJSONString(Object value) {
|
||||
final StringWriter writer = new StringWriter();
|
||||
|
||||
try {
|
||||
writeJSONString(value, writer);
|
||||
return writer.toString();
|
||||
} catch (IOException e) {
|
||||
// This should never happen for a StringWriter
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Escape quotes, \, /, \r, \n, \b, \f, \t and other control characters (U+0000 through U+001F).
|
||||
*
|
||||
* @param s
|
||||
* @return
|
||||
*/
|
||||
public static String escape(String s) {
|
||||
if (s == null) {
|
||||
return null;
|
||||
}
|
||||
StringBuffer sb = new StringBuffer();
|
||||
escape(s, sb);
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param s - Must not be null.
|
||||
* @param s - Must not be null.
|
||||
* @param sb
|
||||
*/
|
||||
static void escape(String s, StringBuffer sb) {
|
||||
final int len = s.length();
|
||||
for(int i=0;i<len;i++){
|
||||
char ch=s.charAt(i);
|
||||
switch(ch){
|
||||
case '"':
|
||||
sb.append("\\\"");
|
||||
break;
|
||||
case '\\':
|
||||
sb.append("\\\\");
|
||||
break;
|
||||
case '\b':
|
||||
sb.append("\\b");
|
||||
break;
|
||||
case '\f':
|
||||
sb.append("\\f");
|
||||
break;
|
||||
case '\n':
|
||||
sb.append("\\n");
|
||||
break;
|
||||
case '\r':
|
||||
sb.append("\\r");
|
||||
break;
|
||||
case '\t':
|
||||
sb.append("\\t");
|
||||
break;
|
||||
case '/':
|
||||
sb.append("\\/");
|
||||
break;
|
||||
default:
|
||||
//Reference: http://www.unicode.org/versions/Unicode5.1.0/
|
||||
if(isUnicodeChar(ch)){
|
||||
String ss=Integer.toHexString(ch);
|
||||
sb.append("\\u");
|
||||
for(int k=0;k<FOUR-ss.length();k++){
|
||||
sb.append('0');
|
||||
}
|
||||
sb.append(ss.toUpperCase());
|
||||
}
|
||||
else{
|
||||
sb.append(ch);
|
||||
}
|
||||
}
|
||||
}//for
|
||||
}
|
||||
|
||||
private static boolean isUnicodeChar(char ch) {
|
||||
return (ch >= '\u0000' && ch <= '\u001F') || (ch >= '\u007F' && ch <= '\u009F')
|
||||
|| (ch >= '\u2000' && ch <= '\u20FF');
|
||||
}
|
||||
|
||||
private static int FOUR = 4;
|
||||
final int len = s.length();
|
||||
for (int i = 0; i < len; i++) {
|
||||
char ch = s.charAt(i);
|
||||
switch (ch) {
|
||||
case '"':
|
||||
sb.append("\\\"");
|
||||
break;
|
||||
case '\\':
|
||||
sb.append("\\\\");
|
||||
break;
|
||||
case '\b':
|
||||
sb.append("\\b");
|
||||
break;
|
||||
case '\f':
|
||||
sb.append("\\f");
|
||||
break;
|
||||
case '\n':
|
||||
sb.append("\\n");
|
||||
break;
|
||||
case '\r':
|
||||
sb.append("\\r");
|
||||
break;
|
||||
case '\t':
|
||||
sb.append("\\t");
|
||||
break;
|
||||
case '/':
|
||||
sb.append("\\/");
|
||||
break;
|
||||
default:
|
||||
//Reference: http://www.unicode.org/versions/Unicode5.1.0/
|
||||
if (isUnicodeChar(ch)) {
|
||||
String ss = Integer.toHexString(ch);
|
||||
sb.append("\\u");
|
||||
for (int k = 0; k < FOUR - ss.length(); k++) {
|
||||
sb.append('0');
|
||||
}
|
||||
sb.append(ss.toUpperCase());
|
||||
} else {
|
||||
sb.append(ch);
|
||||
}
|
||||
}
|
||||
}//for
|
||||
}
|
||||
|
||||
private static boolean isUnicodeChar(char ch) {
|
||||
return (ch >= '\u0000' && ch <= '\u001F') || (ch >= '\u007F' && ch <= '\u009F')
|
||||
|| (ch >= '\u2000' && ch <= '\u20FF');
|
||||
}
|
||||
|
||||
private static int FOUR = 4;
|
||||
|
||||
}
|
||||
|
@ -20,21 +20,24 @@ import java.util.Map;
|
||||
|
||||
/**
|
||||
* Container factory for creating containers for JSON object and JSON array.
|
||||
*
|
||||
*
|
||||
* @author FangYidong<fangyidong @ yahoo.com.cn>
|
||||
* @see com.alibaba.nacos.client.logger.json.parser.JSONParser#parse(java.io.Reader, ContainerFactory)
|
||||
*
|
||||
* @author FangYidong<fangyidong@yahoo.com.cn>
|
||||
*/
|
||||
public interface ContainerFactory {
|
||||
/**
|
||||
* create json container
|
||||
* @return A Map instance to store JSON object, or null if you want to use com.alibaba.nacos.client.logger.jsonJSONObject.
|
||||
*/
|
||||
Map createObjectContainer();
|
||||
|
||||
/**
|
||||
* create array json container
|
||||
* @return A List instance to store JSON array, or null if you want to use com.alibaba.nacos.client.logger.jsonJSONArray.
|
||||
*/
|
||||
List creatArrayContainer();
|
||||
/**
|
||||
* create json container
|
||||
*
|
||||
* @return A Map instance to store JSON object, or null if you want to use com.alibaba.nacos.client.logger
|
||||
* .jsonJSONObject.
|
||||
*/
|
||||
Map createObjectContainer();
|
||||
|
||||
/**
|
||||
* create array json container
|
||||
*
|
||||
* @return A List instance to store JSON array, or null if you want to use com.alibaba.nacos.client.logger
|
||||
* .jsonJSONArray.
|
||||
*/
|
||||
List creatArrayContainer();
|
||||
}
|
||||
|
@ -18,112 +18,100 @@ package com.alibaba.nacos.client.logger.json.parser;
|
||||
import java.io.IOException;
|
||||
|
||||
/**
|
||||
* A simplified and stoppable SAX-like content handler for stream processing of JSON text.
|
||||
*
|
||||
* A simplified and stoppable SAX-like content handler for stream processing of JSON text.
|
||||
*
|
||||
* @author FangYidong<fangyidong @ yahoo.com.cn>
|
||||
* @see org.xml.sax.ContentHandler
|
||||
* @see com.alibaba.nacos.client.logger.json.parser.JSONParser#parse(java.io.Reader, ContentHandler, boolean)
|
||||
*
|
||||
* @author FangYidong<fangyidong@yahoo.com.cn>
|
||||
*/
|
||||
public interface ContentHandler {
|
||||
/**
|
||||
* Receive notification of the beginning of JSON processing.
|
||||
* The parser will invoke this method only once.
|
||||
*
|
||||
* @throws ParseException
|
||||
* - JSONParser will stop and throw the same exception to the caller when receiving this exception.
|
||||
/**
|
||||
* Receive notification of the beginning of JSON processing. The parser will invoke this method only once.
|
||||
*
|
||||
* @throws ParseException - JSONParser will stop and throw the same exception to the caller when receiving this
|
||||
* exception.
|
||||
* @throws IOException
|
||||
*/
|
||||
void startJSON() throws ParseException, IOException;
|
||||
|
||||
/**
|
||||
* Receive notification of the end of JSON processing.
|
||||
*
|
||||
* @throws ParseException
|
||||
* @throws IOException
|
||||
*/
|
||||
void endJSON() throws ParseException, IOException;
|
||||
|
||||
/**
|
||||
* Receive notification of the beginning of a JSON object.
|
||||
*
|
||||
* @return false if the handler wants to stop parsing after return.
|
||||
* @throws ParseException
|
||||
* - JSONParser will stop and throw the same exception to the caller when receiving this exception.
|
||||
*/
|
||||
void startJSON() throws ParseException, IOException;
|
||||
|
||||
/**
|
||||
* Receive notification of the end of JSON processing.
|
||||
*
|
||||
* @throws ParseException
|
||||
* @throws IOException
|
||||
*/
|
||||
void endJSON() throws ParseException, IOException;
|
||||
|
||||
/**
|
||||
* Receive notification of the beginning of a JSON object.
|
||||
*
|
||||
* @return false if the handler wants to stop parsing after return.
|
||||
* @throws ParseException - JSONParser will stop and throw the same exception to the caller when receiving this
|
||||
* exception.
|
||||
* @throws IOException
|
||||
* @see #endJSON
|
||||
*/
|
||||
boolean startObject() throws ParseException, IOException;
|
||||
|
||||
/**
|
||||
* Receive notification of the end of a JSON object.
|
||||
*
|
||||
* @return false if the handler wants to stop parsing after return.
|
||||
* @throws ParseException
|
||||
* @throws IOException
|
||||
*/
|
||||
boolean startObject() throws ParseException, IOException;
|
||||
|
||||
/**
|
||||
* Receive notification of the end of a JSON object.
|
||||
*
|
||||
* @return false if the handler wants to stop parsing after return.
|
||||
* @throws ParseException
|
||||
* @throws IOException
|
||||
* @see #startObject
|
||||
*/
|
||||
boolean endObject() throws ParseException, IOException;
|
||||
|
||||
/**
|
||||
* Receive notification of the beginning of a JSON object entry.
|
||||
*
|
||||
* @param key - Key of a JSON object entry.
|
||||
*
|
||||
* @return false if the handler wants to stop parsing after return.
|
||||
* @throws ParseException
|
||||
* @throws IOException
|
||||
*/
|
||||
boolean endObject() throws ParseException, IOException;
|
||||
|
||||
/**
|
||||
* Receive notification of the beginning of a JSON object entry.
|
||||
*
|
||||
* @param key - Key of a JSON object entry.
|
||||
* @return false if the handler wants to stop parsing after return.
|
||||
* @throws ParseException
|
||||
* @throws IOException
|
||||
* @see #endObjectEntry
|
||||
*/
|
||||
boolean startObjectEntry(String key) throws ParseException, IOException;
|
||||
|
||||
/**
|
||||
* Receive notification of the end of the value of previous object entry.
|
||||
*
|
||||
* @return false if the handler wants to stop parsing after return.
|
||||
* @throws ParseException
|
||||
* @throws IOException
|
||||
*/
|
||||
boolean startObjectEntry(String key) throws ParseException, IOException;
|
||||
|
||||
/**
|
||||
* Receive notification of the end of the value of previous object entry.
|
||||
*
|
||||
* @return false if the handler wants to stop parsing after return.
|
||||
* @throws ParseException
|
||||
* @throws IOException
|
||||
* @see #startObjectEntry
|
||||
*/
|
||||
boolean endObjectEntry() throws ParseException, IOException;
|
||||
|
||||
/**
|
||||
* Receive notification of the beginning of a JSON array.
|
||||
*
|
||||
* @return false if the handler wants to stop parsing after return.
|
||||
* @throws ParseException
|
||||
* @throws IOException
|
||||
*/
|
||||
boolean endObjectEntry() throws ParseException, IOException;
|
||||
|
||||
/**
|
||||
* Receive notification of the beginning of a JSON array.
|
||||
*
|
||||
* @return false if the handler wants to stop parsing after return.
|
||||
* @throws ParseException
|
||||
* @throws IOException
|
||||
* @see #endArray
|
||||
*/
|
||||
boolean startArray() throws ParseException, IOException;
|
||||
|
||||
/**
|
||||
* Receive notification of the end of a JSON array.
|
||||
*
|
||||
* @return false if the handler wants to stop parsing after return.
|
||||
* @throws ParseException
|
||||
* @throws IOException
|
||||
*/
|
||||
boolean startArray() throws ParseException, IOException;
|
||||
|
||||
/**
|
||||
* Receive notification of the end of a JSON array.
|
||||
*
|
||||
* @return false if the handler wants to stop parsing after return.
|
||||
* @throws ParseException
|
||||
* @throws IOException
|
||||
* @see #startArray
|
||||
*/
|
||||
boolean endArray() throws ParseException, IOException;
|
||||
|
||||
/**
|
||||
* Receive notification of the JSON primitive values:
|
||||
* java.lang.String,
|
||||
* java.lang.Number,
|
||||
* java.lang.Boolean
|
||||
* null
|
||||
*
|
||||
* @param value - Instance of the following:
|
||||
* java.lang.String,
|
||||
* java.lang.Number,
|
||||
* java.lang.Boolean
|
||||
* null
|
||||
*
|
||||
* @return false if the handler wants to stop parsing after return.
|
||||
* @throws ParseException
|
||||
* @throws IOException
|
||||
*/
|
||||
boolean primitive(Object value) throws ParseException, IOException;
|
||||
|
||||
*/
|
||||
boolean endArray() throws ParseException, IOException;
|
||||
|
||||
/**
|
||||
* Receive notification of the JSON primitive values: java.lang.String, java.lang.Number, java.lang.Boolean null
|
||||
*
|
||||
* @param value - Instance of the following: java.lang.String, java.lang.Number, java.lang.Boolean null
|
||||
* @return false if the handler wants to stop parsing after return.
|
||||
* @throws ParseException
|
||||
* @throws IOException
|
||||
*/
|
||||
boolean primitive(Object value) throws ParseException, IOException;
|
||||
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -17,89 +17,87 @@ package com.alibaba.nacos.client.logger.json.parser;
|
||||
|
||||
/**
|
||||
* ParseException explains why and where the error occurs in source JSON text.
|
||||
*
|
||||
* @author FangYidong<fangyidong@yahoo.com.cn>
|
||||
*
|
||||
* @author FangYidong<fangyidong @ yahoo.com.cn>
|
||||
*/
|
||||
public class ParseException extends Exception {
|
||||
private static final long serialVersionUID = -7880698968187728547L;
|
||||
|
||||
public static final int ERROR_UNEXPECTED_CHAR = 0;
|
||||
public static final int ERROR_UNEXPECTED_TOKEN = 1;
|
||||
public static final int ERROR_UNEXPECTED_EXCEPTION = 2;
|
||||
private static final long serialVersionUID = -7880698968187728547L;
|
||||
|
||||
private int errorType;
|
||||
private Object unexpectedObject;
|
||||
private int position;
|
||||
|
||||
public ParseException(int errorType){
|
||||
this(-1, errorType, null);
|
||||
}
|
||||
|
||||
public ParseException(int errorType, Object unexpectedObject){
|
||||
this(-1, errorType, unexpectedObject);
|
||||
}
|
||||
|
||||
public ParseException(int position, int errorType, Object unexpectedObject){
|
||||
this.position = position;
|
||||
this.errorType = errorType;
|
||||
this.unexpectedObject = unexpectedObject;
|
||||
}
|
||||
|
||||
public int getErrorType() {
|
||||
return errorType;
|
||||
}
|
||||
|
||||
public void setErrorType(int errorType) {
|
||||
this.errorType = errorType;
|
||||
}
|
||||
|
||||
/**
|
||||
* @see com.alibaba.nacos.client.logger.json.parser.JSONParser#getPosition()
|
||||
*
|
||||
* @return The character position (starting with 0) of the input where the error occurs.
|
||||
*/
|
||||
public int getPosition() {
|
||||
return position;
|
||||
}
|
||||
|
||||
public void setPosition(int position) {
|
||||
this.position = position;
|
||||
}
|
||||
|
||||
/**
|
||||
* @see com.alibaba.nacos.client.logger.json.parser.Yytoken
|
||||
*
|
||||
* @return One of the following base on the value of errorType:
|
||||
* ERROR_UNEXPECTED_CHAR java.lang.Character
|
||||
* ERROR_UNEXPECTED_TOKEN com.alibaba.nacos.client.logger.jsonparser.Yytoken
|
||||
* ERROR_UNEXPECTED_EXCEPTION java.lang.Exception
|
||||
*/
|
||||
public Object getUnexpectedObject() {
|
||||
return unexpectedObject;
|
||||
}
|
||||
|
||||
public void setUnexpectedObject(Object unexpectedObject) {
|
||||
this.unexpectedObject = unexpectedObject;
|
||||
}
|
||||
|
||||
public String getMessage() {
|
||||
StringBuffer sb = new StringBuffer();
|
||||
|
||||
switch(errorType){
|
||||
case ERROR_UNEXPECTED_CHAR:
|
||||
sb.append("Unexpected character (").append(unexpectedObject).append(") at position ").append(position).append(".");
|
||||
break;
|
||||
case ERROR_UNEXPECTED_TOKEN:
|
||||
sb.append("Unexpected token ").append(unexpectedObject).append(" at position ").append(position).append(".");
|
||||
break;
|
||||
case ERROR_UNEXPECTED_EXCEPTION:
|
||||
sb.append("Unexpected exception at position ").append(position).append(": ").append(unexpectedObject);
|
||||
break;
|
||||
default:
|
||||
sb.append("Unkown error at position ").append(position).append(".");
|
||||
break;
|
||||
}
|
||||
return sb.toString();
|
||||
}
|
||||
public static final int ERROR_UNEXPECTED_CHAR = 0;
|
||||
public static final int ERROR_UNEXPECTED_TOKEN = 1;
|
||||
public static final int ERROR_UNEXPECTED_EXCEPTION = 2;
|
||||
|
||||
private int errorType;
|
||||
private Object unexpectedObject;
|
||||
private int position;
|
||||
|
||||
public ParseException(int errorType) {
|
||||
this(-1, errorType, null);
|
||||
}
|
||||
|
||||
public ParseException(int errorType, Object unexpectedObject) {
|
||||
this(-1, errorType, unexpectedObject);
|
||||
}
|
||||
|
||||
public ParseException(int position, int errorType, Object unexpectedObject) {
|
||||
this.position = position;
|
||||
this.errorType = errorType;
|
||||
this.unexpectedObject = unexpectedObject;
|
||||
}
|
||||
|
||||
public int getErrorType() {
|
||||
return errorType;
|
||||
}
|
||||
|
||||
public void setErrorType(int errorType) {
|
||||
this.errorType = errorType;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return The character position (starting with 0) of the input where the error occurs.
|
||||
* @see com.alibaba.nacos.client.logger.json.parser.JSONParser#getPosition()
|
||||
*/
|
||||
public int getPosition() {
|
||||
return position;
|
||||
}
|
||||
|
||||
public void setPosition(int position) {
|
||||
this.position = position;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return One of the following base on the value of errorType: ERROR_UNEXPECTED_CHAR java.lang.Character
|
||||
* ERROR_UNEXPECTED_TOKEN com.alibaba.nacos.client.logger.jsonparser.Yytoken ERROR_UNEXPECTED_EXCEPTION
|
||||
* java.lang.Exception
|
||||
* @see com.alibaba.nacos.client.logger.json.parser.Yytoken
|
||||
*/
|
||||
public Object getUnexpectedObject() {
|
||||
return unexpectedObject;
|
||||
}
|
||||
|
||||
public void setUnexpectedObject(Object unexpectedObject) {
|
||||
this.unexpectedObject = unexpectedObject;
|
||||
}
|
||||
|
||||
public String getMessage() {
|
||||
StringBuffer sb = new StringBuffer();
|
||||
|
||||
switch (errorType) {
|
||||
case ERROR_UNEXPECTED_CHAR:
|
||||
sb.append("Unexpected character (").append(unexpectedObject).append(") at position ").append(position)
|
||||
.append(".");
|
||||
break;
|
||||
case ERROR_UNEXPECTED_TOKEN:
|
||||
sb.append("Unexpected token ").append(unexpectedObject).append(" at position ").append(position).append(
|
||||
".");
|
||||
break;
|
||||
case ERROR_UNEXPECTED_EXCEPTION:
|
||||
sb.append("Unexpected exception at position ").append(position).append(": ").append(unexpectedObject);
|
||||
break;
|
||||
default:
|
||||
sb.append("Unkown error at position ").append(position).append(".");
|
||||
break;
|
||||
}
|
||||
return sb.toString();
|
||||
}
|
||||
}
|
||||
|
@ -23,34 +23,38 @@ import java.io.UnsupportedEncodingException;
|
||||
|
||||
/**
|
||||
* Yylex
|
||||
* @author Nacos
|
||||
*
|
||||
* @author Nacos
|
||||
*/
|
||||
class Yylex {
|
||||
|
||||
/** This character denotes the end of file */
|
||||
/**
|
||||
* This character denotes the end of file
|
||||
*/
|
||||
public static final int YYEOF = -1;
|
||||
|
||||
/** initial size of the lookahead buffer */
|
||||
/**
|
||||
* initial size of the lookahead buffer
|
||||
*/
|
||||
private static final int ZZ_BUFFERSIZE = 16384;
|
||||
|
||||
/** lexical states */
|
||||
/**
|
||||
* lexical states
|
||||
*/
|
||||
public static final int YYINITIAL = 0;
|
||||
public static final int STRING_BEGIN = 2;
|
||||
|
||||
/**
|
||||
* ZZ_LEXSTATE[l] is the state in the DFA for the lexical state l
|
||||
* ZZ_LEXSTATE[l+1] is the state in the DFA for the lexical state l
|
||||
* at the beginning of a line
|
||||
* l is of the form l = 2*k, k a non negative integer
|
||||
* ZZ_LEXSTATE[l] is the state in the DFA for the lexical state l ZZ_LEXSTATE[l+1] is the state in the DFA for the
|
||||
* lexical state l at the beginning of a line l is of the form l = 2*k, k a non negative integer
|
||||
*/
|
||||
private static final int ZZ_LEXSTATE[] = { 0, 0, 1, 1 };
|
||||
private static final int ZZ_LEXSTATE[] = {0, 0, 1, 1};
|
||||
|
||||
/**
|
||||
* Translates characters to character classes
|
||||
*/
|
||||
private static final String ZZ_CMAP_PACKED =
|
||||
"\11\0\1\7\1\7\2\0\1\7\22\0\1\7\1\0\1\11\10\0" + "\1\6\1\31\1\2\1\4\1\12\12\3\1\32\6\0\4\1\1\5"
|
||||
"\11\0\1\7\1\7\2\0\1\7\22\0\1\7\1\0\1\11\10\0" + "\1\6\1\31\1\2\1\4\1\12\12\3\1\32\6\0\4\1\1\5"
|
||||
+ "\1\1\24\0\1\27\1\10\1\30\3\0\1\22\1\13\2\1\1\21" + "\1\14\5\0\1\23\1\0\1\15\3\0\1\16\1\24\1\17\1\20"
|
||||
+ "\5\0\1\25\1\0\1\26\uff82\0";
|
||||
|
||||
@ -65,7 +69,7 @@ class Yylex {
|
||||
private static final int[] ZZ_ACTION = zzUnpackAction();
|
||||
|
||||
private static final String ZZ_ACTION_PACKED_0 =
|
||||
"\2\0\2\1\1\2\1\3\1\4\3\1\1\5\1\6" + "\1\7\1\10\1\11\1\12\1\13\1\14\1\15\5\0"
|
||||
"\2\0\2\1\1\2\1\3\1\4\3\1\1\5\1\6" + "\1\7\1\10\1\11\1\12\1\13\1\14\1\15\5\0"
|
||||
+ "\1\14\1\16\1\17\1\20\1\21\1\22\1\23\1\24" + "\1\0\1\25\1\0\1\25\4\0\1\26\1\27\2\0" + "\1\30";
|
||||
|
||||
private static int[] zzUnpackAction() {
|
||||
@ -82,7 +86,7 @@ class Yylex {
|
||||
while (i < l) {
|
||||
int count = packed.charAt(i++);
|
||||
int value = packed.charAt(i++);
|
||||
do result[j++] = value; while (--count > 0);
|
||||
do { result[j++] = value; } while (--count > 0);
|
||||
}
|
||||
return j;
|
||||
}
|
||||
@ -93,7 +97,7 @@ class Yylex {
|
||||
private static final int[] ZZ_ROWMAP = zzUnpackRowMap();
|
||||
|
||||
private static final String ZZ_ROWMAP_PACKED_0 =
|
||||
"\0\0\0\33\0\66\0\121\0\154\0\207\0\66\0\242" + "\0\275\0\330\0\66\0\66\0\66\0\66\0\66\0\66"
|
||||
"\0\0\0\33\0\66\0\121\0\154\0\207\0\66\0\242" + "\0\275\0\330\0\66\0\66\0\66\0\66\0\66\0\66"
|
||||
+ "\0\363\0\u010e\0\66\0\u0129\0\u0144\0\u015f\0\u017a\0\u0195" + "\0\66\0\66\0\66\0\66\0\66\0\66\0\66\0\66"
|
||||
+ "\0\u01b0\0\u01cb\0\u01e6\0\u01e6\0\u0201\0\u021c\0\u0237\0\u0252" + "\0\66\0\66\0\u026d\0\u0288\0\66";
|
||||
|
||||
@ -118,42 +122,42 @@ class Yylex {
|
||||
/**
|
||||
* The transition table of the DFA
|
||||
*/
|
||||
private static final int ZZ_TRANS[] = { 2, 2, 3, 4, 2, 2, 2, 5, 2, 6, 2, 2, 7, 8, 2, 9, 2, 2, 2, 2, 2, 10, 11, 12,
|
||||
13, 14, 15, 16, 16, 16, 16, 16, 16, 16, 16, 17, 18, 16, 16, 16, 16, 16, 16,
|
||||
16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4, 19, 20, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, 20, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, 21, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 22, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 23, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 16, 16, 16, 16, 16, 16, 16, 16, -1,
|
||||
-1, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 33, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 34, 35,
|
||||
-1, -1, 34, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, 36, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 37, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 38, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 39, -1, 39, -1, 39, -1, -1, -1, -1,
|
||||
-1, 39, 39, -1, -1, -1, -1, 39, 39, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, 33, -1, 20, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 20, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, 35, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 38, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, 40, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, 41, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, 42, -1, 42, -1, 42, -1, -1, -1, -1, -1, 42, 42, -1, -1, -1, -1, 42, 42,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, 43, -1, 43, -1, 43, -1, -1, -1, -1, -1,
|
||||
43, 43, -1, -1, -1, -1, 43, 43, -1, -1, -1, -1, -1, -1, -1, -1, -1, 44, -1,
|
||||
44, -1, 44, -1, -1, -1, -1, -1, 44, 44, -1, -1, -1, -1, 44, 44, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, };
|
||||
private static final int ZZ_TRANS[] = {2, 2, 3, 4, 2, 2, 2, 5, 2, 6, 2, 2, 7, 8, 2, 9, 2, 2, 2, 2, 2, 10, 11, 12,
|
||||
13, 14, 15, 16, 16, 16, 16, 16, 16, 16, 16, 17, 18, 16, 16, 16, 16, 16, 16,
|
||||
16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4, 19, 20, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, 20, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, 21, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 22, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 23, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 16, 16, 16, 16, 16, 16, 16, 16, -1,
|
||||
-1, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, 24, 25, 26, 27, 28, 29, 30, 31, 32, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 33, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 34, 35,
|
||||
-1, -1, 34, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, 36, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 37, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 38, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 39, -1, 39, -1, 39, -1, -1, -1, -1,
|
||||
-1, 39, 39, -1, -1, -1, -1, 39, 39, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, 33, -1, 20, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 20, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, 35, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 38, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, 40, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, 41, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, 42, -1, 42, -1, 42, -1, -1, -1, -1, -1, 42, 42, -1, -1, -1, -1, 42, 42,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, 43, -1, 43, -1, 43, -1, -1, -1, -1, -1,
|
||||
43, 43, -1, -1, -1, -1, 43, 43, -1, -1, -1, -1, -1, -1, -1, -1, -1, 44, -1,
|
||||
44, -1, 44, -1, -1, -1, -1, -1, 44, 44, -1, -1, -1, -1, 44, 44, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1,};
|
||||
|
||||
/**
|
||||
* error codes
|
||||
@ -163,10 +167,10 @@ class Yylex {
|
||||
private static final int ZZ_PUSHBACK_2BIG = 2;
|
||||
private static final int NIGTY = 90;
|
||||
/**
|
||||
* error messages for the codes above
|
||||
* error messages for the codes above
|
||||
*/
|
||||
private static final String[] ZZ_ERROR_MSG = { "Unkown internal scanner error", "Error: could not match input",
|
||||
"Error: pushback value was too large" };
|
||||
private static final String[] ZZ_ERROR_MSG = {"Unkown internal scanner error", "Error: could not match input",
|
||||
"Error: pushback value was too large"};
|
||||
|
||||
/**
|
||||
* ZZ_ATTRIBUTE[aState] contains the attributes of state <code>aState</code>
|
||||
@ -174,7 +178,7 @@ class Yylex {
|
||||
private static final int[] ZZ_ATTRIBUTE = zzUnpackAttribute();
|
||||
|
||||
private static final String ZZ_ATTRIBUTE_PACKED_0 =
|
||||
"\2\0\1\11\3\1\1\11\3\1\6\11\2\1\1\11" + "\5\0\10\11\1\0\1\1\1\0\1\1\4\0\2\11" + "\2\0\1\11";
|
||||
"\2\0\1\11\3\1\1\11\3\1\6\11\2\1\1\11" + "\5\0\10\11\1\0\1\1\1\0\1\1\4\0\2\11" + "\2\0\1\11";
|
||||
|
||||
private static int[] zzUnpackAttribute() {
|
||||
int[] result = new int[45];
|
||||
@ -185,50 +189,64 @@ class Yylex {
|
||||
|
||||
private static int zzUnpackAttribute(String packed, int offset, int[] result) {
|
||||
int i = 0;
|
||||
int j = offset;
|
||||
int j = offset;
|
||||
int l = packed.length();
|
||||
while (i < l) {
|
||||
int count = packed.charAt(i++);
|
||||
int value = packed.charAt(i++);
|
||||
do result[j++] = value; while (--count > 0);
|
||||
do { result[j++] = value; } while (--count > 0);
|
||||
}
|
||||
return j;
|
||||
}
|
||||
|
||||
/** the input device */
|
||||
/**
|
||||
* the input device
|
||||
*/
|
||||
private java.io.Reader zzReader;
|
||||
|
||||
/** the current state of the DFA */
|
||||
/**
|
||||
* the current state of the DFA
|
||||
*/
|
||||
private int zzState;
|
||||
|
||||
/** the current lexical state */
|
||||
/**
|
||||
* the current lexical state
|
||||
*/
|
||||
private int zzLexicalState = YYINITIAL;
|
||||
|
||||
/**
|
||||
* this buffer contains the current text to be matched and is
|
||||
* the source of the yytext() string
|
||||
* this buffer contains the current text to be matched and is the source of the yytext() string
|
||||
*/
|
||||
private char zzBuffer[] = new char[ZZ_BUFFERSIZE];
|
||||
|
||||
/** the textposition at the last accepting state */
|
||||
/**
|
||||
* the textposition at the last accepting state
|
||||
*/
|
||||
private int zzMarkedPos;
|
||||
|
||||
/** the current text position in the buffer */
|
||||
/**
|
||||
* the current text position in the buffer
|
||||
*/
|
||||
private int zzCurrentPos;
|
||||
|
||||
/** startRead marks the beginning of the yytext() string in the buffer */
|
||||
/**
|
||||
* startRead marks the beginning of the yytext() string in the buffer
|
||||
*/
|
||||
private int zzStartRead;
|
||||
|
||||
/**
|
||||
* endRead marks the last character in the buffer, that has been read
|
||||
* from input
|
||||
* endRead marks the last character in the buffer, that has been read from input
|
||||
*/
|
||||
private int zzEndRead;
|
||||
|
||||
/** the number of characters up to the start of the matched text */
|
||||
/**
|
||||
* the number of characters up to the start of the matched text
|
||||
*/
|
||||
private int yychar;
|
||||
|
||||
/** zzAtEOF == true <=> the scanner is at the EOF */
|
||||
/**
|
||||
* zzAtEOF == true <=> the scanner is at the EOF
|
||||
*/
|
||||
private boolean zzAtEOF;
|
||||
|
||||
/**
|
||||
@ -241,8 +259,7 @@ class Yylex {
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new scanner
|
||||
* There is also a java.io.InputStream version of this constructor.
|
||||
* Creates a new scanner There is also a java.io.InputStream version of this constructor.
|
||||
*
|
||||
* @param in the java.io.Reader to read input from.
|
||||
*/
|
||||
@ -251,11 +268,10 @@ class Yylex {
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new scanner.
|
||||
* There is also java.io.Reader version of this constructor.
|
||||
* Creates a new scanner. There is also java.io.Reader version of this constructor.
|
||||
*
|
||||
* @param in the java.io.Inputstream to read input from.
|
||||
* @throws UnsupportedEncodingException
|
||||
* @throws UnsupportedEncodingException
|
||||
*/
|
||||
Yylex(java.io.InputStream in) throws UnsupportedEncodingException {
|
||||
this(new java.io.InputStreamReader(in, Constants.ENCODE));
|
||||
@ -269,12 +285,12 @@ class Yylex {
|
||||
*/
|
||||
private static char[] zzUnpackCMap(String packed) {
|
||||
char[] map = new char[0x10000];
|
||||
int i = 0;
|
||||
int j = 0;
|
||||
int i = 0;
|
||||
int j = 0;
|
||||
while (i < NIGTY) {
|
||||
int count = packed.charAt(i++);
|
||||
char value = packed.charAt(i++);
|
||||
do map[j++] = value; while (--count > 0);
|
||||
do { map[j++] = value; } while (--count > 0);
|
||||
}
|
||||
return map;
|
||||
}
|
||||
@ -287,26 +303,26 @@ class Yylex {
|
||||
*/
|
||||
private boolean zzRefill() throws java.io.IOException {
|
||||
|
||||
/* first: make room (if you can) */
|
||||
/* first: make room (if you can) */
|
||||
if (zzStartRead > 0) {
|
||||
System.arraycopy(zzBuffer, zzStartRead, zzBuffer, 0, zzEndRead - zzStartRead);
|
||||
|
||||
/* translate stored positions */
|
||||
/* translate stored positions */
|
||||
zzEndRead -= zzStartRead;
|
||||
zzCurrentPos -= zzStartRead;
|
||||
zzMarkedPos -= zzStartRead;
|
||||
zzStartRead = 0;
|
||||
}
|
||||
|
||||
/* is the buffer big enough? */
|
||||
/* is the buffer big enough? */
|
||||
if (zzCurrentPos >= zzBuffer.length) {
|
||||
/* if not: blow it up */
|
||||
/* if not: blow it up */
|
||||
char newBuffer[] = new char[zzCurrentPos * 2];
|
||||
System.arraycopy(zzBuffer, 0, newBuffer, 0, zzBuffer.length);
|
||||
zzBuffer = newBuffer;
|
||||
}
|
||||
|
||||
/* finally: fill the buffer with new input */
|
||||
/* finally: fill the buffer with new input */
|
||||
int numRead = zzReader.read(zzBuffer, zzEndRead, zzBuffer.length - zzEndRead);
|
||||
|
||||
if (numRead > 0) {
|
||||
@ -319,7 +335,7 @@ class Yylex {
|
||||
if (c == -1) {
|
||||
return true;
|
||||
} else {
|
||||
zzBuffer[zzEndRead++] = (char) c;
|
||||
zzBuffer[zzEndRead++] = (char)c;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@ -333,19 +349,17 @@ class Yylex {
|
||||
*/
|
||||
public final void yyclose() throws java.io.IOException {
|
||||
zzAtEOF = true;
|
||||
zzEndRead = zzStartRead;
|
||||
zzEndRead = zzStartRead;
|
||||
|
||||
if (zzReader != null) {
|
||||
zzReader.close();
|
||||
zzReader.close();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Resets the scanner to read from a new input stream.
|
||||
* Does not close the old reader.
|
||||
* All internal variables are reset, the old input stream
|
||||
* <b>cannot</b> be reused (internal buffer is discarded and lost).
|
||||
* Lexical state is set to <tt>ZZ_INITIAL</tt>.
|
||||
* Resets the scanner to read from a new input stream. Does not close the old reader. All internal variables are
|
||||
* reset, the old input stream <b>cannot</b> be reused (internal buffer is discarded and lost). Lexical state is set
|
||||
* to <tt>ZZ_INITIAL</tt>.
|
||||
*
|
||||
* @param reader the new input stream
|
||||
*/
|
||||
@ -381,12 +395,10 @@ class Yylex {
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the character at position <tt>pos</tt> from the
|
||||
* matched text.
|
||||
* It is equivalent to yytext().charAt(pos), but faster
|
||||
* Returns the character at position <tt>pos</tt> from the matched text. It is equivalent to yytext().charAt(pos),
|
||||
* but faster
|
||||
*
|
||||
* @param pos the position of the character to fetch.
|
||||
* A value from 0 to yylength()-1.
|
||||
* @param pos the position of the character to fetch. A value from 0 to yylength()-1.
|
||||
* @return the character at position pos
|
||||
*/
|
||||
public final char yycharat(int pos) {
|
||||
@ -401,14 +413,10 @@ class Yylex {
|
||||
}
|
||||
|
||||
/**
|
||||
* Reports an error that occured while scanning.
|
||||
* In a wellformed scanner (no or only correct usage of
|
||||
* yypushback(int) and a match-all fallback rule) this method
|
||||
* will only be called with things that "Can't Possibly Happen".
|
||||
* If this method is called, something is seriously wrong
|
||||
* (e.g. a JFlex bug producing a faulty scanner etc.).
|
||||
* Usual syntax/scanner level error handling should be done
|
||||
* in error fallback rules.
|
||||
* Reports an error that occured while scanning. In a wellformed scanner (no or only correct usage of
|
||||
* yypushback(int) and a match-all fallback rule) this method will only be called with things that "Can't Possibly
|
||||
* Happen". If this method is called, something is seriously wrong (e.g. a JFlex bug producing a faulty scanner
|
||||
* etc.). Usual syntax/scanner level error handling should be done in error fallback rules.
|
||||
*
|
||||
* @param errorCode the code of the errormessage to display
|
||||
*/
|
||||
@ -424,23 +432,22 @@ class Yylex {
|
||||
}
|
||||
|
||||
/**
|
||||
* Pushes the specified amount of characters back into the input stream.
|
||||
* They will be read again by then next call of the scanning method
|
||||
* Pushes the specified amount of characters back into the input stream. They will be read again by then next call
|
||||
* of the scanning method
|
||||
*
|
||||
* @param number the number of characters to be read again.
|
||||
* This number must not be greater than yylength()!
|
||||
* @param number the number of characters to be read again. This number must not be greater than yylength()!
|
||||
*/
|
||||
public void yypushback(int number) {
|
||||
if (number > yylength()) {
|
||||
zzScanError(ZZ_PUSHBACK_2BIG);
|
||||
zzScanError(ZZ_PUSHBACK_2BIG);
|
||||
}
|
||||
|
||||
zzMarkedPos -= number;
|
||||
}
|
||||
|
||||
/**
|
||||
* Resumes scanning until the next regular expression is matched,
|
||||
* the end of input is encountered or an I/O-Error occurs.
|
||||
* Resumes scanning until the next regular expression is matched, the end of input is encountered or an I/O-Error
|
||||
* occurs.
|
||||
*
|
||||
* @return the next token
|
||||
* @throws java.io.IOException if any I/O-Error occurs
|
||||
@ -476,10 +483,9 @@ class Yylex {
|
||||
{
|
||||
while (true) {
|
||||
|
||||
if (zzCurrentPosL < zzEndReadL) {
|
||||
zzInput = zzBufferL[zzCurrentPosL++];
|
||||
}
|
||||
else if (zzAtEOF) {
|
||||
if (zzCurrentPosL < zzEndReadL) {
|
||||
zzInput = zzBufferL[zzCurrentPosL++];
|
||||
} else if (zzAtEOF) {
|
||||
zzInput = YYEOF;
|
||||
break zzForAction;
|
||||
} else {
|
||||
@ -500,18 +506,18 @@ class Yylex {
|
||||
}
|
||||
}
|
||||
int zzNext = zzTransL[zzRowMapL[zzState] + zzCMapL[zzInput]];
|
||||
if (zzNext == -1) {
|
||||
break zzForAction;
|
||||
}
|
||||
if (zzNext == -1) {
|
||||
break zzForAction;
|
||||
}
|
||||
zzState = zzNext;
|
||||
|
||||
int zzAttributes = zzAttrL[zzState];
|
||||
if ((zzAttributes & 1) == 1) {
|
||||
zzAction = zzState;
|
||||
zzMarkedPosL = zzCurrentPosL;
|
||||
if ((zzAttributes & 8) == 8) {
|
||||
break zzForAction;
|
||||
}
|
||||
if ((zzAttributes & 8) == 8) {
|
||||
break zzForAction;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@ -519,7 +525,7 @@ class Yylex {
|
||||
|
||||
// store back cached position
|
||||
zzMarkedPos = zzMarkedPosL;
|
||||
|
||||
|
||||
switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {
|
||||
case 11: {
|
||||
sb.append(yytext());
|
||||
@ -572,7 +578,8 @@ class Yylex {
|
||||
case 33:
|
||||
break;
|
||||
case 1: {
|
||||
throw new ParseException(yychar, ParseException.ERROR_UNEXPECTED_CHAR, Character.valueOf(yycharat(0)));
|
||||
throw new ParseException(yychar, ParseException.ERROR_UNEXPECTED_CHAR,
|
||||
Character.valueOf(yycharat(0)));
|
||||
}
|
||||
case 34:
|
||||
break;
|
||||
@ -614,7 +621,7 @@ class Yylex {
|
||||
case 24: {
|
||||
try {
|
||||
int ch = Integer.parseInt(yytext().substring(2), 16);
|
||||
sb.append((char) ch);
|
||||
sb.append((char)ch);
|
||||
} catch (Exception e) {
|
||||
throw new ParseException(yychar, ParseException.ERROR_UNEXPECTED_EXCEPTION, e);
|
||||
}
|
||||
|
@ -20,62 +20,62 @@
|
||||
package com.alibaba.nacos.client.logger.json.parser;
|
||||
|
||||
/**
|
||||
* @author FangYidong<fangyidong@yahoo.com.cn>
|
||||
* @author FangYidong<fangyidong @ yahoo.com.cn>
|
||||
*/
|
||||
public class Yytoken {
|
||||
/**
|
||||
* JSON primitive value: string,number,boolean,null
|
||||
*/
|
||||
public static final int TYPE_VALUE=0;
|
||||
public static final int TYPE_LEFT_BRACE=1;
|
||||
public static final int TYPE_RIGHT_BRACE=2;
|
||||
public static final int TYPE_LEFT_SQUARE=3;
|
||||
public static final int TYPE_RIGHT_SQUARE=4;
|
||||
public static final int TYPE_COMMA=5;
|
||||
public static final int TYPE_COLON=6;
|
||||
/**
|
||||
* end of file
|
||||
*/
|
||||
public static final int TYPE_EOF=-1;
|
||||
|
||||
public int type=0;
|
||||
public Object value=null;
|
||||
|
||||
public Yytoken(int type,Object value){
|
||||
this.type=type;
|
||||
this.value=value;
|
||||
}
|
||||
|
||||
public String toString(){
|
||||
StringBuffer sb = new StringBuffer();
|
||||
switch(type){
|
||||
case TYPE_VALUE:
|
||||
sb.append("VALUE(").append(value).append(")");
|
||||
break;
|
||||
case TYPE_LEFT_BRACE:
|
||||
sb.append("LEFT BRACE({)");
|
||||
break;
|
||||
case TYPE_RIGHT_BRACE:
|
||||
sb.append("RIGHT BRACE(})");
|
||||
break;
|
||||
case TYPE_LEFT_SQUARE:
|
||||
sb.append("LEFT SQUARE([)");
|
||||
break;
|
||||
case TYPE_RIGHT_SQUARE:
|
||||
sb.append("RIGHT SQUARE(])");
|
||||
break;
|
||||
case TYPE_COMMA:
|
||||
sb.append("COMMA(,)");
|
||||
break;
|
||||
case TYPE_COLON:
|
||||
sb.append("COLON(:)");
|
||||
break;
|
||||
case TYPE_EOF:
|
||||
sb.append("END OF FILE");
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return sb.toString();
|
||||
}
|
||||
/**
|
||||
* JSON primitive value: string,number,boolean,null
|
||||
*/
|
||||
public static final int TYPE_VALUE = 0;
|
||||
public static final int TYPE_LEFT_BRACE = 1;
|
||||
public static final int TYPE_RIGHT_BRACE = 2;
|
||||
public static final int TYPE_LEFT_SQUARE = 3;
|
||||
public static final int TYPE_RIGHT_SQUARE = 4;
|
||||
public static final int TYPE_COMMA = 5;
|
||||
public static final int TYPE_COLON = 6;
|
||||
/**
|
||||
* end of file
|
||||
*/
|
||||
public static final int TYPE_EOF = -1;
|
||||
|
||||
public int type = 0;
|
||||
public Object value = null;
|
||||
|
||||
public Yytoken(int type, Object value) {
|
||||
this.type = type;
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
StringBuffer sb = new StringBuffer();
|
||||
switch (type) {
|
||||
case TYPE_VALUE:
|
||||
sb.append("VALUE(").append(value).append(")");
|
||||
break;
|
||||
case TYPE_LEFT_BRACE:
|
||||
sb.append("LEFT BRACE({)");
|
||||
break;
|
||||
case TYPE_RIGHT_BRACE:
|
||||
sb.append("RIGHT BRACE(})");
|
||||
break;
|
||||
case TYPE_LEFT_SQUARE:
|
||||
sb.append("LEFT SQUARE([)");
|
||||
break;
|
||||
case TYPE_RIGHT_SQUARE:
|
||||
sb.append("RIGHT SQUARE(])");
|
||||
break;
|
||||
case TYPE_COMMA:
|
||||
sb.append("COMMA(,)");
|
||||
break;
|
||||
case TYPE_COLON:
|
||||
sb.append("COLON(:)");
|
||||
break;
|
||||
case TYPE_EOF:
|
||||
sb.append("END OF FILE");
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return sb.toString();
|
||||
}
|
||||
}
|
||||
|
@ -21,11 +21,10 @@ import com.alibaba.nacos.client.logger.support.LoggerHelper;
|
||||
import com.alibaba.nacos.client.logger.support.LoggerSupport;
|
||||
import com.alibaba.nacos.client.logger.util.MessageUtil;
|
||||
|
||||
|
||||
/**
|
||||
* Log4j2Logger
|
||||
* @author Nacos
|
||||
*
|
||||
* @author Nacos
|
||||
*/
|
||||
public class Log4j2Logger extends LoggerSupport implements Logger {
|
||||
|
||||
|
@ -24,8 +24,8 @@ import com.alibaba.nacos.client.logger.support.LogLog;
|
||||
|
||||
/**
|
||||
* Log4j2Logger Factory
|
||||
* @author Nacos
|
||||
*
|
||||
* @author Nacos
|
||||
*/
|
||||
public class Log4j2LoggerFactory implements ILoggerFactory {
|
||||
|
||||
|
@ -17,14 +17,15 @@ package com.alibaba.nacos.client.logger.nop;
|
||||
|
||||
import com.alibaba.nacos.client.logger.Logger;
|
||||
import com.alibaba.nacos.client.logger.support.LoggerSupport;
|
||||
|
||||
/**
|
||||
* NopLogger
|
||||
* @author Nacos
|
||||
*
|
||||
* @author Nacos
|
||||
*/
|
||||
public class NopLogger extends LoggerSupport implements Logger {
|
||||
|
||||
public NopLogger(){
|
||||
public NopLogger() {
|
||||
super(null);
|
||||
}
|
||||
|
||||
|
@ -17,10 +17,11 @@ package com.alibaba.nacos.client.logger.nop;
|
||||
|
||||
import com.alibaba.nacos.client.logger.Logger;
|
||||
import com.alibaba.nacos.client.logger.support.ILoggerFactory;
|
||||
|
||||
/**
|
||||
* NopLogger Factory
|
||||
* @author Nacos
|
||||
*
|
||||
* @author Nacos
|
||||
*/
|
||||
public class NopLoggerFactory implements ILoggerFactory {
|
||||
|
||||
|
@ -24,8 +24,8 @@ import java.util.List;
|
||||
|
||||
/**
|
||||
* AbstractActiveOption
|
||||
* @author Nacos
|
||||
*
|
||||
* @author Nacos
|
||||
*/
|
||||
public abstract class AbstractActiveOption implements ActivateOption {
|
||||
|
||||
@ -53,7 +53,7 @@ public abstract class AbstractActiveOption implements ActivateOption {
|
||||
for (Object[] arg : args) {
|
||||
if (arg != null && arg.length == 3) {
|
||||
try {
|
||||
Method m = object.getClass().getMethod((String) arg[0], (Class<?>[]) arg[1]);
|
||||
Method m = object.getClass().getMethod((String)arg[0], (Class<?>[])arg[1]);
|
||||
m.invoke(object, arg[2]);
|
||||
} catch (NoSuchMethodException e) {
|
||||
LogLog.info("Can't find method for " + object.getClass() + " " + arg[0] + " " + arg[2]);
|
||||
|
@ -140,8 +140,7 @@ public interface ActivateOption {
|
||||
int maxBackupIndex);
|
||||
|
||||
/**
|
||||
* 将当前logger对象的appender设置为异步Appender
|
||||
* 注意:此logger需要提前进行Appender的初始化
|
||||
* 将当前logger对象的appender设置为异步Appender 注意:此logger需要提前进行Appender的初始化
|
||||
*
|
||||
* @param queueSize 等待队列大小
|
||||
* @param discardingThreshold discardingThreshold,该参数仅对logback实现有效,log4j和log4j2无效
|
||||
@ -150,11 +149,10 @@ public interface ActivateOption {
|
||||
void activateAsync(int queueSize, int discardingThreshold);
|
||||
|
||||
/**
|
||||
* 将当前logger对象的appender设置为异步Appender
|
||||
* 注意:此logger需要提前进行Appender的初始化
|
||||
* 将当前logger对象的appender设置为异步Appender 注意:此logger需要提前进行Appender的初始化
|
||||
*
|
||||
* @param args AsyncAppender配置参数,请自行保证参数的正确性,要求每个Object[]有3个元素,第一个为set方法名,第二个为方法类型数组,第三个为对应的参数值,如
|
||||
* args.add(new Object[] { "setBufferSize", new Class<?>[] { int.class }, queueSize });
|
||||
* @param args AsyncAppender配置参数,请自行保证参数的正确性,要求每个Object[]有3个元素,第一个为set方法名,第二个为方法类型数组,第三个为对应的参数值,如 args.add(new
|
||||
* Object[] { "setBufferSize", new Class<?>[] { int.class }, queueSize });
|
||||
* @since 0.2.3
|
||||
*/
|
||||
void activateAsync(List<Object[]> args);
|
||||
@ -176,6 +174,7 @@ public interface ActivateOption {
|
||||
|
||||
/**
|
||||
* 获取日志级别
|
||||
*
|
||||
* @return level
|
||||
*/
|
||||
Level getLevel();
|
||||
@ -189,6 +188,7 @@ public interface ActivateOption {
|
||||
|
||||
/**
|
||||
* 获取所属的产品名
|
||||
*
|
||||
* @return 所属的产品名
|
||||
*/
|
||||
String getProductName();
|
||||
|
@ -47,11 +47,12 @@ public class Log4j2ActivateOption extends AbstractActiveOption {
|
||||
public Log4j2ActivateOption(org.apache.logging.log4j.Logger logger) {
|
||||
if (logger != null) {
|
||||
if (logger instanceof org.apache.logging.log4j.core.Logger) {
|
||||
this.logger = (org.apache.logging.log4j.core.Logger) logger;
|
||||
this.logger = (org.apache.logging.log4j.core.Logger)logger;
|
||||
|
||||
configuration = this.logger.getContext().getConfiguration();
|
||||
} else {
|
||||
throw new RuntimeException("logger must instanceof org.apache.logging.log4j.core.Logger, " + logger.getClass().getName());
|
||||
throw new RuntimeException(
|
||||
"logger must instanceof org.apache.logging.log4j.core.Logger, " + logger.getClass().getName());
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -59,12 +60,13 @@ public class Log4j2ActivateOption extends AbstractActiveOption {
|
||||
@Override
|
||||
public void activateConsoleAppender(String target, String encoding) {
|
||||
org.apache.logging.log4j.core.Layout layout = org.apache.logging.log4j.core.layout.PatternLayout.newBuilder().
|
||||
withConfiguration(configuration)
|
||||
.withPattern(LoggerHelper.getPattern())
|
||||
.withCharset(Charset.forName(encoding))
|
||||
.build();
|
||||
withConfiguration(configuration)
|
||||
.withPattern(LoggerHelper.getPattern())
|
||||
.withCharset(Charset.forName(encoding))
|
||||
.build();
|
||||
org.apache.logging.log4j.core.appender.ConsoleAppender appender = ConsoleAppender.createAppender(layout, null,
|
||||
ConsoleAppender.Target.valueOf(target.toUpperCase().replace(".", "_")), "LoggerApiConsoleAppender", false, false, true);
|
||||
ConsoleAppender.Target.valueOf(target.toUpperCase().replace(".", "_")), "LoggerApiConsoleAppender", false,
|
||||
false, true);
|
||||
appender.start();
|
||||
removeAllAppenders(logger);
|
||||
logger.addAppender(appender);
|
||||
@ -75,17 +77,17 @@ public class Log4j2ActivateOption extends AbstractActiveOption {
|
||||
@Override
|
||||
public void activateAppender(String productName, String file, String encoding) {
|
||||
org.apache.logging.log4j.core.appender.RollingFileAppender appender = RollingFileAppender.newBuilder()
|
||||
.withName(productName + "." + file.replace(File.separatorChar, '.') + ".Appender")
|
||||
.withFileName(LoggerHelper.getLogFileP(productName, file))
|
||||
.withAppend(true)
|
||||
.withBufferedIo(true)
|
||||
.setConfiguration(configuration)
|
||||
.withFilePattern(LoggerHelper.getLogFile(productName, file) + ".%d{yyyy-MM-dd}")
|
||||
.withLayout(buildLayout(encoding))
|
||||
.withCreateOnDemand(false)
|
||||
.withPolicy(TimeBasedTriggeringPolicy.createPolicy("1", "true"))
|
||||
.withStrategy(DefaultRolloverStrategy.createStrategy(null, null, "nomax", null, null, false, configuration))
|
||||
.build();
|
||||
.withName(productName + "." + file.replace(File.separatorChar, '.') + ".Appender")
|
||||
.withFileName(LoggerHelper.getLogFileP(productName, file))
|
||||
.withAppend(true)
|
||||
.withBufferedIo(true)
|
||||
.setConfiguration(configuration)
|
||||
.withFilePattern(LoggerHelper.getLogFile(productName, file) + ".%d{yyyy-MM-dd}")
|
||||
.withLayout(buildLayout(encoding))
|
||||
.withCreateOnDemand(false)
|
||||
.withPolicy(TimeBasedTriggeringPolicy.createPolicy("1", "true"))
|
||||
.withStrategy(DefaultRolloverStrategy.createStrategy(null, null, "nomax", null, null, false, configuration))
|
||||
.build();
|
||||
|
||||
appender.start();
|
||||
removeAllAppenders(logger);
|
||||
@ -100,7 +102,8 @@ public class Log4j2ActivateOption extends AbstractActiveOption {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void activateAsyncAppender(String productName, String file, String encoding, int queueSize, int discardingThreshold) {
|
||||
public void activateAsyncAppender(String productName, String file, String encoding, int queueSize,
|
||||
int discardingThreshold) {
|
||||
activateAppender(productName, file, encoding);
|
||||
activateAsync(queueSize, discardingThreshold);
|
||||
}
|
||||
@ -111,19 +114,21 @@ public class Log4j2ActivateOption extends AbstractActiveOption {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void activateAppenderWithTimeAndSizeRolling(String productName, String file, String encoding, String size, String datePattern) {
|
||||
public void activateAppenderWithTimeAndSizeRolling(String productName, String file, String encoding, String size,
|
||||
String datePattern) {
|
||||
org.apache.logging.log4j.core.appender.RollingFileAppender appender = RollingFileAppender.newBuilder()
|
||||
.withName(productName + "." + file.replace(File.separatorChar, '.') + ".Appender")
|
||||
.withFileName(LoggerHelper.getLogFileP(productName, file))
|
||||
.withAppend(true)
|
||||
.withBufferedIo(true)
|
||||
.setConfiguration(configuration)
|
||||
.withFilePattern(LoggerHelper.getLogFile(productName, file) + ".%d{" + datePattern + "}")
|
||||
.withLayout(buildLayout(encoding))
|
||||
.withCreateOnDemand(false)
|
||||
.withPolicy(CompositeTriggeringPolicy.createPolicy(TimeBasedTriggeringPolicy.createPolicy("1", "true"), SizeBasedTriggeringPolicy.createPolicy(size)))
|
||||
.withStrategy(DefaultRolloverStrategy.createStrategy(null, null, "nomax", null, null, false, configuration))
|
||||
.build();
|
||||
.withName(productName + "." + file.replace(File.separatorChar, '.') + ".Appender")
|
||||
.withFileName(LoggerHelper.getLogFileP(productName, file))
|
||||
.withAppend(true)
|
||||
.withBufferedIo(true)
|
||||
.setConfiguration(configuration)
|
||||
.withFilePattern(LoggerHelper.getLogFile(productName, file) + ".%d{" + datePattern + "}")
|
||||
.withLayout(buildLayout(encoding))
|
||||
.withCreateOnDemand(false)
|
||||
.withPolicy(CompositeTriggeringPolicy.createPolicy(TimeBasedTriggeringPolicy.createPolicy("1", "true"),
|
||||
SizeBasedTriggeringPolicy.createPolicy(size)))
|
||||
.withStrategy(DefaultRolloverStrategy.createStrategy(null, null, "nomax", null, null, false, configuration))
|
||||
.build();
|
||||
|
||||
appender.start();
|
||||
removeAllAppenders(logger);
|
||||
@ -133,19 +138,22 @@ public class Log4j2ActivateOption extends AbstractActiveOption {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void activateAppenderWithTimeAndSizeRolling(String productName, String file, String encoding, String size, String datePattern, int maxBackupIndex) {
|
||||
public void activateAppenderWithTimeAndSizeRolling(String productName, String file, String encoding, String size,
|
||||
String datePattern, int maxBackupIndex) {
|
||||
org.apache.logging.log4j.core.appender.RollingFileAppender appender = RollingFileAppender.newBuilder()
|
||||
.withName(productName + "." + file.replace(File.separatorChar, '.') + ".Appender")
|
||||
.withFileName(LoggerHelper.getLogFileP(productName, file))
|
||||
.withAppend(true)
|
||||
.withBufferedIo(true)
|
||||
.setConfiguration(configuration)
|
||||
.withFilePattern(LoggerHelper.getLogFile(productName, file) + ".%d{" + datePattern + "}.%i")
|
||||
.withLayout(buildLayout(encoding))
|
||||
.withCreateOnDemand(false)
|
||||
.withPolicy(CompositeTriggeringPolicy.createPolicy(TimeBasedTriggeringPolicy.createPolicy("1", "true"), SizeBasedTriggeringPolicy.createPolicy(size)))
|
||||
.withStrategy(DefaultRolloverStrategy.createStrategy(String.valueOf(maxBackupIndex), "1", "max", null, null, false, configuration))
|
||||
.build();
|
||||
.withName(productName + "." + file.replace(File.separatorChar, '.') + ".Appender")
|
||||
.withFileName(LoggerHelper.getLogFileP(productName, file))
|
||||
.withAppend(true)
|
||||
.withBufferedIo(true)
|
||||
.setConfiguration(configuration)
|
||||
.withFilePattern(LoggerHelper.getLogFile(productName, file) + ".%d{" + datePattern + "}.%i")
|
||||
.withLayout(buildLayout(encoding))
|
||||
.withCreateOnDemand(false)
|
||||
.withPolicy(CompositeTriggeringPolicy.createPolicy(TimeBasedTriggeringPolicy.createPolicy("1", "true"),
|
||||
SizeBasedTriggeringPolicy.createPolicy(size)))
|
||||
.withStrategy(DefaultRolloverStrategy
|
||||
.createStrategy(String.valueOf(maxBackupIndex), "1", "max", null, null, false, configuration))
|
||||
.build();
|
||||
|
||||
appender.start();
|
||||
removeAllAppenders(logger);
|
||||
@ -155,19 +163,21 @@ public class Log4j2ActivateOption extends AbstractActiveOption {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void activateAppenderWithSizeRolling(String productName, String file, String encoding, String size, int maxBackupIndex) {
|
||||
public void activateAppenderWithSizeRolling(String productName, String file, String encoding, String size,
|
||||
int maxBackupIndex) {
|
||||
org.apache.logging.log4j.core.appender.RollingFileAppender appender = RollingFileAppender.newBuilder()
|
||||
.withName(productName + "." + file.replace(File.separatorChar, '.') + ".Appender")
|
||||
.withFileName(LoggerHelper.getLogFileP(productName, file))
|
||||
.withAppend(true)
|
||||
.withBufferedIo(true)
|
||||
.setConfiguration(configuration)
|
||||
.withFilePattern(LoggerHelper.getLogFile(productName, file) + ".%i")
|
||||
.withLayout(buildLayout(encoding))
|
||||
.withCreateOnDemand(false)
|
||||
.withPolicy(SizeBasedTriggeringPolicy.createPolicy(size))
|
||||
.withStrategy(DefaultRolloverStrategy.createStrategy(String.valueOf(maxBackupIndex), "1", "max", null, null, false, configuration))
|
||||
.build();
|
||||
.withName(productName + "." + file.replace(File.separatorChar, '.') + ".Appender")
|
||||
.withFileName(LoggerHelper.getLogFileP(productName, file))
|
||||
.withAppend(true)
|
||||
.withBufferedIo(true)
|
||||
.setConfiguration(configuration)
|
||||
.withFilePattern(LoggerHelper.getLogFile(productName, file) + ".%i")
|
||||
.withLayout(buildLayout(encoding))
|
||||
.withCreateOnDemand(false)
|
||||
.withPolicy(SizeBasedTriggeringPolicy.createPolicy(size))
|
||||
.withStrategy(DefaultRolloverStrategy
|
||||
.createStrategy(String.valueOf(maxBackupIndex), "1", "max", null, null, false, configuration))
|
||||
.build();
|
||||
|
||||
appender.start();
|
||||
removeAllAppenders(logger);
|
||||
@ -181,7 +191,7 @@ public class Log4j2ActivateOption extends AbstractActiveOption {
|
||||
List<Object[]> args = new ArrayList<Object[]>();
|
||||
|
||||
if (queueSize != Integer.MIN_VALUE) {
|
||||
args.add(new Object[] { "setBufferSize", new Class<?>[] { int.class }, queueSize });
|
||||
args.add(new Object[] {"setBufferSize", new Class<?>[] {int.class}, queueSize});
|
||||
}
|
||||
activateAsync(args);
|
||||
}
|
||||
@ -201,10 +211,10 @@ public class Log4j2ActivateOption extends AbstractActiveOption {
|
||||
}
|
||||
|
||||
AsyncAppender.Builder builder = AsyncAppender.newBuilder()
|
||||
.setName(productName + "." + logger.getName() + ".AsyncAppender")
|
||||
.setConfiguration(configuration)
|
||||
.setAppenderRefs(refs)
|
||||
.setBlockingQueueFactory(ArrayBlockingQueueFactory.<LogEvent>createFactory());
|
||||
.setName(productName + "." + logger.getName() + ".AsyncAppender")
|
||||
.setConfiguration(configuration)
|
||||
.setAppenderRefs(refs)
|
||||
.setBlockingQueueFactory(ArrayBlockingQueueFactory.<LogEvent>createFactory());
|
||||
|
||||
invokeMethod(builder, args);
|
||||
|
||||
@ -221,10 +231,10 @@ public class Log4j2ActivateOption extends AbstractActiveOption {
|
||||
public void activateAppender(Logger logger) {
|
||||
if (!(logger.getDelegate() instanceof org.apache.logging.log4j.core.Logger)) {
|
||||
throw new IllegalArgumentException("logger must be org.apache.logging.log4j.core.Logger, but it's "
|
||||
+ logger.getDelegate().getClass());
|
||||
+ logger.getDelegate().getClass());
|
||||
}
|
||||
|
||||
activateAppender(((org.apache.logging.log4j.core.Logger) logger.getDelegate()));
|
||||
activateAppender(((org.apache.logging.log4j.core.Logger)logger.getDelegate()));
|
||||
|
||||
setProductName(logger.getProductName());
|
||||
}
|
||||
@ -244,7 +254,8 @@ public class Log4j2ActivateOption extends AbstractActiveOption {
|
||||
public void setLevel(Level level) {
|
||||
this.level = level;
|
||||
|
||||
org.apache.logging.log4j.Level l = org.apache.logging.log4j.Level.toLevel(level.getName(), org.apache.logging.log4j.Level.ERROR);
|
||||
org.apache.logging.log4j.Level l = org.apache.logging.log4j.Level.toLevel(level.getName(),
|
||||
org.apache.logging.log4j.Level.ERROR);
|
||||
logger.setLevel(l);
|
||||
logger.getContext().getConfiguration().getLoggerConfig(this.logger.getName()).setLevel(l);
|
||||
}
|
||||
@ -256,10 +267,10 @@ public class Log4j2ActivateOption extends AbstractActiveOption {
|
||||
|
||||
protected org.apache.logging.log4j.core.Layout buildLayout(String encoding) {
|
||||
org.apache.logging.log4j.core.Layout layout = org.apache.logging.log4j.core.layout.PatternLayout.newBuilder().
|
||||
withConfiguration(configuration)
|
||||
.withPattern(LoggerHelper.getPattern())
|
||||
.withCharset(Charset.forName(encoding))
|
||||
.build();
|
||||
withConfiguration(configuration)
|
||||
.withPattern(LoggerHelper.getPattern())
|
||||
.withCharset(Charset.forName(encoding))
|
||||
.build();
|
||||
return layout;
|
||||
}
|
||||
|
||||
|
@ -39,14 +39,14 @@ import com.alibaba.nacos.client.logger.support.LoggerHelper;
|
||||
*
|
||||
* @author zhuyong 2014年3月20日 上午11:16:26
|
||||
*/
|
||||
@SuppressWarnings({ "rawtypes", "unchecked" })
|
||||
@SuppressWarnings({"rawtypes", "unchecked"})
|
||||
public class Logback918ActivateOption extends AbstractActiveOption {
|
||||
|
||||
private ch.qos.logback.classic.Logger logger;
|
||||
|
||||
public Logback918ActivateOption(Object logger) {
|
||||
if (logger instanceof ch.qos.logback.classic.Logger) {
|
||||
this.logger = (ch.qos.logback.classic.Logger) logger;
|
||||
this.logger = (ch.qos.logback.classic.Logger)logger;
|
||||
} else {
|
||||
throw new IllegalArgumentException("logger must be instanceof ch.qos.logback.classic.Logger");
|
||||
}
|
||||
@ -102,7 +102,7 @@ public class Logback918ActivateOption extends AbstractActiveOption {
|
||||
@Override
|
||||
public void activateAppenderWithTimeAndSizeRolling(String productName, String file, String encoding, String size) {
|
||||
ch.qos.logback.core.Appender appender = getLogbackDailyAndSizeRollingFileAppender(productName, file, encoding,
|
||||
size);
|
||||
size);
|
||||
logger.detachAndStopAllAppenders();
|
||||
logger.addAppender(appender);
|
||||
|
||||
@ -146,11 +146,12 @@ public class Logback918ActivateOption extends AbstractActiveOption {
|
||||
public void activateAppender(Logger logger) {
|
||||
if (!(logger.getDelegate() instanceof ch.qos.logback.classic.Logger)) {
|
||||
throw new IllegalArgumentException(
|
||||
"logger must be ch.qos.logback.classic.Logger, but it's " + logger.getDelegate().getClass());
|
||||
"logger must be ch.qos.logback.classic.Logger, but it's " + logger.getDelegate().getClass());
|
||||
}
|
||||
this.logger.detachAndStopAllAppenders();
|
||||
|
||||
Iterator<ch.qos.logback.core.Appender<ILoggingEvent>> iter = ((ch.qos.logback.classic.Logger) logger.getDelegate()).iteratorForAppenders();
|
||||
Iterator<ch.qos.logback.core.Appender<ILoggingEvent>> iter = ((ch.qos.logback.classic.Logger)logger
|
||||
.getDelegate()).iteratorForAppenders();
|
||||
while (iter.hasNext()) {
|
||||
ch.qos.logback.core.Appender<ILoggingEvent> appender = iter.next();
|
||||
this.logger.addAppender(appender);
|
||||
@ -161,7 +162,7 @@ public class Logback918ActivateOption extends AbstractActiveOption {
|
||||
public void activateAppenderWithTimeAndSizeRolling(String productName, String file, String encoding, String size,
|
||||
String datePattern) {
|
||||
ch.qos.logback.core.Appender appender = getLogbackDailyAndSizeRollingFileAppender(productName, file, encoding,
|
||||
size, datePattern, -1);
|
||||
size, datePattern, -1);
|
||||
logger.detachAndStopAllAppenders();
|
||||
logger.addAppender(appender);
|
||||
|
||||
@ -211,8 +212,8 @@ public class Logback918ActivateOption extends AbstractActiveOption {
|
||||
public void activateAppenderWithTimeAndSizeRolling(String productName, String file, String encoding, String size,
|
||||
String datePattern, int maxBackupIndex) {
|
||||
ch.qos.logback.core.Appender appender = getLogbackDailyAndSizeRollingFileAppender(productName, file, encoding,
|
||||
size, datePattern,
|
||||
maxBackupIndex);
|
||||
size, datePattern,
|
||||
maxBackupIndex);
|
||||
logger.detachAndStopAllAppenders();
|
||||
logger.addAppender(appender);
|
||||
|
||||
@ -223,7 +224,7 @@ public class Logback918ActivateOption extends AbstractActiveOption {
|
||||
public void activateAppenderWithSizeRolling(String productName, String file, String encoding, String size,
|
||||
int maxBackupIndex) {
|
||||
ch.qos.logback.core.Appender appender = getSizeRollingAppender(productName, file, encoding, size,
|
||||
maxBackupIndex);
|
||||
maxBackupIndex);
|
||||
logger.detachAndStopAllAppenders();
|
||||
logger.addAppender(appender);
|
||||
|
||||
@ -235,11 +236,11 @@ public class Logback918ActivateOption extends AbstractActiveOption {
|
||||
List<Object[]> args = new ArrayList<Object[]>();
|
||||
|
||||
if (queueSize != Integer.MIN_VALUE) {
|
||||
args.add(new Object[] { "setQueueSize", new Class<?>[] { int.class }, queueSize });
|
||||
args.add(new Object[] {"setQueueSize", new Class<?>[] {int.class}, queueSize});
|
||||
}
|
||||
|
||||
if (discardingThreshold != Integer.MIN_VALUE) {
|
||||
args.add(new Object[] { "setDiscardingThreshold", new Class<?>[] { int.class }, discardingThreshold });
|
||||
args.add(new Object[] {"setDiscardingThreshold", new Class<?>[] {int.class}, discardingThreshold});
|
||||
}
|
||||
|
||||
activateAsync(args);
|
||||
|
@ -29,10 +29,10 @@ import ch.qos.logback.core.rolling.TimeBasedRollingPolicy;
|
||||
|
||||
/**
|
||||
* ActivateOption的Logback 0.9.19及后续版本的实现
|
||||
*
|
||||
*
|
||||
* @author zhuyong 2014年3月20日 上午10:24:58
|
||||
*/
|
||||
@SuppressWarnings({ "rawtypes", "unchecked" })
|
||||
@SuppressWarnings({"rawtypes", "unchecked"})
|
||||
public class LogbackActivateOption extends Logback918ActivateOption {
|
||||
|
||||
public LogbackActivateOption(Object logger) {
|
||||
|
@ -20,10 +20,11 @@ import org.slf4j.LoggerFactory;
|
||||
|
||||
import ch.qos.logback.classic.LoggerContext;
|
||||
import ch.qos.logback.core.LogbackException;
|
||||
|
||||
/**
|
||||
* Logback Context Util
|
||||
* @author Nacos
|
||||
*
|
||||
* @author Nacos
|
||||
*/
|
||||
public class LogbackLoggerContextUtil {
|
||||
|
||||
@ -35,11 +36,11 @@ public class LogbackLoggerContextUtil {
|
||||
|
||||
if (!(lcObject instanceof LoggerContext)) {
|
||||
throw new LogbackException(
|
||||
"Expected LOGBACK binding with SLF4J, but another log system has taken the place: "
|
||||
+ lcObject.getClass().getSimpleName());
|
||||
"Expected LOGBACK binding with SLF4J, but another log system has taken the place: "
|
||||
+ lcObject.getClass().getSimpleName());
|
||||
}
|
||||
|
||||
loggerContext = (LoggerContext) lcObject;
|
||||
loggerContext = (LoggerContext)lcObject;
|
||||
}
|
||||
|
||||
return loggerContext;
|
||||
|
@ -41,7 +41,8 @@ public class Slf4jLog4j2AdapterActivateOption extends Log4j2ActivateOption {
|
||||
super(null);
|
||||
|
||||
try {
|
||||
org.apache.logging.log4j.core.Logger log4j2Logger = (org.apache.logging.log4j.core.Logger) loggerField.get(logger);
|
||||
org.apache.logging.log4j.core.Logger log4j2Logger = (org.apache.logging.log4j.core.Logger)loggerField.get(
|
||||
logger);
|
||||
super.logger = log4j2Logger;
|
||||
super.configuration = super.logger.getContext().getConfiguration();
|
||||
} catch (Exception e) {
|
||||
@ -54,12 +55,13 @@ public class Slf4jLog4j2AdapterActivateOption extends Log4j2ActivateOption {
|
||||
public void activateAppender(Logger logger) {
|
||||
if (!(logger.getDelegate() instanceof org.apache.logging.slf4j.Log4jLogger)) {
|
||||
throw new IllegalArgumentException(
|
||||
"logger must be org.apache.logging.slf4j.Log4jLogger, but it's "
|
||||
+ logger.getDelegate().getClass());
|
||||
"logger must be org.apache.logging.slf4j.Log4jLogger, but it's "
|
||||
+ logger.getDelegate().getClass());
|
||||
}
|
||||
|
||||
try {
|
||||
org.apache.logging.log4j.core.Logger log4j2Logger = (org.apache.logging.log4j.core.Logger) loggerField.get(logger.getDelegate());
|
||||
org.apache.logging.log4j.core.Logger log4j2Logger = (org.apache.logging.log4j.core.Logger)loggerField.get(
|
||||
logger.getDelegate());
|
||||
super.activateAppender(log4j2Logger);
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException("activateAppender error, ", e);
|
||||
|
@ -66,7 +66,7 @@ public class Slf4jLogger extends LoggerSupport implements Logger {
|
||||
}
|
||||
|
||||
try {
|
||||
Class<ActivateOption> clazz = (Class<ActivateOption>) Class.forName(activateOptionClass);
|
||||
Class<ActivateOption> clazz = (Class<ActivateOption>)Class.forName(activateOptionClass);
|
||||
Constructor<ActivateOption> c = clazz.getConstructor(Object.class);
|
||||
this.activateOption = c.newInstance(delegate);
|
||||
} catch (Exception e) {
|
||||
|
@ -15,15 +15,15 @@
|
||||
*/
|
||||
package com.alibaba.nacos.client.logger.slf4j;
|
||||
|
||||
|
||||
import com.alibaba.nacos.client.logger.Logger;
|
||||
import com.alibaba.nacos.client.logger.nop.NopLogger;
|
||||
import com.alibaba.nacos.client.logger.support.ILoggerFactory;
|
||||
import com.alibaba.nacos.client.logger.support.LogLog;
|
||||
|
||||
/**
|
||||
* Slf4jLogger Factory
|
||||
* @author Nacos
|
||||
*
|
||||
* @author Nacos
|
||||
*/
|
||||
public class Slf4jLoggerFactory implements ILoggerFactory {
|
||||
|
||||
|
@ -27,7 +27,7 @@ public class AppenderInfo extends HashMap {
|
||||
private static String file = "file";
|
||||
|
||||
public String getName() {
|
||||
return (String) get(AppenderInfo.name);
|
||||
return (String)get(AppenderInfo.name);
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
|
@ -24,7 +24,7 @@ package com.alibaba.nacos.client.logger.support;
|
||||
|
||||
/**
|
||||
* 兼容老的ErrorLog,后续请使用{@link LoggerHelper}
|
||||
*
|
||||
*
|
||||
* @author zhuyong 2014年7月1日 上午11:41:22
|
||||
*/
|
||||
public class ErrorLog {
|
||||
|
@ -19,26 +19,23 @@ import com.alibaba.nacos.client.logger.Logger;
|
||||
|
||||
/**
|
||||
* logger factory interface
|
||||
*
|
||||
* @author Nacos
|
||||
*
|
||||
* @author Nacos
|
||||
*/
|
||||
public interface ILoggerFactory {
|
||||
/**
|
||||
* get logger
|
||||
*
|
||||
* @param clazz
|
||||
* class
|
||||
* @return logger
|
||||
*/
|
||||
Logger getLogger(Class<?> clazz);
|
||||
/**
|
||||
* get logger
|
||||
*
|
||||
* @param clazz class
|
||||
* @return logger
|
||||
*/
|
||||
Logger getLogger(Class<?> clazz);
|
||||
|
||||
/**
|
||||
* get logger
|
||||
*
|
||||
* @param name
|
||||
* logger name
|
||||
* @return logger
|
||||
*/
|
||||
Logger getLogger(String name);
|
||||
/**
|
||||
* get logger
|
||||
*
|
||||
* @param name logger name
|
||||
* @return logger
|
||||
*/
|
||||
Logger getLogger(String name);
|
||||
}
|
||||
|
@ -33,10 +33,11 @@ package com.alibaba.nacos.client.logger.support;
|
||||
|
||||
import java.io.PrintStream;
|
||||
import java.util.Calendar;
|
||||
|
||||
/**
|
||||
* logger log
|
||||
* @author Nacos
|
||||
* logger log
|
||||
*
|
||||
* @author Nacos
|
||||
*/
|
||||
public class LogLog {
|
||||
|
||||
|
@ -60,7 +60,9 @@ public class LogbackHelper {
|
||||
ILoggerFactory lc = org.slf4j.LoggerFactory.getILoggerFactory();
|
||||
|
||||
if (!(lc instanceof LoggerContext)) {
|
||||
LogLog.warn("expected logback binding with SLF4J, but another log system has taken the place: " + lcObject.getClass().getSimpleName());
|
||||
LogLog.warn(
|
||||
"expected logback binding with SLF4J, but another log system has taken the place: " + lcObject
|
||||
.getClass().getSimpleName());
|
||||
} else {
|
||||
lcObject = lc;
|
||||
|
||||
@ -77,6 +79,7 @@ public class LogbackHelper {
|
||||
LogLog.error("failed to init LogbackHelper, " + t.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressFBWarnings("NP_BOOLEAN_RETURN_NULL")
|
||||
public static Boolean setDepth(int depth) {
|
||||
if (Logback) {
|
||||
@ -84,7 +87,7 @@ public class LogbackHelper {
|
||||
depth = Integer.MAX_VALUE;
|
||||
}
|
||||
try {
|
||||
LoggerContext loggerContext = (LoggerContext) lcObject;
|
||||
LoggerContext loggerContext = (LoggerContext)lcObject;
|
||||
|
||||
List<Logger> loggers = loggerContext.getLoggerList();
|
||||
for (ch.qos.logback.classic.Logger logger : loggers) {
|
||||
@ -100,12 +103,13 @@ public class LogbackHelper {
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@SuppressFBWarnings("NP_BOOLEAN_RETURN_NULL")
|
||||
public static Boolean changeLevel(String name, String level) {
|
||||
if (Logback) {
|
||||
try {
|
||||
Level l = Level.toLevel(level, Level.ERROR);
|
||||
LoggerContext loggerContext = (LoggerContext) lcObject;
|
||||
LoggerContext loggerContext = (LoggerContext)lcObject;
|
||||
|
||||
Logger logger = loggerContext.exists(name);
|
||||
if (logger != null) {
|
||||
@ -126,7 +130,7 @@ public class LogbackHelper {
|
||||
Map<String, LoggerInfo> appenders = new HashMap<String, LoggerInfo>(10);
|
||||
|
||||
if (Logback) {
|
||||
LoggerContext loggerContext = (LoggerContext) lcObject;
|
||||
LoggerContext loggerContext = (LoggerContext)lcObject;
|
||||
if (name != null && !"".equals(name.trim())) {
|
||||
Logger logger = loggerContext.exists(name);
|
||||
if (logger != null) {
|
||||
@ -148,24 +152,24 @@ public class LogbackHelper {
|
||||
}
|
||||
|
||||
private static void doSetDepth(Iterator<Appender<ILoggingEvent>> iter, int depth)
|
||||
throws IllegalAccessException {
|
||||
throws IllegalAccessException {
|
||||
while (iter.hasNext()) {
|
||||
Appender<ILoggingEvent> a = iter.next();
|
||||
if (a instanceof AsyncAppenderBase) {
|
||||
Iterator<Appender<ILoggingEvent>> aiter = ((AsyncAppenderBase) a).iteratorForAppenders();
|
||||
Iterator<Appender<ILoggingEvent>> aiter = ((AsyncAppenderBase)a).iteratorForAppenders();
|
||||
doSetDepth(aiter, depth);
|
||||
} else if (a instanceof OutputStreamAppender) {
|
||||
OutputStreamAppender oa = (OutputStreamAppender) a;
|
||||
OutputStreamAppender oa = (OutputStreamAppender)a;
|
||||
Encoder e = oa.getEncoder();
|
||||
Layout l = null;
|
||||
if (e instanceof PatternLayoutEncoder) {
|
||||
l = ((PatternLayoutEncoder) e).getLayout();
|
||||
l = ((PatternLayoutEncoder)e).getLayout();
|
||||
} else if (e instanceof LayoutWrappingEncoder) {
|
||||
l = ((LayoutWrappingEncoder) e).getLayout();
|
||||
l = ((LayoutWrappingEncoder)e).getLayout();
|
||||
}
|
||||
if (l != null) {
|
||||
if (l instanceof PatternLayoutBase) {
|
||||
Converter c = (Converter) f.get(l);
|
||||
Converter c = (Converter)f.get(l);
|
||||
while (c != null) {
|
||||
if (c instanceof ThrowableProxyConverter) {
|
||||
f1.set(c, depth);
|
||||
@ -183,10 +187,10 @@ public class LogbackHelper {
|
||||
LoggerInfo info = new LoggerInfo(logger.getName(), logger.isAdditive());
|
||||
Level level = logger.getLevel(), effectiveLevel = logger.getEffectiveLevel();
|
||||
if (level != null) {
|
||||
info.setLevel(level.toString());
|
||||
info.setLevel(level.toString());
|
||||
}
|
||||
if (effectiveLevel != null) {
|
||||
info.setEffectiveLevel(effectiveLevel.toString());
|
||||
info.setEffectiveLevel(effectiveLevel.toString());
|
||||
}
|
||||
|
||||
List<AppenderInfo> result = doGetLoggerAppenders(logger.iteratorForAppenders());
|
||||
@ -203,9 +207,9 @@ public class LogbackHelper {
|
||||
info.setName(appender.getName());
|
||||
info.setType(appender.getClass().getName());
|
||||
if (appender instanceof FileAppender) {
|
||||
info.setFile(((FileAppender) appender).getFile());
|
||||
info.setFile(((FileAppender)appender).getFile());
|
||||
} else if (appender instanceof AsyncAppender) {
|
||||
AsyncAppender aa = (AsyncAppender) appender;
|
||||
AsyncAppender aa = (AsyncAppender)appender;
|
||||
Iterator<Appender<ILoggingEvent>> iter = aa.iteratorForAppenders();
|
||||
List<AppenderInfo> asyncs = doGetLoggerAppenders(iter);
|
||||
// 标明异步appender
|
||||
@ -216,7 +220,7 @@ public class LogbackHelper {
|
||||
}
|
||||
info.withDetail("nestedNames", nestedNames);
|
||||
} else if (appender instanceof ConsoleAppender) {
|
||||
info.withDetail("target", ((ConsoleAppender) appender).getTarget());
|
||||
info.withDetail("target", ((ConsoleAppender)appender).getTarget());
|
||||
}
|
||||
result.add(info);
|
||||
}
|
||||
|
@ -31,20 +31,20 @@ import com.alibaba.nacos.client.logger.Logger;
|
||||
|
||||
/**
|
||||
* logger help
|
||||
* @author Nacos
|
||||
*
|
||||
* @author Nacos
|
||||
*/
|
||||
@SuppressWarnings("PMD.AbstractClassShouldStartWithAbstractNamingRule")
|
||||
public abstract class LoggerHelper {
|
||||
|
||||
private static final String MORE_URL_POSFIX = ".ERROR_CODE_MORE_URL";
|
||||
private static final String DEFAULT_MORE_URL = "http://console.taobao.net/help/";
|
||||
private static final String MORE_URL_POSFIX = ".ERROR_CODE_MORE_URL";
|
||||
private static final String DEFAULT_MORE_URL = "http://console.taobao.net/help/";
|
||||
|
||||
private static String LOG_PATH = null;
|
||||
private static final String CONVERSION_PATTERN = "01 %d{yyyy-MM-dd HH:mm:ss.SSS} %p [%-5t:%c{2}] %m%n";
|
||||
private static String LOG_PATH = null;
|
||||
private static final String CONVERSION_PATTERN = "01 %d{yyyy-MM-dd HH:mm:ss.SSS} %p [%-5t:%c{2}] %m%n";
|
||||
|
||||
private static Map<String, Boolean> Product_Logger_Info;
|
||||
private static Map<String, String> Product_Logger_Pattern;
|
||||
private static Map<String, String> Product_Logger_Pattern;
|
||||
|
||||
private static Map<String, ResourceBundle> Product_Resource_Bundle;
|
||||
|
||||
@ -55,7 +55,7 @@ public abstract class LoggerHelper {
|
||||
LOG_PATH = defaultPath + File.separator + "logs" + File.separator;
|
||||
} else {
|
||||
if (!new File(dpath).isAbsolute()) {
|
||||
// throw new RuntimeException("-DJM.LOG.PATH must be an absolute path.");
|
||||
// throw new RuntimeException("-DJM.LOG.PATH must be an absolute path.");
|
||||
String defaultPath = System.getProperty("user.home");
|
||||
dpath = defaultPath + File.separator + dpath;
|
||||
}
|
||||
@ -83,15 +83,15 @@ public abstract class LoggerHelper {
|
||||
/**
|
||||
* <pre>
|
||||
* 获取中间件产品日志路径
|
||||
*
|
||||
*
|
||||
* 优先使用-DJM.LOG.PATH参数,且必须是绝对路径
|
||||
* 其次是{user.home}/logs/
|
||||
*
|
||||
*
|
||||
* 比如hsf调用:LoggerHelper.getLogFile("hsf", "hsf.log"),则返回{user.home}/logs/hsf/hsf.log
|
||||
* </pre>
|
||||
*
|
||||
*
|
||||
* @param productName 中间件产品名,如hsf, tddl
|
||||
* @param fileName 日志文件名,如hsf.log,如需要二级子目录,可以传 subDir + File.separator + *.log
|
||||
* @param fileName 日志文件名,如hsf.log,如需要二级子目录,可以传 subDir + File.separator + *.log
|
||||
*/
|
||||
public static String getLogFile(String productName, String fileName) {
|
||||
String file = LOG_PATH + productName + File.separator + fileName;
|
||||
@ -125,9 +125,9 @@ public abstract class LoggerHelper {
|
||||
|
||||
/**
|
||||
* 设置特定中间件产品的日志格式,注意,这里的格式需要自己保证在 log4j/logback 下都兼容,框架不做校验,同时控制台输出仍会采用中间件的特定格式
|
||||
*
|
||||
*
|
||||
* @param productName 中间件产品名,如hsf, tddl
|
||||
* @param pattern 日志格式
|
||||
* @param pattern 日志格式
|
||||
*/
|
||||
public static void setPattern(String productName, String pattern) {
|
||||
Product_Logger_Pattern.put(productName, pattern);
|
||||
@ -137,7 +137,7 @@ public abstract class LoggerHelper {
|
||||
* 设置产品的日志国际化properties文件
|
||||
*
|
||||
* @param productName 中间件产品名,如hsf, tddl
|
||||
* @param bundleName bundleName
|
||||
* @param bundleName bundleName
|
||||
*/
|
||||
public static void setResourceBundle(String productName, String bundleName) {
|
||||
try {
|
||||
@ -152,7 +152,7 @@ public abstract class LoggerHelper {
|
||||
* 获取国际化的message,如果找不到,则返回原始的code
|
||||
*
|
||||
* @param productName 中间件产品名,如hsf, tddl
|
||||
* @param code code
|
||||
* @param code code
|
||||
*/
|
||||
public static String getResourceBundleString(String productName, String code) {
|
||||
if (Product_Resource_Bundle.isEmpty() || code == null || productName == null) {
|
||||
@ -174,7 +174,7 @@ public abstract class LoggerHelper {
|
||||
|
||||
/**
|
||||
* 获取统一格式的ErrorCode输出
|
||||
*
|
||||
*
|
||||
* @param errorCode
|
||||
*/
|
||||
@Deprecated
|
||||
@ -184,11 +184,11 @@ public abstract class LoggerHelper {
|
||||
|
||||
/**
|
||||
* 根据productName获取统一格式的ErrorCode输出
|
||||
*
|
||||
*
|
||||
* @param productName 如 HSF,会根据 HSF.ErrorCodeMoreUrl 从 System属性中获取 more url 前缀,如http://console.taobao.net/jm/
|
||||
* @param errorCode 错误码,如HSF-001
|
||||
* @param errorType 错误类型
|
||||
* @param message 出错异常信息
|
||||
* @param errorCode 错误码,如HSF-001
|
||||
* @param errorType 错误类型
|
||||
* @param message 出错异常信息
|
||||
*/
|
||||
public static String getErrorCodeStr(String productName, String errorCode, String errorType, String message) {
|
||||
String moreUrl = DEFAULT_MORE_URL;
|
||||
@ -214,18 +214,17 @@ public abstract class LoggerHelper {
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
@SuppressFBWarnings(value = { "RV_RETURN_VALUE_IGNORED_BAD_PRACTICE" })
|
||||
public static String getLogFileP(String productName, String fileName) {
|
||||
String file = getLogFile(productName, fileName);
|
||||
File logfile = new File(file);
|
||||
logfile.getParentFile().mkdirs();
|
||||
return file;
|
||||
}
|
||||
@SuppressFBWarnings(value = {"RV_RETURN_VALUE_IGNORED_BAD_PRACTICE"})
|
||||
public static String getLogFileP(String productName, String fileName) {
|
||||
String file = getLogFile(productName, fileName);
|
||||
File logfile = new File(file);
|
||||
logfile.getParentFile().mkdirs();
|
||||
return file;
|
||||
}
|
||||
|
||||
/**
|
||||
* When prudent is set to true, file appenders from multiple JVMs can safely
|
||||
* write to the same file.
|
||||
*
|
||||
* When prudent is set to true, file appenders from multiple JVMs can safely write to the same file.
|
||||
* <p>
|
||||
* Only support by logback
|
||||
*
|
||||
* @param prudent
|
||||
@ -235,14 +234,15 @@ public abstract class LoggerHelper {
|
||||
if (logger != null && logger.getDelegate() != null) {
|
||||
if (!(logger.getDelegate() instanceof ch.qos.logback.classic.Logger)) {
|
||||
throw new IllegalArgumentException("logger must be ch.qos.logback.classic.Logger, but it's "
|
||||
+ logger.getDelegate().getClass());
|
||||
+ logger.getDelegate().getClass());
|
||||
}
|
||||
|
||||
Iterator<Appender<ILoggingEvent>> iter = ((ch.qos.logback.classic.Logger) logger.getDelegate()).iteratorForAppenders();
|
||||
Iterator<Appender<ILoggingEvent>> iter = ((ch.qos.logback.classic.Logger)logger.getDelegate())
|
||||
.iteratorForAppenders();
|
||||
while (iter.hasNext()) {
|
||||
ch.qos.logback.core.Appender<ILoggingEvent> appender = iter.next();
|
||||
if (appender instanceof FileAppender) {
|
||||
((FileAppender) appender).setPrudent(prudent);
|
||||
((FileAppender)appender).setPrudent(prudent);
|
||||
} else {
|
||||
continue;
|
||||
}
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user