JSR-352 em lote autônomo do Google Guice
-
21-12-2019 - |
Pergunta
Estou tentando fazer um lote usando javax.batch 1.0 com Java SE 7 e Guice.
Lendo a documentação do JavaEE 7 sobre JSR-352, eles obviamente configuraram o código para ser executado dentro do Glassfish e não encontrei nenhuma menção sobre como executá-lo externamente.
Agora meu problema é sobre a interface JobContext que deve ser injetada automaticamente através do CDI:como fazer com Guice?Tentando algo como:
@Provides
@Inject
JobContext providesJobContext(Provider<JobContext> provider) {
return provider.get()
}
é conceitualmente errado e leva a StackOverflowError (então aqui estou:>).É realmente necessário?Os exemplos injetam-no para alcançar as propriedades do trabalho.Eu poderia alcançá-los, talvez, através
jobOperator.getParameters(<executionID>)
?
Obrigado.
Eu nunca usei o Weld (que, pelo que entendi, forneceria CDI no Java SE), então a única alternativa seria o Spring Batch.
Solução
Explicação da API
Primeiro, para esclarecer entre "propriedades do trabalho" e "parâmetros do trabalho".
Os "parâmetros de trabalho" são os Propriedades passou para o JobOperator#start(String,Properties)
e a JobOperator#restart(long,Properties)
.
As "propriedades do trabalho" acessíveis via JobContext#getProperties()
são os filhos do /trabalho/propriedades elemento.
Por exemplo.este trabalho possui duas propriedades no objeto retornado por: JobContext#getProperties()
<job>
<properties>
<property name="initialAmount" value="100" />
<property name="bonusAmount" value="#{jobParameters['bonusAmount']}?:100;" />
</properties>
</job>
Portanto, um parâmetro de trabalho é apenas uma fonte possível de valores para uma definição de propriedade de trabalho.
No que diz respeito ao acesso aos parâmetros, JobOperator.getParameters(long executionId)
, isso provavelmente não ajuda muito, já que a maneira mais natural de obter o ID de execução atual é exatamente no mesmo contexto que você está tendo problemas para injetar.
SE com Guice
Parece que você está se referindo à implementação de referência JSR 352 (jbatch, incluído no Glassfish).
É verdade que não pensamos muito no SE com a injeção de dependência do Guice, e não sou especialista o suficiente para saber se isso ajuda a mencionar.
Com o Weld, no Glassfish nós realmente usamos uma técnica como essa para permitir que o tempo de execução do lote preencha os pontos de injeção definidos pelo lote.
public class BatchProducerBean {
...
@Produces
@Dependent
public JobContext getJobContext() {
...
return JobContextImpl;
}
}
Ficarei feliz em saber mais sobre a integração do Guice com o jbatch.Você pode acompanhar em casa a fonte do projeto (ainda não há Wiki real) no GitHub
Outras dicas
Weld é a implementação de referência do JSR-299 que traz CDI no JavaEE 6.Esta implementação de referência está incluída no Glassfish para que você possa usá-la com eficácia.
Exemplo da Oracle encontrado aqui:
@Named
public class SimpleItemReader
extends AbstractItemReader {
@Inject
private JobContext jobContext;
...
}
Citar:
Eu nunca usei Weld
Aqui a implementação não importa porque apenas implementa a especificação do JSR.