先保存下载任务再下发节点以保留即时状态
This commit is contained in:
@@ -16,6 +16,9 @@ public interface CustomConfigurationMapper {
|
|||||||
// @Delete("delete from customConfiguration where parameter=#{parameter}")
|
// @Delete("delete from customConfiguration where parameter=#{parameter}")
|
||||||
// void deleteConfiguration(CustomConfiguration configuration);
|
// void deleteConfiguration(CustomConfiguration configuration);
|
||||||
|
|
||||||
|
@Update("update customConfiguration set value=cast(value as integer)+#{amount} where parameter=#{parameter}")
|
||||||
|
void incrementConfiguration(@Param("parameter") String parameter, @Param("amount") long amount);
|
||||||
|
|
||||||
@Select("select * from customConfiguration where parameter=#{parameter}")
|
@Select("select * from customConfiguration where parameter=#{parameter}")
|
||||||
CustomConfiguration selectConfiguration(String parameter);
|
CustomConfiguration selectConfiguration(String parameter);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -93,9 +93,14 @@ public class GalleryManageService {
|
|||||||
} else {
|
} else {
|
||||||
taskName = gallery.getName();
|
taskName = gallery.getName();
|
||||||
log.info("创建任务: {} 目标分辨率:{}", link, targetResolution);
|
log.info("创建任务: {} 目标分辨率:{}", link, targetResolution);
|
||||||
|
// Persist before dispatch: the node sends its current status before its ACK.
|
||||||
|
gallery.setDownloader(user.getId());
|
||||||
|
gallery.set_download(true);
|
||||||
|
galleryMapper.insertGallery(gallery);
|
||||||
|
configurationMapper.incrementConfiguration(CustomConfiguration.WEEK_USED_AMOUNT, gallery.getFileSize());
|
||||||
if (remoteService.addGalleryToQueue(gallery) != 0) {
|
if (remoteService.addGalleryToQueue(gallery) != 0) {
|
||||||
log.error("传送任务{}失败, 未知原因", gallery.getName());
|
log.error("传送任务{}失败, 未知原因", gallery.getName());
|
||||||
response.failure("任务传送失败,未知原因,尝试点击重连按钮看看");
|
response.failure("任务已保存,但节点未确认接收;请刷新任务列表后重试");
|
||||||
pushService.taskCreateReport(user.getUsername(), taskName, response);
|
pushService.taskCreateReport(user.getUsername(), taskName, response);
|
||||||
return response.toJSONString();
|
return response.toJSONString();
|
||||||
}
|
}
|
||||||
@@ -111,20 +116,9 @@ public class GalleryManageService {
|
|||||||
return response.toJSONString();
|
return response.toJSONString();
|
||||||
}
|
}
|
||||||
|
|
||||||
//处理下载结果,将任务插入数据库并且更新每周用量
|
// Do not overwrite an immediate node status with the original submitted state.
|
||||||
if (gallery.getStatus().equals("已提交")) {
|
Gallery current = galleryMapper.selectGalleryByGid(gallery.getGid());
|
||||||
response.success(gallery.toString());
|
response.success((current == null ? gallery : current).toString());
|
||||||
gallery.setDownloader(user.getId());
|
|
||||||
gallery.set_download(true);
|
|
||||||
galleryMapper.insertGallery(gallery);
|
|
||||||
|
|
||||||
long usedAmount = Long.parseLong(configurationMapper.selectConfiguration(CustomConfiguration.WEEK_USED_AMOUNT).getValue());
|
|
||||||
usedAmount += gallery.getFileSize();
|
|
||||||
configurationMapper.updateConfiguration(CustomConfiguration.WEEK_USED_AMOUNT, String.valueOf(usedAmount));
|
|
||||||
} else {
|
|
||||||
response.failure("提交失败,未知原因");
|
|
||||||
galleryMapper.deleteGalleryByGid(gallery.getGid());
|
|
||||||
}
|
|
||||||
pushService.taskCreateReport(user.getUsername(), taskName, response);
|
pushService.taskCreateReport(user.getUsername(), taskName, response);
|
||||||
|
|
||||||
return response.toJSONString();
|
return response.toJSONString();
|
||||||
|
|||||||
@@ -0,0 +1,57 @@
|
|||||||
|
package com.lion.lionwebsite.Service;
|
||||||
|
|
||||||
|
import com.lion.lionwebsite.Dao.normal.*;
|
||||||
|
import com.lion.lionwebsite.Dao.cache.ImageCacheMapper;
|
||||||
|
import com.lion.lionwebsite.Domain.*;
|
||||||
|
import com.lion.lionwebsite.Util.GalleryUtil;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import java.util.concurrent.atomic.AtomicReference;
|
||||||
|
import static org.junit.jupiter.api.Assertions.*;
|
||||||
|
import static org.mockito.Mockito.*;
|
||||||
|
|
||||||
|
class GallerySubmissionTest {
|
||||||
|
@Test
|
||||||
|
void immediateCompletionSeesPersistedTask() throws Exception {
|
||||||
|
checkSubmission((byte) 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void timeoutRetainsTaskForRetry() throws Exception {
|
||||||
|
checkSubmission((byte) -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void checkSubmission(byte ack) throws Exception {
|
||||||
|
GalleryMapper galleries = mock(GalleryMapper.class);
|
||||||
|
UserMapper users = mock(UserMapper.class);
|
||||||
|
RemoteService remote = mock(RemoteService.class);
|
||||||
|
CustomConfigurationMapper configuration = mock(CustomConfigurationMapper.class);
|
||||||
|
GalleryManageService service = new GalleryManageService(galleries, mock(CollectMapper.class), configuration,
|
||||||
|
users, mock(ShareFileMapper.class), mock(ImageCacheMapper.class), remote, mock(PushService.class));
|
||||||
|
User user = new User();
|
||||||
|
user.setId(7);
|
||||||
|
user.setUsername("test");
|
||||||
|
when(users.selectUserByAuthCode("test")).thenReturn(user);
|
||||||
|
AtomicReference<Gallery> saved = new AtomicReference<>();
|
||||||
|
when(galleries.selectGalleryByGid(123)).thenAnswer(call -> saved.get());
|
||||||
|
doAnswer(call -> { saved.set(call.getArgument(0)); return null; }).when(galleries).insertGallery(any());
|
||||||
|
Gallery gallery = new Gallery();
|
||||||
|
gallery.setGid(123);
|
||||||
|
gallery.setName("sample [123]");
|
||||||
|
gallery.setStatus("已提交");
|
||||||
|
when(remote.addGalleryToQueue(any())).thenAnswer(call -> {
|
||||||
|
assertNotNull(saved.get(), "node status must find a persisted record");
|
||||||
|
assertEquals(7, saved.get().getDownloader());
|
||||||
|
if (ack == 0) saved.get().setStatus("下载完成");
|
||||||
|
return ack;
|
||||||
|
});
|
||||||
|
try (var parser = mockStatic(GalleryUtil.class)) {
|
||||||
|
parser.when(() -> GalleryUtil.parse("https://example.org/g/123/key/", true, "original")).thenReturn(gallery);
|
||||||
|
String response = service.createTask("https://example.org/g/123/key/", "original", "test");
|
||||||
|
assertNotNull(saved.get());
|
||||||
|
assertTrue(response.contains(ack == 0 ? "success" : "任务已保存"));
|
||||||
|
assertEquals(ack == 0 ? "下载完成" : "已提交", saved.get().getStatus());
|
||||||
|
verify(galleries, never()).deleteGalleryByGid(any());
|
||||||
|
verify(galleries, times(1)).insertGallery(gallery);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user