Browse Source

Timeout improvement.

pull/351/head v2.0
Sebastian Stehle 7 years ago
parent
commit
b9891ffa6c
  1. 3
      extensions/Squidex.Extensions/Actions/Webhook/WebhookActionHandler.cs
  2. 67
      src/Squidex.Domain.Apps.Entities/Contents/Text/GrainTextIndexer.cs
  3. 24
      tests/Squidex.Domain.Apps.Entities.Tests/Contents/Text/GrainTextIndexerTests.cs

3
extensions/Squidex.Extensions/Actions/Webhook/WebhookActionHandler.cs

@ -17,6 +17,7 @@ namespace Squidex.Extensions.Actions.Webhook
{
public sealed class WebhookActionHandler : RuleActionHandler<WebhookAction, WebhookJob>
{
private static readonly TimeSpan DefaultTimeout = TimeSpan.FromSeconds(2);
private readonly IHttpClientFactory httpClientFactory;
public WebhookActionHandler(RuleEventFormatter formatter, IHttpClientFactory httpClientFactory)
@ -47,6 +48,8 @@ namespace Squidex.Extensions.Actions.Webhook
{
using (var httpClient = httpClientFactory.CreateClient())
{
httpClient.Timeout = DefaultTimeout;
var request = new HttpRequestMessage(HttpMethod.Post, job.RequestUrl)
{
Content = new StringContent(job.RequestBody, Encoding.UTF8, "application/json")

67
src/Squidex.Domain.Apps.Entities/Contents/Text/GrainTextIndexer.cs

@ -22,7 +22,6 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text
{
public sealed class GrainTextIndexer : ITextIndexer, IEventConsumer
{
private readonly RetryWindow retryWindow = new RetryWindow(TimeSpan.FromMinutes(5), 5);
private readonly IGrainFactory grainFactory;
private readonly ISemanticLog log;
@ -58,49 +57,33 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text
public async Task On(Envelope<IEvent> @event)
{
try
if (@event.Payload is ContentEvent contentEvent)
{
if (@event.Payload is ContentEvent contentEvent)
{
var index = grainFactory.GetGrain<ITextIndexerGrain>(contentEvent.SchemaId.Id);
var id = contentEvent.ContentId;
switch (@event.Payload)
{
case ContentDeleted _:
await index.DeleteAsync(id);
break;
case ContentCreated contentCreated:
await index.IndexAsync(id, Data(contentCreated.Data), true);
break;
case ContentUpdateProposed contentCreated:
await index.IndexAsync(id, Data(contentCreated.Data), true);
break;
case ContentUpdated contentUpdated:
await index.IndexAsync(id, Data(contentUpdated.Data), false);
break;
case ContentChangesDiscarded _:
await index.CopyAsync(id, false);
break;
case ContentChangesPublished _:
case ContentStatusChanged contentStatusChanged when contentStatusChanged.Status == Status.Published:
await index.CopyAsync(id, true);
break;
}
}
}
catch (Exception ex)
{
if (retryWindow.CanRetryAfterFailure())
{
log.LogError(ex, w => w
.WriteProperty("action", "DeleteTextEntry")
.WriteProperty("status", "Failed"));
}
else
var index = grainFactory.GetGrain<ITextIndexerGrain>(contentEvent.SchemaId.Id);
var id = contentEvent.ContentId;
switch (@event.Payload)
{
throw;
case ContentDeleted _:
await index.DeleteAsync(id);
break;
case ContentCreated contentCreated:
await index.IndexAsync(id, Data(contentCreated.Data), true);
break;
case ContentUpdateProposed contentCreated:
await index.IndexAsync(id, Data(contentCreated.Data), true);
break;
case ContentUpdated contentUpdated:
await index.IndexAsync(id, Data(contentUpdated.Data), false);
break;
case ContentChangesDiscarded _:
await index.CopyAsync(id, false);
break;
case ContentChangesPublished _:
case ContentStatusChanged contentStatusChanged when contentStatusChanged.Status == Status.Published:
await index.CopyAsync(id, true);
break;
}
}
}

24
tests/Squidex.Domain.Apps.Entities.Tests/Contents/Text/GrainTextIndexerTests.cs

@ -102,30 +102,6 @@ namespace Squidex.Domain.Apps.Entities.Contents.Text
.MustHaveHappened();
}
[Fact]
public async Task Should_catch_exception_when_indexing_failed()
{
A.CallTo(() => grain.IndexAsync(contentId, A<J<IndexData>>.Ignored, false))
.Throws(new InvalidOperationException());
await sut.On(E(new ContentCreated { Data = data }));
}
[Fact]
public async Task Should_not_catch_exception_when_indexing_failed_often()
{
A.CallTo(() => grain.IndexAsync(contentId, A<J<IndexData>>.Ignored, A<bool>.Ignored))
.Throws(new InvalidOperationException());
await Assert.ThrowsAsync<InvalidOperationException>(async () =>
{
for (var i = 0; i < 10; i++)
{
await sut.On(E(new ContentCreated { Data = data }));
}
});
}
[Fact]
public async Task Should_call_grain_when_searching()
{

Loading…
Cancel
Save