Procurando por uma estrutura / biblioteca genérica de execução de emprego java assíncrona

StackOverflow https://stackoverflow.com/questions/612656

  •  03-07-2019
  •  | 
  •  

Pergunta

Estou procurando uma estrutura genérica de execução de emprego java assíncrona que possa lidar Callables ou Runnables. Seria semelhante a java.util.concurrent.ExecutorService, (e possivelmente embrulhe ExecutorService), mas também teria os seguintes recursos:

  1. A capacidade de persistir empregos em um banco de dados, caso o aplicativo diminua enquanto um trabalho estiver sendo atendido e poder reiniciar os empregos inacabados. (Eu entendo que meu trabalho pode ter que implementar Serializable o que está ok.)

  2. Trabalhe com os UUIDs para permitir que o cliente obtenha tokens de emprego e pergunte sobre o status do trabalho. (Sob o capô, essas informações também seriam persistidas em um banco de dados.)

Eu comecei a trabalhar nisso, construindo ao redor ExecutorService, mas eu preferiria uma solução de código aberto fora da caixa, se houver.

Algo que poderia funcionar dentro da estrutura da primavera seria o ideal.

Foi útil?

Solução

Você pode usar Quartzo, e criar um concreto Job adaptador que delega a um Runnable ou Callable. Quartzo' Job A interface adiciona a capacidade de manter algum estado entre as invocações de uma tarefa. Se desejado, o Quartz pode armazenar empregos e seu estado duramente em um banco de dados relacional e executá -los em um cluster escalável de hosts.

Outras dicas

Você pode querer olhar para Quartzo.

O Quartz é um sistema de agendamento de trabalho de código aberto completo e completo que pode ser integrado ou usado ao lado praticamente qualquer aplicativo J2EE ou J2SE-do menor aplicativo independente até o maior sistema de comércio eletrônico. O quartzo pode ser usado para criar horários simples ou complexos para executar dezenas, centenas ou até dezenas de milhares de empregos; Trabalhos cujas tarefas são definidas como componentes Java padrão ou EJBs. O programador de quartzo inclui muitos recursos de classe corporativa, como transações JTA e clustering.

Dar uma olhada em http://www.opensymphony.com/quartz/wikidocs/Features.html E veja se já tem algo para você.

Daquela página:

Com o uso do JDBCJOBStore incluído, todos os empregos e gatilhos configurados como "não voláteis" são armazenados em um banco de dados relacional via JDBC

Outra direção pode ser algo como usar Terracota, que tem a capacidade de agrupar a pilha na sua JVM e persistir para disponibilidade. Terracota apoia a integração com Quartzo Se isso for útil do ponto de vista de programação. Além disso, há um mestrado e mensagens Módulo de integração Isso pode ser útil também. Terracota é de código aberto.

Para acompanhar o ponto de Alex, uma solução de terracota não persistiria seus empregos no banco de dados, eles seriam persistentes na loja de memória distribuída da Terracotta.

Como a Terracotta persiste no armazenamento de memória no disco, esta é uma versão mais eficiente para colocar esses trabalhos no banco de dados.

Ao mesmo tempo, fornece um modelo de programação de pojo puro, para que você nem precise lidar com DB TXNS, ORM e similares - a menos que sua carga de trabalho específica fale com o banco Ajudar ou machucá -lo aqui, apenas ajuda a distribuir o trabalho).

O padrão do prêmio de trabalho ajudará você a distribuir a malha na grade e você pode facilmente começar a usar um distribuidorExecutorService, enviando trabalho se parece com o seguinte:

CompletionService executor = new DistributedCompletionService(new DistributedExecutorService("myTopologyName"));
executor.submit(new MyRunnable(), null);
...
Future f = executor.take();

Aqui está o link para Guia do QuickStart na implementação do mestre-trabalhador na forja de terracota.

Além disso - o terracota não exige que você implemente serializável - embora você possa se quiser :)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top