Skip to content

Commit e127fab

Browse files
committed
fix news bug
1 parent 30f94fd commit e127fab

4 files changed

Lines changed: 144 additions & 81 deletions

File tree

.idea/workspace.xml

Lines changed: 16 additions & 13 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/main/java/com/phantoms/phantomsbackend/common/utils/FF14NewsUtils.java

Lines changed: 81 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -54,62 +54,94 @@ public List<NewsItem> fetchNewsList() {
5454
List<NewsItem> newsList = new ArrayList<>();
5555

5656
try {
57-
HttpUrl url = HttpUrl.parse(NEWS_API_URL).newBuilder()
58-
.addQueryParameter("gameCode", "ff")
59-
.addQueryParameter("CategoryCode", "8324,8325,8326,8327,5309,5310,5311,5312,5313")
60-
.addQueryParameter("pageIndex", "0")
61-
.addQueryParameter("pageSize", "5")
62-
.build();
63-
64-
Request request = new Request.Builder()
65-
.url(url)
66-
.header("User-Agent", USER_AGENT)
67-
.header("Referer", "https://ff.web.sdo.com/")
68-
.get()
69-
.build();
70-
71-
try (Response response = client.newCall(request).execute()) {
72-
if (!response.isSuccessful()) {
73-
logger.error("Failed to fetch FF14 news: code={}, url={}", response.code(), url);
74-
return newsList;
75-
}
57+
// 首先获取第一页数据,了解总页数
58+
JSONObject firstPageResponse = fetchPage(0, 100);
59+
if (firstPageResponse == null) {
60+
return newsList;
61+
}
62+
63+
// 解析第一页数据
64+
parseNewsData(firstPageResponse, newsList);
7665

77-
String responseBody = response.body().string();
78-
logger.debug("FF14 news response: {}", responseBody);
79-
80-
JSONObject jsonResponse = JSONObject.parseObject(responseBody);
81-
JSONArray dataList = jsonResponse.getJSONArray("Data");
82-
83-
if (dataList != null) {
84-
for (int i = 0; i < dataList.size(); i++) {
85-
JSONObject item = dataList.getJSONObject(i);
86-
87-
String id = item.getString("Id") != null ? item.getString("Id") : "";
88-
String title = item.getString("Title") != null ? item.getString("Title") : "";
89-
String description = item.getString("Summary") != null ? item.getString("Summary") : "";
90-
String date = item.getString("PublishDate") != null ? item.getString("PublishDate") : "";
91-
String imageUrl = item.getString("HomeImagePath") != null ? item.getString("HomeImagePath").trim() : "";
92-
String outLink = item.getString("OutLink") != null ? item.getString("OutLink") : "";
93-
94-
String linkUrl;
95-
if (!outLink.isEmpty()) {
96-
linkUrl = outLink;
97-
} else {
98-
linkUrl = "https://ff.web.sdo.com/web8/index.html#/newstab/newscont/" + id;
99-
}
100-
101-
if (date.length() >= 10) {
102-
date = date.substring(0, 10);
103-
}
104-
105-
newsList.add(new NewsItem(title, description, date, imageUrl, linkUrl, id));
106-
}
66+
// 获取总页数
67+
int pageCount = firstPageResponse.getIntValue("PageCount");
68+
logger.info("Total pages: {}", pageCount);
69+
70+
// 循环获取剩余页面的数据
71+
for (int pageIndex = 1; pageIndex < pageCount; pageIndex++) {
72+
logger.info("Fetching page: {}/{}", pageIndex + 1, pageCount);
73+
JSONObject pageResponse = fetchPage(pageIndex, 100);
74+
if (pageResponse != null) {
75+
parseNewsData(pageResponse, newsList);
10776
}
77+
// 避免请求过快,添加短暂延迟
78+
Thread.sleep(100);
10879
}
80+
81+
logger.info("Total news items fetched: {}", newsList.size());
82+
10983
} catch (Exception e) {
11084
logger.error("Error fetching FF14 news", e);
11185
}
11286

11387
return newsList;
11488
}
89+
90+
private JSONObject fetchPage(int pageIndex, int pageSize) throws IOException {
91+
HttpUrl url = HttpUrl.parse(NEWS_API_URL).newBuilder()
92+
.addQueryParameter("gameCode", "ff")
93+
.addQueryParameter("CategoryCode", "8324,8325,8326,8327,5309,5310,5311,5312,5313")
94+
.addQueryParameter("pageIndex", String.valueOf(pageIndex))
95+
.addQueryParameter("pageSize", String.valueOf(pageSize))
96+
.build();
97+
98+
Request request = new Request.Builder()
99+
.url(url)
100+
.header("User-Agent", USER_AGENT)
101+
.header("Referer", "https://ff.web.sdo.com/")
102+
.get()
103+
.build();
104+
105+
try (Response response = client.newCall(request).execute()) {
106+
if (!response.isSuccessful()) {
107+
logger.error("Failed to fetch FF14 news page {}: code={}, url={}", pageIndex, response.code(), url);
108+
return null;
109+
}
110+
111+
String responseBody = response.body().string();
112+
logger.debug("FF14 news page {} response: {}", pageIndex, responseBody);
113+
114+
return JSONObject.parseObject(responseBody);
115+
}
116+
}
117+
118+
private void parseNewsData(JSONObject jsonResponse, List<NewsItem> newsList) {
119+
JSONArray dataList = jsonResponse.getJSONArray("Data");
120+
121+
if (dataList != null) {
122+
for (int i = 0; i < dataList.size(); i++) {
123+
JSONObject item = dataList.getJSONObject(i);
124+
125+
String id = item.getString("Id") != null ? item.getString("Id") : "";
126+
String title = item.getString("Title") != null ? item.getString("Title") : "";
127+
String description = item.getString("Summary") != null ? item.getString("Summary") : "";
128+
String date = item.getString("PublishDate") != null ? item.getString("PublishDate") : "";
129+
String imageUrl = item.getString("HomeImagePath") != null ? item.getString("HomeImagePath").trim() : "";
130+
String outLink = item.getString("OutLink") != null ? item.getString("OutLink") : "";
131+
132+
String linkUrl;
133+
if (!outLink.isEmpty()) {
134+
linkUrl = outLink;
135+
} else {
136+
linkUrl = "https://ff.web.sdo.com/web8/index.html#/newstab/newscont/" + id;
137+
}
138+
139+
if (date.length() >= 10) {
140+
date = date.substring(0, 10);
141+
}
142+
143+
newsList.add(new NewsItem(title, description, date, imageUrl, linkUrl, id));
144+
}
145+
}
146+
}
115147
}

src/main/java/com/phantoms/phantomsbackend/service/scheduler/FF14GlobalNewsScheduler.java

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@ public class FF14GlobalNewsScheduler {
2020
private static final Logger logger = LoggerFactory.getLogger(FF14GlobalNewsScheduler.class);
2121

2222
private static final String FF14_GLOBAL_NEWS_CACHE_KEY = "news:lodestone:last_ids";
23+
24+
// 内存缓存,当Redis不可用时使用
25+
private List<String> inMemoryCache = new ArrayList<>();
2326

2427
@Autowired
2528
private FF14GlobalNewsUtils ff14GlobalNewsUtils;
@@ -49,17 +52,21 @@ public void fetchAndSendFF14GlobalNews() {
4952
.map(FF14GlobalNewsUtils.NewsItem::getId)
5053
.collect(Collectors.toList());
5154

52-
Object cachedIdsObj = redisUtil.get(FF14_GLOBAL_NEWS_CACHE_KEY);
55+
// 获取缓存的新闻ID,增加异常处理
5356
List<String> cachedIds = new ArrayList<>();
54-
if (cachedIdsObj instanceof List) {
55-
cachedIds.addAll((List<String>) cachedIdsObj);
57+
try {
58+
Object cachedIdsObj = redisUtil.get(FF14_GLOBAL_NEWS_CACHE_KEY);
59+
if (cachedIdsObj instanceof List) {
60+
cachedIds = (List<String>) cachedIdsObj;
61+
}
62+
} catch (Exception e) {
63+
logger.warn("Redis读取缓存失败,使用内存缓存: {}", e.getMessage());
64+
cachedIds = new ArrayList<>(inMemoryCache);
5665
}
5766

67+
List<String> finalCachedIds = cachedIds;
5868
List<FF14GlobalNewsUtils.NewsItem> newNewsList = newsList.stream()
59-
.filter(news -> {
60-
final List<String> finalCachedIds = cachedIds;
61-
return !finalCachedIds.contains(news.getId());
62-
})
69+
.filter(news -> !finalCachedIds.contains(news.getId()))
6370
.collect(Collectors.toList());
6471

6572
if (!newNewsList.isEmpty()) {
@@ -69,7 +76,15 @@ public void fetchAndSendFF14GlobalNews() {
6976
logger.debug("没有FF14国际服新新闻");
7077
}
7178

72-
redisUtil.set(FF14_GLOBAL_NEWS_CACHE_KEY, currentIds);
79+
// 更新缓存,增加异常处理
80+
try {
81+
redisUtil.set(FF14_GLOBAL_NEWS_CACHE_KEY, currentIds);
82+
// 同时更新内存缓存
83+
inMemoryCache = new ArrayList<>(currentIds);
84+
} catch (Exception e) {
85+
logger.warn("Redis更新缓存失败,仅更新内存缓存: {}", e.getMessage());
86+
inMemoryCache = new ArrayList<>(currentIds);
87+
}
7388

7489
} catch (Exception e) {
7590
logger.error("获取FF14国际服新闻失败", e);

src/main/java/com/phantoms/phantomsbackend/service/scheduler/FF14NewsScheduler.java

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@ public class FF14NewsScheduler {
2020
private static final Logger logger = LoggerFactory.getLogger(FF14NewsScheduler.class);
2121

2222
private static final String FF14_NEWS_CACHE_KEY = "news:cqnews:last_ids";
23+
24+
// 内存缓存,当Redis不可用时使用
25+
private List<String> inMemoryCache = new ArrayList<>();
2326

2427
@Autowired
2528
private FF14NewsUtils ff14NewsUtils;
@@ -49,19 +52,21 @@ public void fetchAndSendFF14News() {
4952
.map(FF14NewsUtils.NewsItem::getId)
5053
.collect(Collectors.toList());
5154

52-
Object cachedIdsObj = redisUtil.get(FF14_NEWS_CACHE_KEY);
53-
List<String> cachedIds;
54-
if (cachedIdsObj instanceof List) {
55-
cachedIds = (List<String>) cachedIdsObj;
56-
} else {
57-
cachedIds = new ArrayList<>();
55+
// 获取缓存的新闻ID,增加异常处理
56+
List<String> cachedIds = new ArrayList<>();
57+
try {
58+
Object cachedIdsObj = redisUtil.get(FF14_NEWS_CACHE_KEY);
59+
if (cachedIdsObj instanceof List) {
60+
cachedIds = (List<String>) cachedIdsObj;
61+
}
62+
} catch (Exception e) {
63+
logger.warn("Redis读取缓存失败,使用内存缓存: {}", e.getMessage());
64+
cachedIds = new ArrayList<>(inMemoryCache);
5865
}
5966

67+
List<String> finalCachedIds = cachedIds;
6068
List<FF14NewsUtils.NewsItem> newNewsList = newsList.stream()
61-
.filter(news -> {
62-
final List<String> finalCachedIds = cachedIds;
63-
return !finalCachedIds.contains(news.getId());
64-
})
69+
.filter(news -> !finalCachedIds.contains(news.getId()))
6570
.collect(Collectors.toList());
6671

6772
if (!newNewsList.isEmpty()) {
@@ -71,7 +76,15 @@ public void fetchAndSendFF14News() {
7176
logger.debug("没有新新闻");
7277
}
7378

74-
redisUtil.set(FF14_NEWS_CACHE_KEY, currentIds);
79+
// 更新缓存,增加异常处理
80+
try {
81+
redisUtil.set(FF14_NEWS_CACHE_KEY, currentIds);
82+
// 同时更新内存缓存
83+
inMemoryCache = new ArrayList<>(currentIds);
84+
} catch (Exception e) {
85+
logger.warn("Redis更新缓存失败,仅更新内存缓存: {}", e.getMessage());
86+
inMemoryCache = new ArrayList<>(currentIds);
87+
}
7588

7689
} catch (Exception e) {
7790
logger.error("获取FF14新闻失败", e);

0 commit comments

Comments
 (0)