public async Task<HttpResponseMessage> Compose(
     TenantId tenantId,
     Model.ComposeDocumentsModel dto)
 {
     QueuedJob job = new QueuedJob();
     var id = new QueuedJobId(Guid.NewGuid().ToString());
     job.Id = id;
     job.SchedulingTimestamp = DateTime.Now;
     job.StreamId = 0;
     job.TenantId = tenantId;
     job.Parameters = new Dictionary<string, string>();
     job.Parameters.Add("documentList", String.Join<Object>("|", dto.DocumentList));
     job.Parameters.Add("resultingDocumentHandle", dto.ResultingDocumentHandle);
     job.Parameters.Add("resultingDocumentFileName", dto.ResultingDocumentFileName ?? dto.ResultingDocumentHandle);
     job.Parameters.Add(JobKeys.TenantId, tenantId);
     _queueDispatcher.QueueJob("pdfComposer", job);
     return Request.CreateResponse(
         HttpStatusCode.OK, 
         new  { result = "ok"}
     );
 }
        /// <summary>
        /// Handle a <see cref="StreamReadModel" /> and generates job for the queue
        /// if needed.
        /// </summary>
        /// <param name="streamElement"></param>
        /// <param name="tenantId"></param>
        /// <param name="forceReSchedule"></param>
        public void Handle(
            StreamReadModel streamElement, 
            TenantId tenantId,
            Boolean forceReSchedule = false)
        {
            if (_info.ShouldCreateJob(streamElement)) 
            {
                if (!forceReSchedule)
                {
                    //look for already existing job with the same blobid, there is no need to re-queue again
                    //because if a job with the same blobid was already fired for this queue there is no need
                    //to re-issue
                    var existing = _collection.Find(
                        Builders< QueuedJob>.Filter.And(
                            Builders< QueuedJob>.Filter.Eq(j => j.BlobId, streamElement.FormatInfo.BlobId),
                            Builders<QueuedJob>.Filter.Eq(j => j.TenantId, tenantId)
                        )
                    ).Count() > 0;
                    if (existing) return;
                }
                if (Logger.IsDebugEnabled) Logger.DebugFormat("Create queue for readmodel stream id {0} and queue {1}", streamElement.Id, _info.Name);
                QueuedJob job = new QueuedJob();
                var id = new QueuedJobId(Guid.NewGuid().ToString());
                job.Id = id;
                job.SchedulingTimestamp = DateTime.Now;
                job.StreamId = streamElement.Id;
                job.TenantId = tenantId;
                job.DocumentDescriptorId = streamElement.DocumentDescriptorId;
                job.BlobId = streamElement.FormatInfo.BlobId;
                job.Handle = new DocumentHandle( streamElement.Handle);
                job.Parameters = new Dictionary<string, string>();
                job.Parameters.Add(JobKeys.FileExtension, streamElement.Filename.Extension);
                job.Parameters.Add(JobKeys.Format, streamElement.FormatInfo.DocumentFormat);
                job.Parameters.Add(JobKeys.FileName, streamElement.Filename);
                job.Parameters.Add(JobKeys.TenantId, tenantId);
                job.Parameters.Add(JobKeys.MimeType, MimeTypes.GetMimeType(streamElement.Filename));
                job.HandleCustomData = streamElement.DocumentCustomData;
                if (_info.Parameters != null) 
                {
                    foreach (var parameter in _info.Parameters)
                    {
                        job.Parameters.Add(parameter.Key, parameter.Value);
                    }
                }

                _collection.InsertOne(job);
            }
        }