Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
superrain51
apollo
提交
97d98f12
apollo
项目概览
superrain51
/
apollo
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
apollo
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
97d98f12
编写于
1月 24, 2017
作者:
J
Jason Song
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
optimize array parser
上级
95cf37c5
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
91 addition
and
5 deletion
+91
-5
apollo-client/src/main/java/com/ctrip/framework/apollo/internals/AbstractConfig.java
.../com/ctrip/framework/apollo/internals/AbstractConfig.java
+29
-5
apollo-client/src/test/java/com/ctrip/framework/apollo/internals/DefaultConfigTest.java
...m/ctrip/framework/apollo/internals/DefaultConfigTest.java
+62
-0
未找到文件。
apollo-client/src/main/java/com/ctrip/framework/apollo/internals/AbstractConfig.java
浏览文件 @
97d98f12
...
...
@@ -5,6 +5,7 @@ import com.google.common.base.Objects;
import
com.google.common.cache.Cache
;
import
com.google.common.cache.CacheBuilder
;
import
com.google.common.collect.Lists
;
import
com.google.common.collect.Maps
;
import
com.google.common.collect.Sets
;
import
com.ctrip.framework.apollo.Config
;
...
...
@@ -28,6 +29,7 @@ import org.unidal.lookup.ContainerLoader;
import
java.util.Date
;
import
java.util.List
;
import
java.util.Locale
;
import
java.util.Map
;
import
java.util.Properties
;
import
java.util.Set
;
import
java.util.concurrent.ExecutorService
;
...
...
@@ -53,6 +55,7 @@ public abstract class AbstractConfig implements Config {
private
volatile
Cache
<
String
,
Boolean
>
m_booleanCache
;
private
volatile
Cache
<
String
,
Date
>
m_dateCache
;
private
volatile
Cache
<
String
,
Long
>
m_durationCache
;
private
Map
<
String
,
Cache
<
String
,
String
[]>>
m_arrayCache
;
private
List
<
Cache
>
allCaches
;
private
AtomicLong
m_configVersion
;
//indicate config version
...
...
@@ -65,6 +68,7 @@ public abstract class AbstractConfig implements Config {
try
{
m_configUtil
=
ContainerLoader
.
getDefaultContainer
().
lookup
(
ConfigUtil
.
class
);
m_configVersion
=
new
AtomicLong
();
m_arrayCache
=
Maps
.
newConcurrentMap
();
allCaches
=
Lists
.
newArrayList
();
}
catch
(
ComponentLookupException
ex
)
{
Tracer
.
logError
(
ex
);
...
...
@@ -220,13 +224,29 @@ public abstract class AbstractConfig implements Config {
}
@Override
public
String
[]
getArrayProperty
(
String
key
,
String
delimiter
,
String
[]
defaultValue
)
{
public
String
[]
getArrayProperty
(
String
key
,
final
String
delimiter
,
String
[]
defaultValue
)
{
try
{
String
value
=
getProperty
(
key
,
null
);
if
(!
m_arrayCache
.
containsKey
(
delimiter
))
{
synchronized
(
this
)
{
if
(!
m_arrayCache
.
containsKey
(
delimiter
))
{
m_arrayCache
.
put
(
delimiter
,
this
.<
String
[]>
newCache
());
}
}
}
if
(
value
!=
null
)
{
return
value
.
split
(
delimiter
);
Cache
<
String
,
String
[]>
cache
=
m_arrayCache
.
get
(
delimiter
);
String
[]
result
=
cache
.
getIfPresent
(
key
);
if
(
result
!=
null
)
{
return
result
;
}
return
getValueAndStoreToCache
(
key
,
new
Function
<
String
,
String
[]>()
{
@Override
public
String
[]
apply
(
String
input
)
{
return
input
.
split
(
delimiter
);
}
},
cache
,
defaultValue
);
}
catch
(
Throwable
ex
)
{
Tracer
.
logError
(
new
ApolloConfigException
(
String
.
format
(
"getArrayProperty for %s failed, return default value"
,
key
),
ex
));
...
...
@@ -334,11 +354,15 @@ public abstract class AbstractConfig implements Config {
return
result
;
}
return
getValueAndStoreToCache
(
key
,
parser
,
cache
,
defaultValue
);
}
private
<
T
>
T
getValueAndStoreToCache
(
String
key
,
Function
<
String
,
T
>
parser
,
Cache
<
String
,
T
>
cache
,
T
defaultValue
)
{
long
currentConfigVersion
=
m_configVersion
.
get
();
String
value
=
getProperty
(
key
,
null
);
if
(
value
!=
null
)
{
result
=
parser
.
apply
(
value
);
T
result
=
parser
.
apply
(
value
);
if
(
result
!=
null
)
{
synchronized
(
this
)
{
...
...
apollo-client/src/test/java/com/ctrip/framework/apollo/internals/DefaultConfigTest.java
浏览文件 @
97d98f12
...
...
@@ -415,6 +415,68 @@ public class DefaultConfigTest extends ComponentTestCase {
someDefaultValue
));
}
@Test
public
void
testGetArrayPropertyMultipleTimesWithCache
()
throws
Exception
{
String
someKey
=
"someKey"
;
String
someDelimiter
=
","
;
String
someInvalidDelimiter
=
"{"
;
String
[]
values
=
new
String
[]{
"a"
,
"b"
,
"c"
};
String
someValue
=
Joiner
.
on
(
someDelimiter
).
join
(
values
);
String
[]
someDefaultValue
=
new
String
[]{
"1"
,
"2"
};
//set up config repo
someProperties
=
mock
(
Properties
.
class
);
when
(
someProperties
.
getProperty
(
someKey
)).
thenReturn
(
someValue
);
when
(
configRepository
.
getConfig
()).
thenReturn
(
someProperties
);
DefaultConfig
defaultConfig
=
new
DefaultConfig
(
someNamespace
,
configRepository
);
assertArrayEquals
(
values
,
defaultConfig
.
getArrayProperty
(
someKey
,
someDelimiter
,
someDefaultValue
));
assertArrayEquals
(
values
,
defaultConfig
.
getArrayProperty
(
someKey
,
someDelimiter
,
someDefaultValue
));
verify
(
someProperties
,
times
(
1
)).
getProperty
(
someKey
);
assertArrayEquals
(
someDefaultValue
,
defaultConfig
.
getArrayProperty
(
someKey
,
someInvalidDelimiter
,
someDefaultValue
));
assertArrayEquals
(
someDefaultValue
,
defaultConfig
.
getArrayProperty
(
someKey
,
someInvalidDelimiter
,
someDefaultValue
));
verify
(
someProperties
,
times
(
3
)).
getProperty
(
someKey
);
}
@Test
public
void
testGetArrayPropertyMultipleTimesWithCacheAndValueChanges
()
throws
Exception
{
String
someKey
=
"someKey"
;
String
someDelimiter
=
","
;
String
[]
values
=
new
String
[]{
"a"
,
"b"
,
"c"
};
String
[]
anotherValues
=
new
String
[]{
"b"
,
"c"
,
"d"
};
String
someValue
=
Joiner
.
on
(
someDelimiter
).
join
(
values
);
String
anotherValue
=
Joiner
.
on
(
someDelimiter
).
join
(
anotherValues
);
String
[]
someDefaultValue
=
new
String
[]{
"1"
,
"2"
};
//set up config repo
someProperties
=
new
Properties
();
someProperties
.
setProperty
(
someKey
,
someValue
);
when
(
configRepository
.
getConfig
()).
thenReturn
(
someProperties
);
Properties
anotherProperties
=
new
Properties
();
anotherProperties
.
setProperty
(
someKey
,
anotherValue
);
DefaultConfig
defaultConfig
=
new
DefaultConfig
(
someNamespace
,
configRepository
);
assertArrayEquals
(
values
,
defaultConfig
.
getArrayProperty
(
someKey
,
someDelimiter
,
someDefaultValue
));
defaultConfig
.
onRepositoryChange
(
someNamespace
,
anotherProperties
);
assertArrayEquals
(
anotherValues
,
defaultConfig
.
getArrayProperty
(
someKey
,
someDelimiter
,
someDefaultValue
));
}
@Test
public
void
testGetDatePropertyWithFormat
()
throws
Exception
{
Date
someDefaultValue
=
new
Date
();
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录