Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Dúvida] É possível personalizar o método this.subscription.request para que possamos definir uma quantidade fixa de threads que serão criadas?

Boa tarde!!

Para definir quantas threads e quantas mensagens cada thread irá processar, nós podemos fazer dessa forma:

// Definir um numero exato de quantas threads eu gostaria de criar  
ExecutorService newFixedThreadPool = Executors.newFixedThreadPool(2);

/*
 * Segundo parametro: numero de quantas mensagens eu vou processar por vez
 */
SubmissionPublisher<NotaFiscal> publisher = new SubmissionPublisher<>(newFixedThreadPool, 3);

Mas conforme mostrado na aula, nós podemos criar o nosso próprio subscribe personalizado implementando a interface Subscriber, e com isso podemos utilizar o método request para especificar quantas mensagens minha thread vai processar, no meu caso abaixo adicionei três mensagens

public class NotaFiscalSubscribe implements Subscriber<NotaFiscal> {

  private Subscription subscription;

  @Override
  public void onSubscribe(Subscription subscription) {
    System.out.println("Chamando o onSubscribe!!");
    this.subscription = subscription;
    this.subscription.request(3);
  }

}

Minha dúvida seria a seguinte: Existe uma outra maneira de fazer a implementação acima passando também o número de threads que eu gostaria que fosse criado?

Tentei fazer da forma abaixo, porém parece que não surgiu nenhum efeito, sou obrigado a utilizar o método request para que as mensagens sejam processadas, logo se eu não utilizar esse método nenhuma mensagem será processada.

Classe onde implementa a interface Subscriber

public class NotaFiscalSubscribe implements Subscriber<NotaFiscal> {

  private Subscription subscription;

  @Override
  public void onSubscribe(Subscription subscription) {
    System.out.println("Chamando o onSubscribe!!");
    this.subscription = subscription;
  }

}

Classe principal

public class TesteEnvioNaoBloqueante {

    public static void main(String[] args) {

        // Definir um numero de quantas threads eu gostaria de criar  
        ExecutorService newFixedThreadPool = Executors.newFixedThreadPool(2);

        NotaFiscal primeiraNotaFiscal = new NotaFiscal(">> Joao", 39.99, LocalDate.now());

        /*
         * Segundo parametro: número de quantas mensagens cada thread vai poder processar
         */
        SubmissionPublisher<NotaFiscal> publisher = new SubmissionPublisher<>(newFixedThreadPool, 3);


        NotaFiscalSubscribe subscribe = new NotaFiscalSubscribe();
        publisher.subscribe(subscribe);

        publisher.submit(primeiraNotaFiscal);

        System.out.println("Voca ira receber a nota fiscal no seu e-mail");
        Scanner scan = new Scanner(System.in);
        scan.nextLine();
        scan.close();
        publisher.close();
    }
}

Adicionei também o código no github para facilitar a compreensão da dúvida: link para o github

1 resposta
solução!

Olá Jonas, tudo bem?

Pelo que entendi da sua pergunta, você gostaria de saber se é possível personalizar o método this.subscription.request para definir uma quantidade fixa de threads que serão criadas, limitar o número de threads utilizadas pelo SubmissionPublisher e, ao mesmo tempo, personalizar a quantidade de mensagens que serão processadas pelo seu Subscriber personalizado, correto? Infelizmente, não é possível fazer isso diretamente através desse método.

O que você pode fazer é utilizar a classe Executors para criar um pool de threads com a quantidade desejada e passar esse pool como parâmetro na criação do SubmissionPublisher. Dessa forma, você terá o controle da quantidade de threads que serão criadas.

Por exemplo, você pode criar um pool de threads com 2 threads da seguinte forma:

ExecutorService newFixedThreadPool = Executors.newFixedThreadPool(2);

E então, passar esse pool como parâmetro na criação do SubmissionPublisher:

SubmissionPublisher<NotaFiscal> publisher = new SubmissionPublisher<>(newFixedThreadPool, 3);

Assim, você terá um pool de threads com 2 threads e cada thread poderá processar até 3 mensagens por vez.

Espero ter ajudado e bons estudos!