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!