optimized socket notification on tag changes
This commit is contained in:
parent
4632b44767
commit
1f3d63be3d
@ -61,16 +61,7 @@ public class SocketServiceClient
|
||||
}
|
||||
try
|
||||
{
|
||||
var request = new HttpRequestMessage();
|
||||
request.Headers.Add("Authorization", CreateAuthToken());
|
||||
request.Method = HttpMethod.Post;
|
||||
request.RequestUri = new Uri(GetMethod(method));
|
||||
|
||||
var jsonData = JsonConvert.SerializeObject(data);
|
||||
_logger.DebugMakeRequest(method, jsonData);
|
||||
|
||||
request.Content = new StringContent(jsonData, Encoding.UTF8, "application/json");
|
||||
|
||||
var request = GenerateRequest(method, data);
|
||||
var httpClient = _clientFactory.CreateClient();
|
||||
|
||||
//async
|
||||
@ -100,11 +91,33 @@ public class SocketServiceClient
|
||||
|
||||
return JsonConvert.DeserializeObject<T>(resultMakeRequest);
|
||||
}
|
||||
|
||||
protected void SendNotAwaitableRequest(string method, object data)
|
||||
{
|
||||
var request = GenerateRequest(method, data);
|
||||
var httpClient = _clientFactory.CreateClient();
|
||||
|
||||
_ = httpClient.SendAsync(request);
|
||||
}
|
||||
|
||||
private bool IsAvailable()
|
||||
{
|
||||
return _enableSocket && _lastErrorTime + _timeout < DateTime.Now;
|
||||
}
|
||||
|
||||
private HttpRequestMessage GenerateRequest(string method, object data)
|
||||
{
|
||||
var request = new HttpRequestMessage();
|
||||
request.Headers.Add("Authorization", CreateAuthToken());
|
||||
request.Method = HttpMethod.Post;
|
||||
request.RequestUri = new Uri(GetMethod(method));
|
||||
|
||||
var jsonData = JsonConvert.SerializeObject(data);
|
||||
_logger.DebugMakeRequest(method, jsonData);
|
||||
|
||||
request.Content = new StringContent(jsonData, Encoding.UTF8, "application/json");
|
||||
return request;
|
||||
}
|
||||
|
||||
private string GetMethod(string method)
|
||||
{
|
||||
|
@ -42,12 +42,12 @@
|
||||
});
|
||||
|
||||
router.post("/markasnew-file", (req, res) => {
|
||||
files.markAsNewFile(req.body);
|
||||
files.markAsNewFiles(req.body);
|
||||
res.end();
|
||||
});
|
||||
|
||||
router.post("/markasnew-folder", (req, res) => {
|
||||
files.markAsNewFolder(req.body);
|
||||
files.markAsNewFolders(req.body);
|
||||
res.end();
|
||||
});
|
||||
|
||||
@ -62,4 +62,4 @@
|
||||
});
|
||||
|
||||
return router;
|
||||
};
|
||||
};
|
@ -171,11 +171,19 @@
|
||||
filesIO.to(room).emit("s:markasnew-file", { fileId, count });
|
||||
}
|
||||
|
||||
function markAsNewFiles(items = []) {
|
||||
items.forEach(markAsNewFile);
|
||||
}
|
||||
|
||||
function markAsNewFolder({ folderId, count, room } = {}) {
|
||||
logger.info(`markAsNewFolder ${folderId} in room ${room}:${count}`);
|
||||
filesIO.to(room).emit("s:markasnew-folder", { folderId, count });
|
||||
}
|
||||
|
||||
function markAsNewFolders(items = []) {
|
||||
items.forEach(markAsNewFolder);
|
||||
}
|
||||
|
||||
function changeQuotaUsedValue({ featureId, value, room } = {}) {
|
||||
logger.info(`changeQuotaUsedValue in room ${room}`, { featureId, value });
|
||||
filesIO.to(room).emit("s:change-quota-used-value", { featureId, value });
|
||||
@ -195,9 +203,9 @@
|
||||
deleteFolder,
|
||||
updateFile,
|
||||
updateFolder,
|
||||
markAsNewFile,
|
||||
markAsNewFolder,
|
||||
changeQuotaUsedValue,
|
||||
changeQuotaFeatureValue,
|
||||
markAsNewFiles,
|
||||
markAsNewFolders
|
||||
};
|
||||
};
|
||||
|
@ -388,8 +388,8 @@ public class FileMarker
|
||||
{
|
||||
_semaphore.Release();
|
||||
}
|
||||
|
||||
await Task.WhenAll(ExecMarkAsNewRequest(updateTags.Concat(newTags), socketManager));
|
||||
|
||||
await SendChangeNoticeAsync(updateTags.Concat(newTags), socketManager);
|
||||
|
||||
return;
|
||||
|
||||
@ -398,6 +398,7 @@ public class FileMarker
|
||||
var tagDao1 = _daoFactory.GetTagDao<T1>();
|
||||
var exist = await tagDao1.GetNewTagsAsync(userId, entries).ToListAsync();
|
||||
var update = exist.Where(t => t.EntryType == FileEntryType.Folder).ToList();
|
||||
update.ForEach(t => t.Count++);
|
||||
updateTags.AddRange(update);
|
||||
|
||||
entries.ForEach(entry =>
|
||||
@ -595,7 +596,9 @@ public class FileMarker
|
||||
EntryType = r.EntryType
|
||||
});
|
||||
|
||||
await Task.WhenAll(ExecMarkAsNewRequest(updateTags.Concat(toRemove), socketManager));
|
||||
await SendChangeNoticeAsync(updateTags.Concat(toRemove), socketManager);
|
||||
|
||||
return;
|
||||
|
||||
async Task UpdateRemoveTags<TFolder>(Folder<TFolder> folder)
|
||||
{
|
||||
@ -1001,17 +1004,28 @@ public class FileMarker
|
||||
_cache.Remove(key);
|
||||
}
|
||||
|
||||
private IEnumerable<Task> ExecMarkAsNewRequest(IEnumerable<Tag> tags, SocketManager socketManager)
|
||||
private static async Task SendChangeNoticeAsync(IEnumerable<Tag> tags, SocketManager socketManager)
|
||||
{
|
||||
foreach (var t in tags)
|
||||
await ExecMarkAsync(tags.Where(t => t.EntryType == FileEntryType.File), socketManager.ExecMarkAsNewFilesAsync);
|
||||
await ExecMarkAsync(tags.Where(t => t.EntryType == FileEntryType.Folder), socketManager.ExecMarkAsNewFoldersAsync);
|
||||
|
||||
return;
|
||||
|
||||
async Task ExecMarkAsync(IEnumerable<Tag> filteredTags, Func<IEnumerable<Tag>, Task> requestAction)
|
||||
{
|
||||
if (t.EntryType == FileEntryType.File)
|
||||
const int packSize = 1000;
|
||||
var count = filteredTags.Count();
|
||||
var processed = 0;
|
||||
|
||||
while (processed < count)
|
||||
{
|
||||
yield return socketManager.ExecMarkAsNewFileAsync(t.EntryId, t.Count, t.Owner);
|
||||
}
|
||||
else if (t.EntryType == FileEntryType.Folder)
|
||||
{
|
||||
yield return socketManager.ExecMarkAsNewFolderAsync(t.EntryId, t.Count, t.Owner);
|
||||
var pack = filteredTags.Skip(processed)
|
||||
.Take(packSize)
|
||||
.ToList();
|
||||
|
||||
processed += pack.Count;
|
||||
|
||||
await requestAction(pack);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -33,7 +33,7 @@ public class SocketManager : SocketServiceClient
|
||||
private readonly TenantManager _tenantManager;
|
||||
|
||||
public override string Hub => "files";
|
||||
|
||||
|
||||
public SocketManager(
|
||||
ILogger<SocketServiceClient> logger,
|
||||
IHttpClientFactory clientFactory,
|
||||
@ -47,7 +47,7 @@ public class SocketManager : SocketServiceClient
|
||||
_tenantManager = tenantManager;
|
||||
_folderDtoHelper = folderDtoHelper;
|
||||
}
|
||||
|
||||
|
||||
public async Task StartEditAsync<T>(T fileId)
|
||||
{
|
||||
var room = await GetFileRoomAsync(fileId);
|
||||
@ -110,25 +110,39 @@ public class SocketManager : SocketServiceClient
|
||||
await MakeRequest("delete-folder", new { room, folderId = folder.Id });
|
||||
}
|
||||
|
||||
public async Task ExecMarkAsNewFileAsync(object fileId, int count, Guid owner)
|
||||
public async Task ExecMarkAsNewFilesAsync(IEnumerable<Tag> tags)
|
||||
{
|
||||
var room = await GetFileRoomAsync(fileId, owner);
|
||||
var result = await tags.ToAsyncEnumerable()
|
||||
.SelectAwait(async tag => new
|
||||
{
|
||||
room = await GetFileRoomAsync(tag.EntryId, tag.Owner),
|
||||
fileId = tag.EntryId,
|
||||
count = tag.Count
|
||||
})
|
||||
.ToListAsync();
|
||||
|
||||
await MakeRequest("markasnew-file", new { room, fileId, count });
|
||||
SendNotAwaitableRequest("markasnew-file", result);
|
||||
}
|
||||
|
||||
public async Task ExecMarkAsNewFolderAsync(object folderId, int count, Guid owner)
|
||||
|
||||
public async Task ExecMarkAsNewFoldersAsync(IEnumerable<Tag> tags)
|
||||
{
|
||||
var room = await GetFolderRoomAsync(folderId, owner);
|
||||
var result = await tags.ToAsyncEnumerable()
|
||||
.SelectAwait(async tag => new
|
||||
{
|
||||
room = await GetFolderRoomAsync(tag.EntryId, tag.Owner),
|
||||
folderId = tag.EntryId,
|
||||
count = tag.Count
|
||||
})
|
||||
.ToListAsync();
|
||||
|
||||
await MakeRequest("markasnew-folder", new { room, folderId, count });
|
||||
SendNotAwaitableRequest("markasnew-folder", result);
|
||||
}
|
||||
|
||||
private async Task<string> GetFileRoomAsync<T>(T fileId, Guid? owner = null)
|
||||
{
|
||||
var tenantId = await _tenantManager.GetCurrentTenantIdAsync();
|
||||
var ownerData = owner.HasValue ? "-" + owner.Value : "";
|
||||
|
||||
|
||||
return $"{tenantId}-FILE-{fileId}{ownerData}";
|
||||
}
|
||||
|
||||
@ -136,7 +150,7 @@ public class SocketManager : SocketServiceClient
|
||||
{
|
||||
var tenantId = await _tenantManager.GetCurrentTenantIdAsync();
|
||||
var ownerData = owner.HasValue ? "-" + owner.Value : "";
|
||||
|
||||
|
||||
return $"{tenantId}-DIR-{folderId}{ownerData}";
|
||||
}
|
||||
|
||||
@ -162,4 +176,4 @@ public class SocketManager : SocketServiceClient
|
||||
serializerSettings.Converters.Add(new FileEntryWrapperConverter());
|
||||
return serializerSettings;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user