Example #1
0
        private static DateTime CalculateRequestTimeout(ActivateJobsRequest request)
        {
            // we need a higher request deadline then the long polling request timeout
            var longPollingTimeout = request.RequestTimeout;

            return(longPollingTimeout <= 0
                ? TimeSpan.FromSeconds(10).FromUtcNow()
                : TimeSpan.FromSeconds((longPollingTimeout / 1000f) + 10).FromUtcNow());
        }
Example #2
0
        public void ShouldSendRequestsWithDifferentAmounts()
        {
            // given
            var expectedRequest = new ActivateJobsRequest
            {
                Timeout           = 123L,
                MaxJobsToActivate = 4,
                Type   = "foo",
                Worker = "jobWorker"
            };

            var expectedSecondRequest = new ActivateJobsRequest
            {
                Timeout           = 123L,
                MaxJobsToActivate = 2, // first response contains 3 jobs and one is handled (blocking) so 2 jobs remain in queue
                // so we can try to activate 2 new jobs
                Type   = "foo",
                Worker = "jobWorker"
            };

            TestService.AddRequestHandler(typeof(ActivateJobsRequest), request => CreateExpectedResponse());

            // when
            var receivedJobs = new List <IJob>();

            using (var jobWorker = ZeebeClient.NewWorker()
                                   .JobType("foo")
                                   .Handler((jobClient, job) =>
            {
                // block job handling
                using (var signal = new EventWaitHandle(false, EventResetMode.AutoReset))
                {
                    signal.WaitOne();
                }
            })
                                   .MaxJobsActive(4)
                                   .Name("jobWorker")
                                   .Timeout(123L)
                                   .PollInterval(TimeSpan.FromMilliseconds(100))
                                   .Open())
            {
                Assert.True(jobWorker.IsOpen());
                while (TestService.Requests.Count < 2)
                {
                }
            }

            // then
            var actualRequest = TestService.Requests[0];

            Assert.AreEqual(expectedRequest, actualRequest);

            var actualSecondRequest = TestService.Requests[1];

            Assert.AreEqual(expectedSecondRequest, actualSecondRequest);
        }
Example #3
0
 public JobWorkerBuilder(IZeebeClient zeebeClient,
                         Gateway.GatewayClient gatewayClient,
                         ILoggerFactory loggerFactory = null)
 {
     LoggerFactory = loggerFactory;
     Activator     = new JobActivator(gatewayClient);
     Request       = new ActivateJobsRequest();
     JobClient     = zeebeClient;
     ThreadCount   = 1;
 }
Example #4
0
 internal JobWorker(Gateway.GatewayClient client, ActivateJobsRequest request, TimeSpan pollInterval,
                    IJobClient jobClient, JobHandler jobHandler)
 {
     source            = new CancellationTokenSource();
     this.client       = client;
     activeRequest     = request;
     this.pollInterval = pollInterval;
     this.jobClient    = jobClient;
     this.jobHandler   = jobHandler;
 }
Example #5
0
 internal JobWorker(JobWorkerBuilder builder)
 {
     source         = new CancellationTokenSource();
     activator      = new JobActivator(builder.Client);
     activeRequest  = builder.Request;
     maxJobsActive  = activeRequest.MaxJobsToActivate;
     pollInterval   = builder.PollInterval();
     jobClient      = new JobClientWrapper(builder.JobClient);
     jobHandler     = builder.Handler();
     autoCompletion = builder.AutoCompletionEnabled();
 }
Example #6
0
 internal JobWorker(Gateway.GatewayClient client, ActivateJobsRequest request, TimeSpan pollInterval,
                    IJobClient jobClient, JobHandler jobHandler)
 {
     this.source        = new CancellationTokenSource();
     this.client        = client;
     this.activator     = new JobActivator(client);
     this.activeRequest = request;
     this.maxJobsActive = request.MaxJobsToActivate;
     this.pollInterval  = pollInterval;
     this.jobClient     = jobClient;
     this.jobHandler    = jobHandler;
 }
Example #7
0
 internal JobWorker(JobWorkerBuilder builder)
 {
     this.jobWorkerBuilder        = builder;
     this.source                  = new CancellationTokenSource();
     this.logger                  = builder.LoggerFactory?.CreateLogger <JobWorker>();
     this.jobHandler              = jobWorkerBuilder.Handler();
     this.autoCompletion          = builder.AutoCompletionEnabled();
     this.pollInterval            = jobWorkerBuilder.PollInterval();
     this.activateJobsRequest     = jobWorkerBuilder.Request;
     jobActivator                 = jobWorkerBuilder.Activator;
     this.maxJobsActive           = jobWorkerBuilder.Request.MaxJobsToActivate;
     this.thresholdJobsActivation = maxJobsActive * 0.6;
 }
Example #8
0
        public void ShouldSendFailCommandOnExceptionInJobHandler()
        {
            // given
            var expectedRequest = new ActivateJobsRequest
            {
                Timeout           = 123L,
                MaxJobsToActivate = 1,
                Type   = "foo",
                Worker = "jobWorker"
            };

            var expectedFailRequest = new FailJobRequest
            {
                JobKey       = 1,
                ErrorMessage = "Job worker 'jobWorker' tried to handle job of type 'foo', but exception occured 'Fail'",
                Retries      = 2
            };

            TestService.AddRequestHandler(typeof(ActivateJobsRequest), request => CreateExpectedResponse());

            // when
            using (var jobWorker = ZeebeClient.NewWorker()
                                   .JobType("foo")
                                   .Handler((jobClient, job) =>
            {
                if (job.Key == 1)
                {
                    throw new Exception("Fail");
                }
            })
                                   .MaxJobsActive(1)
                                   .Name("jobWorker")
                                   .Timeout(123L)
                                   .PollInterval(TimeSpan.FromMilliseconds(100))
                                   .Open())
            {
                Assert.True(jobWorker.IsOpen());
                while (TestService.Requests.Count < 2)
                {
                }
            }

            // then
            var actualRequest = TestService.Requests[0];

            Assert.AreEqual(expectedRequest, actualRequest);

            var actualFailRequest = TestService.Requests[1];

            Assert.AreEqual(expectedFailRequest, actualFailRequest);
        }
        public async Task <IActivateJobsResponse> SendActivateRequest(ActivateJobsRequest request, CancellationToken?cancelationToken = null)
        {
            using (var stream = client.ActivateJobs(request))
            {
                var responseStream = stream.ResponseStream;
                if (await MoveNext(responseStream, cancelationToken))
                {
                    var response = responseStream.Current;
                    return(new Responses.ActivateJobsResponses(response));
                }

                // empty response
                return(new Responses.ActivateJobsResponses());
            }
        }
Example #10
0
        public void ShouldSendRequestReceiveResponseAsExpected()
        {
            // given
            var expectedRequest = new ActivateJobsRequest
            {
                Timeout = 123L,
                Amount  = 1,
                Type    = "foo",
                Worker  = "jobWorker"
            };

            TestService.AddRequestHandler(typeof(ActivateJobsRequest), request => CreateExpectedResponse());

            // when
            var signal       = new EventWaitHandle(false, EventResetMode.AutoReset);
            var receivedJobs = new List <IJob>();

            using (var jobWorker = ZeebeClient.NewWorker()
                                   .JobType("foo")
                                   .Handler((jobClient, job) =>
            {
                receivedJobs.Add(job);
                if (receivedJobs.Count == 3)
                {
                    signal.Set();
                }
            })
                                   .Limit(1)
                                   .Name("jobWorker")
                                   .Timeout(123L)
                                   .PollInterval(TimeSpan.FromMilliseconds(100))
                                   .Open())
            {
                Assert.True(jobWorker.IsOpen());
                signal.WaitOne();
            }

            // then
            var actualRequest = TestService.Requests[0];

            Assert.AreEqual(expectedRequest, actualRequest);

            Assert.AreEqual(receivedJobs.Count, 3);

            AssertJob(receivedJobs[0], 1);
            AssertJob(receivedJobs[1], 2);
            AssertJob(receivedJobs[2], 3);
        }
Example #11
0
        public async Task SendActivateRequest(ActivateJobsRequest request, ConsumeJob consumer, DateTime?requestTimeout = null, CancellationToken?cancellationToken = null)
        {
            var activateRequestTimeout = requestTimeout ?? CalculateRequestTimeout(request);

            using (var stream = client.ActivateJobs(request, deadline: activateRequestTimeout))
            {
                var responseStream = stream.ResponseStream;

                while (await MoveNext(responseStream, cancellationToken))
                {
                    var currentResponse = responseStream.Current;
                    var response        = new ActivateJobsResponses(currentResponse);
                    await consumer.Invoke(response);
                }
            }
        }
Example #12
0
        public async Task <IActivateJobsResponse> SendActivateRequest(ActivateJobsRequest request, DateTime?requestTimeout = null, CancellationToken?cancelationToken = null)
        {
            DateTime activateRequestTimeout = requestTimeout ?? CalculateRequestTimeout(request);

            using (var stream = client.ActivateJobs(request, deadline: activateRequestTimeout))
            {
                var responseStream = stream.ResponseStream;
                if (await MoveNext(responseStream, cancelationToken))
                {
                    var response = responseStream.Current;
                    return(new ActivateJobsResponses(response));
                }

                // empty response
                return(new ActivateJobsResponses());
            }
        }
Example #13
0
        public async Task <IActivateJobsResponse> SendActivateRequest(ActivateJobsRequest request, CancellationToken?cancelationToken = null)
        {
            // we need a higher request deadline then the long polling request timeout
            var requestTimeout = request.RequestTimeout <= 0 ? 10 : (request.RequestTimeout / 1000) + 10;

            using (var stream = client.ActivateJobs(request, deadline: DateTime.UtcNow.AddSeconds(requestTimeout)))
            {
                var responseStream = stream.ResponseStream;
                if (await MoveNext(responseStream, cancelationToken))
                {
                    var response = responseStream.Current;
                    return(new Responses.ActivateJobsResponses(response));
                }

                // empty response
                return(new Responses.ActivateJobsResponses());
            }
        }
Example #14
0
 public override async Task ActivateJobs(ActivateJobsRequest request, IServerStreamWriter <ActivateJobsResponse> responseStream, ServerCallContext context)
 {
     await responseStream.WriteAsync((ActivateJobsResponse)HandleRequest(request, context));
 }
Example #15
0
 public ActivateJobsCommand(GatewayClient client, IAsyncRetryStrategy asyncRetryStrategy)
 {
     this.asyncRetryStrategy = asyncRetryStrategy;
     activator = new JobActivator(client);
     Request   = new ActivateJobsRequest();
 }
Example #16
0
 public override AsyncServerStreamingCall <ActivateJobsResponse> ActivateJobs(ActivateJobsRequest request, CallOptions options)
 {
     throw new ObjectDisposedException(ZeebeClientWasAlreadyDisposed);
 }
Example #17
0
 public override AsyncServerStreamingCall <ActivateJobsResponse> ActivateJobs(ActivateJobsRequest request, Metadata headers = null, DateTime?deadline = null,
                                                                              CancellationToken cancellationToken           = default(CancellationToken))
 {
     throw new ObjectDisposedException(ZeebeClientWasAlreadyDisposed);
 }
 public ActivateJobsCommand(GatewayClient client)
 {
     activator = new JobActivator(client);
     request   = new ActivateJobsRequest();
 }
 public async Task <IList <ActivatedJob> > PublishMessage([FromBody] ActivateJobsRequest request)
 {
     return(await _daprClient.InvokeBindingAsync <ActivateJobsRequest, IList <ActivatedJob> >(
                "command", Commands.ActivateJobs, request));
 }