Skip to content

Commit c8f7c22

Browse files
committed
Merge remote-tracking branch 'origin/V5' into V6
2 parents e8011b4 + 5f15a81 commit c8f7c22

File tree

37 files changed

+202
-174
lines changed

37 files changed

+202
-174
lines changed

data/publiccms/README.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
删除文件备份,由系统自动创建
33

44
dict
5-
自定义分词文件目录
5+
自定义分词文件目录,ip2region_v4.xdb,ip2region_v6.xdb存放在这里
66

77
history
88
文件修改历史,由系统自动创建

publiccms-parent/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ subprojects {
119119
// https://mvnrepository.com/artifact/com.github.therapi/therapi-runtime-javadoc
120120
therapiJavadocVersion = "0.15.0"
121121
// https://mvnrepository.com/artifact/org.jsoup/jsoup
122-
jsoupVersion = "1.21.2"
122+
jsoupVersion = "1.22.1"
123123
// https://mvnrepository.com/artifact/jakarta.annotation/jakarta.annotation-api
124124
annotationVersion = "3.0.0"
125125
// https://mvnrepository.com/artifact/jakarta.mail/jakarta.mail-api

publiccms-parent/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@
112112
<!-- https://mvnrepository.com/artifact/com.github.therapi/therapi-runtime-javadoc -->
113113
<version.therapiJavadoc>0.15.0</version.therapiJavadoc>
114114
<!-- https://mvnrepository.com/artifact/org.jsoup/jsoup -->
115-
<version.jsoup>1.21.2</version.jsoup>
115+
<version.jsoup>1.22.1</version.jsoup>
116116
<!-- https://mvnrepository.com/artifact/jakarta.annotation/jakarta.annotation-api -->
117117
<version.annotation>3.0.0</version.annotation>
118118
<!-- https://mvnrepository.com/artifact/jakarta.mail/jakarta.mail-api -->

publiccms-parent/publiccms-analyzer/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,6 @@ dependencies {
1010

1111
implementation "org.apache.lucene:lucene-analysis-smartcn:${luceneVersion}"
1212
// https://mvnrepository.com/artifact/org.lionsoul/ip2region
13-
implementation 'org.lionsoul:ip2region:3.3.1'
13+
implementation 'org.lionsoul:ip2region:3.3.3'
1414
implementation "jakarta.servlet:jakarta.servlet-api:${servletVersion}"
1515
}

publiccms-parent/publiccms-analyzer/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
<dependency>
2222
<groupId>org.lionsoul</groupId>
2323
<artifactId>ip2region</artifactId>
24-
<version>3.3.1</version>
24+
<version>3.3.3</version>
2525
</dependency>
2626
<dependency>
2727
<groupId>com.github.therapi</groupId>

publiccms-parent/publiccms-analyzer/src/main/java/com/publiccms/views/method/tools/GetIpRegionMethod.java

Lines changed: 55 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,25 @@
11
package com.publiccms.views.method.tools;
22

3+
import java.io.File;
34
import java.io.IOException;
4-
import java.io.InputStream;
55
import java.util.List;
66

7-
import org.apache.commons.io.IOUtils;
87
import org.apache.commons.lang3.StringUtils;
9-
import org.lionsoul.ip2region.xdb.LongByteArray;
10-
import org.lionsoul.ip2region.xdb.Searcher;
11-
import org.lionsoul.ip2region.xdb.Version;
8+
import org.lionsoul.ip2region.service.Config;
9+
import org.lionsoul.ip2region.service.InvalidConfigException;
10+
import org.lionsoul.ip2region.service.Ip2Region;
11+
import org.lionsoul.ip2region.xdb.XdbException;
1212
import org.springframework.stereotype.Component;
1313

1414
import com.publiccms.common.base.BaseMethod;
15+
import com.publiccms.common.constants.CommonConstants;
16+
import com.publiccms.common.tools.AnalyzerDictUtils;
1517
import com.publiccms.common.tools.CommonUtils;
16-
import com.publiccms.common.tools.IpUtils;
1718
import com.publiccms.views.pojo.entities.IpRegion;
1819

1920
import freemarker.template.TemplateModel;
2021
import freemarker.template.TemplateModelException;
22+
import jakarta.annotation.PreDestroy;
2123

2224
/**
2325
*
@@ -43,34 +45,54 @@
4345
*/
4446
@Component
4547
public class GetIpRegionMethod extends BaseMethod {
46-
private static LongByteArray longByteArray;
48+
private static Ip2Region ip2Region = null;
4749

48-
public GetIpRegionMethod() {
49-
try (InputStream inputStream = GetIpRegionMethod.class.getResourceAsStream("/ip2region_v4.xdb")) {
50-
longByteArray = new LongByteArray(IOUtils.toByteArray(inputStream));
51-
} catch (IOException e) {
52-
e.printStackTrace();
53-
longByteArray = null;
50+
private void init() {
51+
if (null == ip2Region) {
52+
synchronized (GetIpRegionMethod.class) {
53+
try {
54+
if (null == ip2Region) {
55+
56+
File ipv4 = getFilePath("ip2region_v4.xdb");
57+
File ipv6 = getFilePath("ip2region_v6.xdb");
58+
Config v4Config = null;
59+
if (ipv4.exists()) {
60+
v4Config = Config.custom().setCachePolicy(Config.VIndexCache).setSearchers(20)
61+
.setCacheSliceBytes(20 * 1024 * 1024).setXdbFile(ipv4).asV4();
62+
} else {
63+
v4Config = Config.custom().setCachePolicy(Config.BufferCache)
64+
.setXdbInputStream(GetIpRegionMethod.class.getResourceAsStream("/ip2region_v4.xdb"))
65+
.setCacheSliceBytes(20 * 1024 * 1024).asV4();
66+
}
67+
Config v6Config = null;
68+
if (ipv6.exists()) {
69+
v6Config = Config.custom().setCachePolicy(Config.VIndexCache).setSearchers(20)
70+
.setCacheSliceBytes(50 * 1024 * 1024).setXdbFile(ipv6).asV6();
71+
}
72+
ip2Region = Ip2Region.create(v4Config, v6Config);
73+
}
74+
} catch (IOException | XdbException | InvalidConfigException e) {
75+
}
76+
}
5477
}
5578
}
5679

80+
private File getFilePath(String path) {
81+
File file = new File(CommonUtils.joinString(CommonConstants.CMS_FILEPATH, AnalyzerDictUtils.DIR_DICT, path));
82+
return file;
83+
}
84+
5785
@Override
5886
public Object execute(List<TemplateModel> arguments) throws TemplateModelException {
5987
String ip = getString(0, arguments);
60-
if (CommonUtils.notEmpty(ip) && IpUtils.isIpv4(ip) && null != longByteArray) {
61-
Searcher searcher = null;
88+
if (CommonUtils.notEmpty(ip)) {
6289
try {
63-
searcher = Searcher.newWithBuffer(Version.IPv4, longByteArray);
64-
return getIpRegion(searcher.search(ip));
90+
init();
91+
if (null != ip2Region) {
92+
return getIpRegion(ip2Region.search(ip));
93+
}
6594
} catch (Exception e) {
6695
log.error(e.getMessage());
67-
} finally {
68-
if (null != searcher) {
69-
try {
70-
searcher.close();
71-
} catch (IOException e) {
72-
}
73-
}
7496
}
7597
}
7698
return null;
@@ -104,4 +126,13 @@ private static IpRegion getIpRegion(String region) {
104126
return ipRegion;
105127
}
106128

129+
@PreDestroy
130+
public void destroy() {
131+
if (null != ip2Region) {
132+
try {
133+
ip2Region.close();
134+
} catch (InterruptedException e) {
135+
}
136+
}
137+
}
107138
}

publiccms-parent/publiccms-cache/src/main/java/com/publiccms/common/redis/RedisCacheEntity.java

Lines changed: 17 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,7 @@
1313
import com.publiccms.common.tools.CommonUtils;
1414
import com.publiccms.common.tools.RedisUtils;
1515

16-
import redis.clients.jedis.Jedis;
17-
import redis.clients.jedis.JedisPool;
16+
import redis.clients.jedis.RedisClient;
1817

1918
/**
2019
*
@@ -29,7 +28,7 @@ public class RedisCacheEntity<K, V> implements CacheEntity<K, V>, java.io.Serial
2928
*
3029
*/
3130
private static final long serialVersionUID = 1L;
32-
private JedisPool jedisPool;
31+
private RedisClient redisClient;
3332
private String region;
3433
private static final StringSerializer stringSerializer = new StringSerializer();
3534
private final Serializer<V> valueSerializer = new ValueSerializer<>();
@@ -38,73 +37,58 @@ public class RedisCacheEntity<K, V> implements CacheEntity<K, V>, java.io.Serial
3837

3938
@Override
4039
public List<V> put(K key, V value) {
41-
Jedis jedis = jedisPool.getResource();
42-
jedis.set(getKey(key), valueSerializer.serialize(value));
43-
jedis.close();
40+
redisClient.set(getKey(key), valueSerializer.serialize(value));
4441
return null;
4542
}
4643

4744
@Override
4845
public void put(K key, V value, Long expiryInSeconds) {
49-
Jedis jedis = jedisPool.getResource();
5046
if (null == expiryInSeconds) {
51-
jedis.set(getKey(key), valueSerializer.serialize(value));
47+
redisClient.set(getKey(key), valueSerializer.serialize(value));
5248
} else {
53-
jedis.setex(getKey(key), expiryInSeconds, valueSerializer.serialize(value));
49+
redisClient.setex(getKey(key), expiryInSeconds, valueSerializer.serialize(value));
5450
}
55-
jedis.close();
5651
}
5752

5853
@Override
5954
public V get(K key) {
60-
Jedis jedis = jedisPool.getResource();
61-
V value = valueSerializer.deserialize(jedis.get(getKey(key)));
62-
jedis.close();
63-
return value;
55+
return valueSerializer.deserialize(redisClient.get(getKey(key)));
6456
}
6557

6658
@Override
6759
public V remove(K key) {
68-
Jedis jedis = jedisPool.getResource();
6960
byte[] byteKey = getKey(key);
70-
V value = valueSerializer.deserialize(jedis.get(byteKey));
71-
jedis.del(byteKey);
72-
jedis.close();
61+
V value = valueSerializer.deserialize(redisClient.get(byteKey));
62+
redisClient.del(byteKey);
7363
return value;
7464
}
7565

7666
@Override
7767
public List<V> clear(boolean recycling) {
7868
if (recycling) {
7969
List<V> list = new ArrayList<>();
80-
Jedis jedis = jedisPool.getResource();
81-
Set<String> keyList = jedis.keys(CommonUtils.joinString(region, Constants.COLON, "*"));
70+
Set<String> keyList = redisClient.keys(CommonUtils.joinString(region, Constants.COLON, "*"));
8271
keyList.forEach(k -> {
8372
byte[] byteKey = stringSerializer.serialize(k);
84-
V value = valueSerializer.deserialize(jedis.get(byteKey));
85-
if (0 < jedis.del(k)) {
73+
V value = valueSerializer.deserialize(redisClient.get(byteKey));
74+
if (0 < redisClient.del(k)) {
8675
list.add(value);
8776
}
8877
});
89-
jedis.close();
78+
redisClient.close();
9079
return list;
9180
} else {
92-
Jedis jedis = jedisPool.getResource();
93-
Set<String> keyList = jedis.keys(CommonUtils.joinString(region, Constants.COLON, "*"));
81+
Set<String> keyList = redisClient.keys(CommonUtils.joinString(region, Constants.COLON, "*"));
9482
keyList.forEach(k -> {
95-
jedis.del(k);
83+
redisClient.del(k);
9684
});
97-
jedis.close();
9885
return null;
9986
}
10087
}
10188

10289
@Override
10390
public boolean contains(K key) {
104-
Jedis jedis = jedisPool.getResource();
105-
boolean exits = jedis.exists(getKey(key));
106-
jedis.close();
107-
return exits;
91+
return redisClient.exists(getKey(key));
10892
}
10993

11094
private byte[] getKey(K key) {
@@ -116,9 +100,9 @@ public RedisCacheEntity<K, V> init(String region, Properties properties) {
116100
return init(region, RedisUtils.createOrGetJedisPool(properties));
117101
}
118102

119-
public RedisCacheEntity<K, V> init(String region, JedisPool pool) {
103+
public RedisCacheEntity<K, V> init(String region, RedisClient redisClient) {
120104
this.region = region;
121-
this.jedisPool = pool;
105+
this.redisClient = redisClient;
122106
return this;
123107
}
124108

publiccms-parent/publiccms-cache/src/main/java/com/publiccms/common/redis/RedisClient.java renamed to publiccms-parent/publiccms-cache/src/main/java/com/publiccms/common/redis/RedisClientOperational.java

Lines changed: 11 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -8,37 +8,33 @@
88

99
import com.publiccms.common.tools.CommonUtils;
1010

11-
import redis.clients.jedis.Jedis;
12-
import redis.clients.jedis.JedisPool;
11+
import redis.clients.jedis.RedisClient;
1312

1413
/**
15-
* RedisClient
14+
* RedisClientOperational
1615
*/
17-
public class RedisClient {
16+
public class RedisClientOperational {
1817
/**
1918
*
2019
*/
2120
public static final int DEFAULT_EXPIRY_IN_SECONDS = 120;
2221

2322
protected final Log log = LogFactory.getLog(getClass());
24-
private JedisPool jedisPool;
23+
private RedisClient redisClient;
2524
private Map<String, RedisCacheEntity<Object, Object>> regionMap = new HashMap<>();
2625

2726
/**
28-
* @param jedisPool
27+
* @param redisClient
2928
*/
30-
public RedisClient(JedisPool jedisPool) {
31-
this.jedisPool = jedisPool;
29+
public RedisClientOperational(RedisClient redisClient) {
30+
this.redisClient = redisClient;
3231
}
3332

3433
/**
3534
* @return
3635
*/
3736
public long dbSize() {
38-
Jedis jedis = jedisPool.getResource();
39-
long size = jedis.dbSize();
40-
jedis.close();
41-
return size;
37+
return redisClient.dbSize();
4238
}
4339

4440
/**
@@ -111,22 +107,10 @@ public void removeRegion(String region) {
111107
* @return
112108
*/
113109
public RedisCacheEntity<Object, Object> createOrGetCache(String region) {
114-
return regionMap.computeIfAbsent(region, k -> new RedisCacheEntity<>().init(k, jedisPool));
110+
return regionMap.computeIfAbsent(region, k -> new RedisCacheEntity<>().init(k, redisClient));
115111
}
116112

117-
/**
118-
* @return
119-
*/
120-
public boolean isShutdown() {
121-
return null != jedisPool && jedisPool.isClosed();
122-
}
123-
124-
/**
125-
*
126-
*/
127-
public void shutdown() {
128-
if (null != jedisPool) {
129-
jedisPool.destroy();
130-
}
113+
public void close() {
114+
redisClient.close();
131115
}
132116
}

publiccms-parent/publiccms-cache/src/main/java/com/publiccms/common/redis/hibernate/RedisDomainDataStorageAccessImpl.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
import org.hibernate.cache.spi.support.DomainDataStorageAccess;
66
import org.hibernate.engine.spi.SharedSessionContractImplementor;
77

8-
import com.publiccms.common.redis.RedisClient;
98
import com.publiccms.common.redis.RedisCacheEntity;
9+
import com.publiccms.common.redis.RedisClientOperational;
1010

1111
/**
1212
* Redis 访问实现
@@ -16,10 +16,10 @@
1616
*/
1717
public class RedisDomainDataStorageAccessImpl implements DomainDataStorageAccess {
1818
protected final Log log = LogFactory.getLog(getClass());
19-
protected final RedisClient redisClient;
19+
protected final RedisClientOperational redisClient;
2020
protected final RedisCacheEntity<Object, Object> cache;
2121

22-
public RedisDomainDataStorageAccessImpl(RedisClient redisClient, RedisCacheEntity<Object, Object> cache) {
22+
public RedisDomainDataStorageAccessImpl(RedisClientOperational redisClient, RedisCacheEntity<Object, Object> cache) {
2323
this.redisClient = redisClient;
2424
this.cache = cache;
2525
}

0 commit comments

Comments
 (0)