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.

Foi útil?

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.

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