예제 #1
0
 public IActionResult create([FromBody] EmployeeDTO employee)
 {
     try
     {
         // This needs to be checked against the partition assignment of response topic consumer
         // in future enhancements
         // This could affect response time
         var    computePartition = _configuration.GetValue <bool>("ConfigProperties:Kafka:ComputePartition");
         string requestId        = _consumer.GenerateRequestId(computePartition);
         _logger.LogInformation("Computed request id using assigned partition from response topic {requestId}", requestId);
         // var reader = new StreamReader(Request.Body);
         _logger.LogInformation("Employee {firstname} {lastname} {middlename}", employee.FirstName, employee.LastName, employee.MiddleInitial);
         var value = new EmployeeEvent();
         value.status              = StatusType.REQUESTED;
         value.employee            = _mapper.Map <Employee>(employee);
         value.employee.employeeID = requestId;
         //value.employee.nameFull = employee.nameFirst + employee.nameMiddle + employee.nameLast;
         value.action = ActionType.CREATE;
         _logger.LogInformation("Producing to {topicName}, key= {requestId}, value= {value}", topicName, requestId, value);
         _producer.ProduceRecord(topicName, requestId, value);
         EventWaitHandle syncObject = new AutoResetEvent(false);
         _synchronzationUtil.AddLockObject(requestId, syncObject);
         syncObject.WaitOne();
         return(CreatedAtRoute("GetEmployeeById", new { id = _consumer.GetResponseById(requestId) }));
     }
     catch (Exception e)
     {
         _logger.LogError("Exception writing to kafka  message  {message}, stack trace {stack}", e.Message, e.StackTrace);
         return(this.StatusCode(StatusCodes.Status500InternalServerError, "Exception writing to kafka"));
     }
 }