Exemple #1
0
        /// <summary>
        /// Send requests to the configured service endpoint, and setup the state machine to accept the responses.
        /// </summary>
        /// <typeparam name="TInstance">The state instance type</typeparam>
        /// <typeparam name="TData">The event data type</typeparam>
        /// <typeparam name="TRequest">The request message type</typeparam>
        /// <typeparam name="TResponse">The response message type</typeparam>
        /// <param name="binder">The event binder</param>
        /// <param name="request">The configured request to use</param>
        /// <param name="messageFactory">The request message factory</param>
        /// <returns></returns>
        public static EventActivityBinder <TInstance, TData> MultiRequest <TInstance, TData, TState, TRequest, TResponse>(
            this EventActivityBinder <TInstance, TData> binder,
            MultiRequest <TInstance, TState, TRequest, TResponse> request,
            AsyncEventMultiMessageFactory <TInstance, TData, TRequest> messageFactory)
            where TInstance : class, SagaStateMachineInstance
            where TData : class
            where TRequest : class
            where TResponse : class
        {
            ScheduleTokenId.UseTokenId <RequestTimeoutExpired <TRequest> >(x => x.RequestId);
            var activity = new MultiRequestActivity <TInstance, TData, TState, TRequest, TResponse>(request, messageFactory);

            return(binder.Add(activity));
        }
Exemple #2
0
 /// <summary>
 /// Sets the <see cref="MultiRequest{TInstance, TKey, TRequest, TResponse}"/> property.
 /// </summary>
 /// <typeparam name="TKey"></typeparam>
 /// <typeparam name="TRequest"></typeparam>
 /// <typeparam name="TResponse"></typeparam>
 /// <param name="stateMachine"></param>
 /// <param name="property"></param>
 /// <param name="request"></param>
 static void InitializeMultiRequest <TKey, TRequest, TResponse>(
     AutomatonymousStateMachine <TInstance> stateMachine,
     PropertyInfo property,
     MultiRequest <TInstance, TKey, TRequest, TResponse> request)
     where TRequest : class
     where TResponse : class
 {
     if (property.CanWrite)
     {
         property.SetValue(stateMachine, request);
     }
     else if (ConfigurationHelpers.TryGetBackingField(stateMachine.GetType().GetTypeInfo(), property, out var backingField))
     {
         backingField.SetValue(stateMachine, request);
     }
     else
     {
         throw new ArgumentException($"The multi-request property is not writable: {property.Name}");
     }
 }
        public Response ReturnToRoom([FromBody] MultiRequest req)
        {
            try
            {
                var personIds = req.PersonIds
                                .Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries)
                                .Select(s => s.AsInteger()).ToList();
                RockContext   rockContext   = new RockContext();
                PersonService personService = new PersonService(rockContext);
                var           people        = personService.GetByIds(personIds);

                foreach (var person in people)
                {
                    DataHelper.AddReturnToRoomHistory(rockContext, person);
                }
                rockContext.SaveChanges();
                return(new Response(true, "Success", false));
            }
            catch (Exception e)
            {
                ExceptionLogService.LogException(e, System.Web.HttpContext.Current);
                return(new Response(false, "An error occured", false));
            }
        }
 public IEnumerable<Response> Exec(MultiRequest request) {
     var requestInfo = request as IMultiRequestInfo;
     if(!requestInfo.IsValid) {
         throw new InvalidRequestException();
     }
     ThrowIfDisposed();
     var isReconnect = !_attemptReconnect;
     while(true) {
         InitSocket();
         try {
             _socket.SendRequest(request);
             _receiver.Reset(request);
             var responses = new List<Response>();
             while(true) {
                 var response = _receiver.GetResponse();
                 if(!requestInfo.IsExpected(response.Status)) {
                     return new[] { response };
                 }
                 responses.Add(response);
                 if(response.Status == requestInfo.TerminationStatus) {
                     return responses;
                 }
             }
         } catch(SocketException) {
             DisposeSocket();
             if(isReconnect) {
                 throw;
             }
         } catch(ObjectDisposedException) {
             DisposeSocket();
             if(isReconnect) {
                 throw;
             }
         }
         isReconnect = true;
         _socket = null;
     }
 }
Exemple #5
0
 /// <summary>
 /// Initializes a new instance.
 /// </summary>
 /// <param name="request"></param>
 protected MultiRequestActivityImpl(MultiRequest <TInstance, TState, TRequest, TResponse> request)
 {
     this.request = request ?? throw new ArgumentNullException(nameof(request));
 }
 /// <summary>
 /// Initializes a new instance.
 /// </summary>
 /// <param name="request"></param>
 /// <param name="serviceAddressProvider"></param>
 /// <param name="asyncMessageFactory"></param>
 public MultiRequestActivity(MultiRequest <TInstance, TState, TRequest, TResponse> request, ServiceAddressProvider <TInstance> serviceAddressProvider, AsyncEventMultiMessageFactory <TInstance, TRequest> asyncMessageFactory) :
     base(request)
 {
     this.asyncMessageFactory = asyncMessageFactory;
     serviceAddressProvider   = context => serviceAddressProvider(context) ?? request.Settings.ServiceAddress;
 }
 /// <summary>
 /// Initializes a new instance.
 /// </summary>
 /// <param name="request"></param>
 /// <param name="messageFactory"></param>
 public MultiRequestActivity(MultiRequest <TInstance, TState, TRequest, TResponse> request, EventMultiMessageFactory <TInstance, TRequest> messageFactory) :
     base(request)
 {
     this.messageFactory    = messageFactory;
     serviceAddressProvider = context => request.Settings.ServiceAddress;
 }
Exemple #8
0
        public IEnumerable <Tuple <int, string> > Repeat(int n, string wat)
        {
            var responses = _client.Exec(MultiRequest.Create("REPEAT").WithArgument(n.ToString()).WithArgument(wat).ExpectMultiple("OK", false).TerminatedBy("DONE"));

            return(responses.Select(x => new Tuple <int, string>(int.Parse(x.Arguments[0]), x.Arguments[1])));
        }
 /// <summary>
 /// Initializes a new instance.
 /// </summary>
 /// <param name="request"></param>
 public MultiRequestItemFinishedActivity(MultiRequest <TInstance, TState, TRequest, TResponse> request)
 {
     this.request = request ?? throw new ArgumentNullException(nameof(request));
 }
 /// <summary>
 /// Initializes a new <see cref="MultiRequestFinishedEvent{TInstance, TState, TRequest, TResponse}"/> from the given context and request.
 /// </summary>
 /// <param name="context"></param>
 /// <param name="request"></param>
 /// <returns></returns>
 public static MultiRequestFinishedEvent <TInstance, TState, TRequest, TResponse> Init(InstanceContext <TInstance> context, MultiRequest <TInstance, TState, TRequest, TResponse> request)
 {
     return(new MultiRequestFinishedEvent <TInstance, TState, TRequest, TResponse>(
                request.GetItems(context)
                .Select(i => new { RequestId = request.GetRequestId(context, i), State = i })
                .Where(i => i.RequestId != null)
                .ToDictionary(i => i.RequestId.Value, i => (MultiRequestFinishedItem <TRequest, TResponse>) new MultiRequestFinishedItem <TInstance, TState, TRequest, TResponse>(context, request.Accessor, i.State))));
 }
Exemple #11
0
        public MultiResult Post([FromBody] MultiRequest mr, string profile = null)
        {
            MultiResult result = new MultiResult(Request);

            try {
                if (mr == null)
                {
                    throw new Exception("The body is missing or not formatted correctly. Maybe just a comma is missing between two attributes.");
                }
                //Apply profile from URI
                if (!string.IsNullOrEmpty(profile))
                {
                    if (mr.connection == null)
                    {
                        mr.connection = new ConnectionParams {
                            Profile = profile
                        }
                    }
                    ;
                    else if (string.IsNullOrEmpty(mr.connection.Profile))
                    {
                        mr.connection.Profile = profile;
                    }
                }
                System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
                sw.Start();
                var cp = SAPB1.getEffectiveConnectionParams(mr?.connection, ref result.connection);
                //START Transaction with using and pass the same transaction object to each request processor
                using (var t = DIConnection.startTransaction(cp)) {                 //Must be used with using !!!
                    MReqResult reqResult = null;
                    try {
                        result.totalJobsRequested = mr.requests.Count;
                        for (int i = 0; i < mr.requests.Count; i++)
                        {
                            result.index = i;
                            MReqJob mrJob = mr.requests[i];
                            reqResult = new MReqResult();
                            if (!string.IsNullOrEmpty(mrJob.boName) || mrJob.boReq != null)
                            {
                                //result.reqJob = mrJob;
                                bool post   = false;
                                bool delete = false;
                                bool put    = false;
                                bool getReq = false;
                                if (string.IsNullOrEmpty(mrJob.reqType))
                                {
                                    throw new SQLBrokerError($"Multi-Request BO job {mrJob.boName} has no reqType property (GET, PUT, DELETE, POST)");
                                }
                                else
                                {
                                    switch (mrJob.reqType)
                                    {
                                    case "GET": getReq = true; break;

                                    case "POST": post = true; break;

                                    case "PUT": put = true; break;

                                    case "DELETE": delete = true; break;

                                    default: {
                                        throw new SQLBrokerError($"Multi-Request BO job {mrJob.boName} reqType {mrJob.reqType} is invalid. Use GET, PUT, DELETE, POST");
                                    }
                                    }
                                }
                                if (mrJob.boReq == null)
                                {
                                    if (getReq || delete)
                                    {
                                        mrJob.boReq = new BORequest {
                                            connection = new ConnectionParams {
                                                Profile = profile
                                            }
                                        };
                                    }
                                    else
                                    {
                                        throw new SQLBrokerError($"Multi-Request BO job {mrJob.boName} no boReq object defined for PUT, POST");
                                    }
                                }
                                if (string.IsNullOrEmpty(mrJob.boName))
                                {
                                    throw new SQLBrokerError("Multi-request BO job has no boName property");
                                }
                                if (string.IsNullOrEmpty(mrJob.boId))
                                {
                                    if (getReq || put || delete)
                                    {
                                        throw new SQLBrokerError($"Multi-Request BO job {mrJob.boName} reqType {mrJob.reqType} requires non-empty boId property.");
                                    }
                                }
                                else
                                {
                                    if (post)
                                    {
                                        throw new SQLBrokerError($"Multi-Request BO job {mrJob.boName} reqType {mrJob.reqType} doesn't allow boId property. Delete boId from your request.");
                                    }
                                }
                                reqResult.boResult            = new BOResult(Request);
                                reqResult.boResult.connection = new NoPwdConnectionParams(cp);
                                reqResult.boResult.jobNumber  = i;
                                SAPB1.BOJob(t, q: mrJob.boReq, name: mrJob.boName, id: mrJob.boId, post: post, delete: delete, put: put, result: reqResult.boResult);
                            }
                            if (mrJob.sqlReq != null)
                            {
                                throw new SQLBrokerError($"Multi-Request SQL is not supported currently. Stay tuned, however.");
                                //var sqlResult = SAPB1.SQLQuery(value, false, new SQLResult(Request));
                            }
                            result.results.Add(reqResult);
                        }
                        t.Commit();
                        sw.Stop();
                        result.execMillis = (int)sw.Elapsed.TotalMilliseconds;
                        return(result);
                    } catch (Exception) {
                        result.errorResult = reqResult;
                        //ROLLBACK Transaction, if not rolled back alreadt
                        t.Rollback();
                        throw;
                    }
                }
                //COMMIT the transacyion if no errors occured
            } catch (Exception e) {
                if (e is SQLBrokerError)
                {
                    SQLBrokerError brokerError = e as SQLBrokerError;
                    if (result.errorResult == null)
                    {
                        result.errorResult = new MReqResult();
                    }
                    result.errorResult.boResult  = brokerError.boResult;
                    result.errorResult.sqlResult = brokerError.sqlResult;
                }
                return(result.setResponseStatus(HttpStatusCode.BadRequest, e));
            }
        }