Olá Pessoal! Neste post eu vou demonstrar o uso prático de filas na execução de requisições em uma API construída em ASP.NET Core 7. Antes de começar com código-fonte diretamente, seguem alguns pré-requisitos para a API desenvolvida:

  • Para esse exercício, você precisará de conhecimentos básicos de Visual Studio e Swagger (para chamar as APIs);
  • Há 2 endpoints: Save e Process. O primeiro endpoint é responsável por receber e guardar imagens no diretório wwwroot, enquanto que o segundo endpoint pesquisa as imagens no mesmo diretório e as retorna, conforme parâmetros da requisição;
  • As imagens são salvas como JPG, independente do formato enviado (BMP, PNG, etc.);
  • A aplicação utiliza uma biblioteca chamada ImageSharp (SixLabors) para manipulação de imagens;
  • Como o processo de salvar é paralelo, ou seja as imagens não são processadas sequencialmente, há uma inteligência na API para salvar apenas as imagens finais no diretório. Ex.: uma chamada que contenha 2 imagens com o mesmo nome na requisição: apenas a última imagem por nome distinto enviada será salva (isso evita que elas sejam sobrescritas desnecessariamente);
  • Como as duas API são construídas com o conceito de fila (queue), elas podem ser chamadas individualmente e simultâneamente sem problema nenhum.

Clone o repositório do github https://github.com/guilhermesuzuki/fila-no-asp-net-core-7.git e abra a solução dentro do diretório. Logo de cara, você vê dois projetos: fila-no-asp-net-core-7 e fila-no-asp-net-core-7.Tests. Tenha certeza que o primeiro projeto esteja configurado como startup, clicando com o botão direito do mouse sobre ele e depois em Set as Startup Project (veja imagem abaixo):

Antes de rodar a aplicação, navegue para as 2 duas controllers dentro do projeto principal (ProcessController.cs e SaveController.cs). Essas duas controllers em conjunto com as classes ProcessHub e SaveHub são o coração da aplicação e funcionam da seguinte maneira, quando uma requisição é feita:

Agora finalmente, rode a aplicação apertando o play no Visual Studio. Você deverá ver uma janela de browser com o seguinte layout:

Agora chame a API Save no Swagger com a seguinte requisição (contendo 9 imagens no total, 5 distintas):

{
    "RequestId": 12345,
    "Images": [
        {
            "FileName": "image1.jpg",
            "base64": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD/wAARCAAgACADASIAAhEBAxEB/8QBogAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoLEAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+foBAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKCxEAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9sAhAAIBgYHBgUIBwcHCQkICgwUDQwLCwwZEhMPFB0aHx4dGhwcICQuJyAiLCMcHCg3KSwwMTQ0NB8nOT04MjwuMzQyAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/2gAMAwEAAhEDEQA/AOn+Efhbw9qPwv0i6vtA0u6uZfO8yaezjd2xM4GSRk4AA/CnfEPQvDlhplrpOm+GtIj1HVJCiyRWMStFCmDK4bYQDgqg5BBkyD8tcl4B8R65B4MtdBsNSsrQW6CTzYoBLNGskhk/iYoc5K/d46cGu2trOWS8OpancfbNRaFYDM0aphFZmCgKAOrHPvXiZjnNHDRlGLvP0OujhJtqUthngTwr4afT7jSL7w3pc17YPkzTWSO00MhZo3LMvsyYySNnYEVpeMfB3he18D+ILiDw5o8M8Wm3DxyR2MSsjCJiCCFyCDzmqN5plxdX1vqVlqs+nX8EbxJNDEj7kYjKsGGGHAIB4BwayvGOr+IpNB1DQhrFhLcXtrPJsSxKyiHkuCd5VV2nywSu4+pbLVnl2d0K0IwqStPro/vvYVbDzUm4rQ8C8Na0dF1VLqKGSSbbsj2S7OT6jB3DkZBr6VsZHltIt6gOVA46E98fjmvlbT5Ei1G3klbZGsisWxnABzXba18UdTusQaaTb265BJ5Ln+g9qWc5XUxtSHslr1b/AANMNWjTpvnfyPf7iR4bSV4U3ypGSi+pA4zXznJ8Q/E3mak0ciKNQZvOJgVmKkbQm4jICg4A7ZPrW/4c+Ml9YRJbaxbC8jBw0qna+30x0J9+K5fUPGeoyTPFZTLDbRyN5TpEFdkz8u4/SubKsprYWU4Vqale1m3p+T8h4itCaTjKx//Z"
        },
        {
            "FileName": "image1.jpg",
            "base64": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD/wAARCAAgACADASIAAhEBAxEB/8QBogAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoLEAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+foBAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKCxEAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9sAhAAIBgYHBgUIBwcHCQkICgwUDQwLCwwZEhMPFB0aHx4dGhwcICQuJyAiLCMcHCg3KSwwMTQ0NB8nOT04MjwuMzQyAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/2gAMAwEAAhEDEQA/AOn+Efhbw9qPwv0i6vtA0u6uZfO8yaezjd2xM4GSRk4AA/CnfEPQvDlhplrpOm+GtIj1HVJCiyRWMStFCmDK4bYQDgqg5BBkyD8tcl4B8R65B4MtdBsNSsrQW6CTzYoBLNGskhk/iYoc5K/d46cGu2trOWS8OpancfbNRaFYDM0aphFZmCgKAOrHPvXiZjnNHDRlGLvP0OujhJtqUthngTwr4afT7jSL7w3pc17YPkzTWSO00MhZo3LMvsyYySNnYEVpeMfB3he18D+ILiDw5o8M8Wm3DxyR2MSsjCJiCCFyCDzmqN5plxdX1vqVlqs+nX8EbxJNDEj7kYjKsGGGHAIB4BwayvGOr+IpNB1DQhrFhLcXtrPJsSxKyiHkuCd5VV2nywSu4+pbLVnl2d0K0IwqStPro/vvYVbDzUm4rQ8C8Na0dF1VLqKGSSbbsj2S7OT6jB3DkZBr6VsZHltIt6gOVA46E98fjmvlbT5Ei1G3klbZGsisWxnABzXba18UdTusQaaTb265BJ5Ln+g9qWc5XUxtSHslr1b/AANMNWjTpvnfyPf7iR4bSV4U3ypGSi+pA4zXznJ8Q/E3mak0ciKNQZvOJgVmKkbQm4jICg4A7ZPrW/4c+Ml9YRJbaxbC8jBw0qna+30x0J9+K5fUPGeoyTPFZTLDbRyN5TpEFdkz8u4/SubKsprYWU4Vqale1m3p+T8h4itCaTjKx//Z"
        },
        {
            "FileName": "image2.jpg",
            "base64": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD/wAARCAAgACADASIAAhEBAxEB/8QBogAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoLEAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+foBAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKCxEAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9sAhAAIBgYHBgUIBwcHCQkICgwUDQwLCwwZEhMPFB0aHx4dGhwcICQuJyAiLCMcHCg3KSwwMTQ0NB8nOT04MjwuMzQyAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/2gAMAwEAAhEDEQA/AOn+Efhbw9qPwv0i6vtA0u6uZfO8yaezjd2xM4GSRk4AA/CnfEPQvDlhplrpOm+GtIj1HVJCiyRWMStFCmDK4bYQDgqg5BBkyD8tcl4B8R65B4MtdBsNSsrQW6CTzYoBLNGskhk/iYoc5K/d46cGu2trOWS8OpancfbNRaFYDM0aphFZmCgKAOrHPvXiZjnNHDRlGLvP0OujhJtqUthngTwr4afT7jSL7w3pc17YPkzTWSO00MhZo3LMvsyYySNnYEVpeMfB3he18D+ILiDw5o8M8Wm3DxyR2MSsjCJiCCFyCDzmqN5plxdX1vqVlqs+nX8EbxJNDEj7kYjKsGGGHAIB4BwayvGOr+IpNB1DQhrFhLcXtrPJsSxKyiHkuCd5VV2nywSu4+pbLVnl2d0K0IwqStPro/vvYVbDzUm4rQ8C8Na0dF1VLqKGSSbbsj2S7OT6jB3DkZBr6VsZHltIt6gOVA46E98fjmvlbT5Ei1G3klbZGsisWxnABzXba18UdTusQaaTb265BJ5Ln+g9qWc5XUxtSHslr1b/AANMNWjTpvnfyPf7iR4bSV4U3ypGSi+pA4zXznJ8Q/E3mak0ciKNQZvOJgVmKkbQm4jICg4A7ZPrW/4c+Ml9YRJbaxbC8jBw0qna+30x0J9+K5fUPGeoyTPFZTLDbRyN5TpEFdkz8u4/SubKsprYWU4Vqale1m3p+T8h4itCaTjKx//Z"
        },
        {
            "FileName": "image2.jpg",
            "base64": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD/wAARCAAgACADASIAAhEBAxEB/8QBogAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoLEAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+foBAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKCxEAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9sAhAAIBgYHBgUIBwcHCQkICgwUDQwLCwwZEhMPFB0aHx4dGhwcICQuJyAiLCMcHCg3KSwwMTQ0NB8nOT04MjwuMzQyAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/2gAMAwEAAhEDEQA/AOn+Efhbw9qPwv0i6vtA0u6uZfO8yaezjd2xM4GSRk4AA/CnfEPQvDlhplrpOm+GtIj1HVJCiyRWMStFCmDK4bYQDgqg5BBkyD8tcl4B8R65B4MtdBsNSsrQW6CTzYoBLNGskhk/iYoc5K/d46cGu2trOWS8OpancfbNRaFYDM0aphFZmCgKAOrHPvXiZjnNHDRlGLvP0OujhJtqUthngTwr4afT7jSL7w3pc17YPkzTWSO00MhZo3LMvsyYySNnYEVpeMfB3he18D+ILiDw5o8M8Wm3DxyR2MSsjCJiCCFyCDzmqN5plxdX1vqVlqs+nX8EbxJNDEj7kYjKsGGGHAIB4BwayvGOr+IpNB1DQhrFhLcXtrPJsSxKyiHkuCd5VV2nywSu4+pbLVnl2d0K0IwqStPro/vvYVbDzUm4rQ8C8Na0dF1VLqKGSSbbsj2S7OT6jB3DkZBr6VsZHltIt6gOVA46E98fjmvlbT5Ei1G3klbZGsisWxnABzXba18UdTusQaaTb265BJ5Ln+g9qWc5XUxtSHslr1b/AANMNWjTpvnfyPf7iR4bSV4U3ypGSi+pA4zXznJ8Q/E3mak0ciKNQZvOJgVmKkbQm4jICg4A7ZPrW/4c+Ml9YRJbaxbC8jBw0qna+30x0J9+K5fUPGeoyTPFZTLDbRyN5TpEFdkz8u4/SubKsprYWU4Vqale1m3p+T8h4itCaTjKx//Z"
        },
        {
            "FileName": "image3.jpg",
            "base64": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD/wAARCAAgACADASIAAhEBAxEB/8QBogAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoLEAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+foBAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKCxEAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9sAhAAIBgYHBgUIBwcHCQkICgwUDQwLCwwZEhMPFB0aHx4dGhwcICQuJyAiLCMcHCg3KSwwMTQ0NB8nOT04MjwuMzQyAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/2gAMAwEAAhEDEQA/AOn+Efhbw9qPwv0i6vtA0u6uZfO8yaezjd2xM4GSRk4AA/CnfEPQvDlhplrpOm+GtIj1HVJCiyRWMStFCmDK4bYQDgqg5BBkyD8tcl4B8R65B4MtdBsNSsrQW6CTzYoBLNGskhk/iYoc5K/d46cGu2trOWS8OpancfbNRaFYDM0aphFZmCgKAOrHPvXiZjnNHDRlGLvP0OujhJtqUthngTwr4afT7jSL7w3pc17YPkzTWSO00MhZo3LMvsyYySNnYEVpeMfB3he18D+ILiDw5o8M8Wm3DxyR2MSsjCJiCCFyCDzmqN5plxdX1vqVlqs+nX8EbxJNDEj7kYjKsGGGHAIB4BwayvGOr+IpNB1DQhrFhLcXtrPJsSxKyiHkuCd5VV2nywSu4+pbLVnl2d0K0IwqStPro/vvYVbDzUm4rQ8C8Na0dF1VLqKGSSbbsj2S7OT6jB3DkZBr6VsZHltIt6gOVA46E98fjmvlbT5Ei1G3klbZGsisWxnABzXba18UdTusQaaTb265BJ5Ln+g9qWc5XUxtSHslr1b/AANMNWjTpvnfyPf7iR4bSV4U3ypGSi+pA4zXznJ8Q/E3mak0ciKNQZvOJgVmKkbQm4jICg4A7ZPrW/4c+Ml9YRJbaxbC8jBw0qna+30x0J9+K5fUPGeoyTPFZTLDbRyN5TpEFdkz8u4/SubKsprYWU4Vqale1m3p+T8h4itCaTjKx//Z"
        },
        {
            "FileName": "image3.jpg",
            "base64": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD/wAARCAAgACADASIAAhEBAxEB/8QBogAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoLEAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+foBAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKCxEAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9sAhAAIBgYHBgUIBwcHCQkICgwUDQwLCwwZEhMPFB0aHx4dGhwcICQuJyAiLCMcHCg3KSwwMTQ0NB8nOT04MjwuMzQyAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/2gAMAwEAAhEDEQA/AOn+Efhbw9qPwv0i6vtA0u6uZfO8yaezjd2xM4GSRk4AA/CnfEPQvDlhplrpOm+GtIj1HVJCiyRWMStFCmDK4bYQDgqg5BBkyD8tcl4B8R65B4MtdBsNSsrQW6CTzYoBLNGskhk/iYoc5K/d46cGu2trOWS8OpancfbNRaFYDM0aphFZmCgKAOrHPvXiZjnNHDRlGLvP0OujhJtqUthngTwr4afT7jSL7w3pc17YPkzTWSO00MhZo3LMvsyYySNnYEVpeMfB3he18D+ILiDw5o8M8Wm3DxyR2MSsjCJiCCFyCDzmqN5plxdX1vqVlqs+nX8EbxJNDEj7kYjKsGGGHAIB4BwayvGOr+IpNB1DQhrFhLcXtrPJsSxKyiHkuCd5VV2nywSu4+pbLVnl2d0K0IwqStPro/vvYVbDzUm4rQ8C8Na0dF1VLqKGSSbbsj2S7OT6jB3DkZBr6VsZHltIt6gOVA46E98fjmvlbT5Ei1G3klbZGsisWxnABzXba18UdTusQaaTb265BJ5Ln+g9qWc5XUxtSHslr1b/AANMNWjTpvnfyPf7iR4bSV4U3ypGSi+pA4zXznJ8Q/E3mak0ciKNQZvOJgVmKkbQm4jICg4A7ZPrW/4c+Ml9YRJbaxbC8jBw0qna+30x0J9+K5fUPGeoyTPFZTLDbRyN5TpEFdkz8u4/SubKsprYWU4Vqale1m3p+T8h4itCaTjKx//Z"
        },
        {
            "FileName": "image4.jpg",
            "base64": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD/wAARCAAgACADASIAAhEBAxEB/8QBogAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoLEAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+foBAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKCxEAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9sAhAAIBgYHBgUIBwcHCQkICgwUDQwLCwwZEhMPFB0aHx4dGhwcICQuJyAiLCMcHCg3KSwwMTQ0NB8nOT04MjwuMzQyAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/2gAMAwEAAhEDEQA/AOn+Efhbw9qPwv0i6vtA0u6uZfO8yaezjd2xM4GSRk4AA/CnfEPQvDlhplrpOm+GtIj1HVJCiyRWMStFCmDK4bYQDgqg5BBkyD8tcl4B8R65B4MtdBsNSsrQW6CTzYoBLNGskhk/iYoc5K/d46cGu2trOWS8OpancfbNRaFYDM0aphFZmCgKAOrHPvXiZjnNHDRlGLvP0OujhJtqUthngTwr4afT7jSL7w3pc17YPkzTWSO00MhZo3LMvsyYySNnYEVpeMfB3he18D+ILiDw5o8M8Wm3DxyR2MSsjCJiCCFyCDzmqN5plxdX1vqVlqs+nX8EbxJNDEj7kYjKsGGGHAIB4BwayvGOr+IpNB1DQhrFhLcXtrPJsSxKyiHkuCd5VV2nywSu4+pbLVnl2d0K0IwqStPro/vvYVbDzUm4rQ8C8Na0dF1VLqKGSSbbsj2S7OT6jB3DkZBr6VsZHltIt6gOVA46E98fjmvlbT5Ei1G3klbZGsisWxnABzXba18UdTusQaaTb265BJ5Ln+g9qWc5XUxtSHslr1b/AANMNWjTpvnfyPf7iR4bSV4U3ypGSi+pA4zXznJ8Q/E3mak0ciKNQZvOJgVmKkbQm4jICg4A7ZPrW/4c+Ml9YRJbaxbC8jBw0qna+30x0J9+K5fUPGeoyTPFZTLDbRyN5TpEFdkz8u4/SubKsprYWU4Vqale1m3p+T8h4itCaTjKx//Z"
        },
        {
            "FileName": "image4.jpg",
            "base64": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD/wAARCAAgACADASIAAhEBAxEB/8QBogAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoLEAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+foBAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKCxEAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9sAhAAIBgYHBgUIBwcHCQkICgwUDQwLCwwZEhMPFB0aHx4dGhwcICQuJyAiLCMcHCg3KSwwMTQ0NB8nOT04MjwuMzQyAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/2gAMAwEAAhEDEQA/AOn+Efhbw9qPwv0i6vtA0u6uZfO8yaezjd2xM4GSRk4AA/CnfEPQvDlhplrpOm+GtIj1HVJCiyRWMStFCmDK4bYQDgqg5BBkyD8tcl4B8R65B4MtdBsNSsrQW6CTzYoBLNGskhk/iYoc5K/d46cGu2trOWS8OpancfbNRaFYDM0aphFZmCgKAOrHPvXiZjnNHDRlGLvP0OujhJtqUthngTwr4afT7jSL7w3pc17YPkzTWSO00MhZo3LMvsyYySNnYEVpeMfB3he18D+ILiDw5o8M8Wm3DxyR2MSsjCJiCCFyCDzmqN5plxdX1vqVlqs+nX8EbxJNDEj7kYjKsGGGHAIB4BwayvGOr+IpNB1DQhrFhLcXtrPJsSxKyiHkuCd5VV2nywSu4+pbLVnl2d0K0IwqStPro/vvYVbDzUm4rQ8C8Na0dF1VLqKGSSbbsj2S7OT6jB3DkZBr6VsZHltIt6gOVA46E98fjmvlbT5Ei1G3klbZGsisWxnABzXba18UdTusQaaTb265BJ5Ln+g9qWc5XUxtSHslr1b/AANMNWjTpvnfyPf7iR4bSV4U3ypGSi+pA4zXznJ8Q/E3mak0ciKNQZvOJgVmKkbQm4jICg4A7ZPrW/4c+Ml9YRJbaxbC8jBw0qna+30x0J9+K5fUPGeoyTPFZTLDbRyN5TpEFdkz8u4/SubKsprYWU4Vqale1m3p+T8h4itCaTjKx//Z"
        },
        {
            "FileName": "image5.jpg",
            "base64": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD/wAARCAAgACADASIAAhEBAxEB/8QBogAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoLEAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+foBAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKCxEAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9sAhAAIBgYHBgUIBwcHCQkICgwUDQwLCwwZEhMPFB0aHx4dGhwcICQuJyAiLCMcHCg3KSwwMTQ0NB8nOT04MjwuMzQyAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/2gAMAwEAAhEDEQA/AOn+Efhbw9qPwv0i6vtA0u6uZfO8yaezjd2xM4GSRk4AA/CnfEPQvDlhplrpOm+GtIj1HVJCiyRWMStFCmDK4bYQDgqg5BBkyD8tcl4B8R65B4MtdBsNSsrQW6CTzYoBLNGskhk/iYoc5K/d46cGu2trOWS8OpancfbNRaFYDM0aphFZmCgKAOrHPvXiZjnNHDRlGLvP0OujhJtqUthngTwr4afT7jSL7w3pc17YPkzTWSO00MhZo3LMvsyYySNnYEVpeMfB3he18D+ILiDw5o8M8Wm3DxyR2MSsjCJiCCFyCDzmqN5plxdX1vqVlqs+nX8EbxJNDEj7kYjKsGGGHAIB4BwayvGOr+IpNB1DQhrFhLcXtrPJsSxKyiHkuCd5VV2nywSu4+pbLVnl2d0K0IwqStPro/vvYVbDzUm4rQ8C8Na0dF1VLqKGSSbbsj2S7OT6jB3DkZBr6VsZHltIt6gOVA46E98fjmvlbT5Ei1G3klbZGsisWxnABzXba18UdTusQaaTb265BJ5Ln+g9qWc5XUxtSHslr1b/AANMNWjTpvnfyPf7iR4bSV4U3ypGSi+pA4zXznJ8Q/E3mak0ciKNQZvOJgVmKkbQm4jICg4A7ZPrW/4c+Ml9YRJbaxbC8jBw0qna+30x0J9+K5fUPGeoyTPFZTLDbRyN5TpEFdkz8u4/SubKsprYWU4Vqale1m3p+T8h4itCaTjKx//Z"
        }
    ]
}

Você deve reparar que essas imagens foram criadas no diretório wwwroot/images do projeto principal (após rodar a API, é claro). Veja o resultado da chamada com o Status "Saved" na imagem abaixo:

Agora navegue para a API Process no Swagger e chame o método utilizando a seguinte requisição:

{
  "RequestId": 0,
  "FileNames": [
    "image100.jpg","image200.jpg","image300.jpg","image400.jpg","image500.jpg","image1.jpg","image2.jpg","image3.jpg","image4.jpg","image5.jpg",
    "image6.jpg","image7.jpg","image8.jpg","image9.jpg","image10.jpg"  
  ]
}

Veja um exemplo de retorno da chamada, conforme imagem abaixo:

E voila! Você executou a estrutura de filas implementada na solução fila-no-asp-net-core-7. Se você é um DEV mais junior, te recomendo colocar uns breakpoints na linha 47 da classe Hub (que é herdada por ProcessHub a SaveHub) e rodar a aplicação:

Se você encontrar quaisquer problemas, principalmente na execução dos testes unitários, mande um comentário para mim e vamos discutir possíveis soluções 😁.

Espero que tenham gostado do conteúdo. Até mais!