Como colocar na instância específica do escopo / contexto personalizado (JobScoped - escopo CDI personalizado) da solicitação para torná-la injetável?
Em poucas palavras, gostaria de colocar no escopo personalizado uma instância específica da classe Configuration a partir da solicitação de descanso. O principal problema é que o escopo personalizado (JobScoped from JBerethttps://jberet.gitbooks.io/jberet-user-guide/content/custom_cdi_scopes/index.html) é elegível após o início do trabalho. Eu sei que existe a possibilidade de adicionar propriedades ao iniciar o trabalho, mas minha classe Configuration agrega muitas configurações e é bastante complicado, portanto, seria muito desconfortável converter esses arquivos na classe Properties.
Detalhes abaixo:
Este é o pseudocódigo da solicitação de descanso:
@Path("/job")
public class RunJob {
@POST
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Path("/start")
public String startJob(@FormDataParam("file") InputStream uploadedInputStream) {
JobOperatorImpl jobOperator = (JobOperatorImpl) BatchRuntime.getJobOperator();
Configuration config = new Configuration(uploadedInputStream);
Properties properties = new Properties();
jobOperator.start(job, properties);
}
O que eu queria alcançar é injetar alguns arquivos de configuração no contexto do Job, como abaixo:
public class MyReader implements ItemReader {
@Inject
private Configuration configFile;
}
A classe de configuração apresenta como abaixo:
@JobScoped
public class Configuration {
// some flags, methods etc
}
Eu li sobre Instance, Provider, mas não sei como usá-los no meu caso. Na verdade, acho que é impossível usá-los porque os trabalhos são identificados pelo nome, que é dinâmico e conhecido em tempo de execução.
Enquanto isso, encontrei uma situação semelhante à minha:Posso criar um objeto com escopo de solicitação e acessá-lo de qualquer lugar e evitar transmiti-lo como um parâmetro no JAX-RS?
Mas ocorre um problema com o contexto ausente. Quando o trabalho é iniciado, há um contexto JobScoped. De acordo com a solução acima, eu havia anotado a Configuração como RequestScoped e recebi:
org.jboss.weld.context.ContextNotActiveException: WELD-001303: Nenhum contexto ativo para o tipo de escopo javax.enterprise.context.RequestScoped em org.jboss.weld.manager.BeanManagerImpl.getContext (BeanManagerImpl.java:689) em org.jboss .weld.bean.ContextualInstanceStrategy $ DefaultContextualInstanceStrategy.getIfExists (ContextualInstanceStrategy.java:90) em org.jboss.weld.bean.ContextualInstanceStrategy $ CachingContextualInstanceStrategy.getIfava.conf .: (ContextualInstance.java:63) em org.jboss.weld.bean.proxy.ContextBeanInstance.getInstance (ContextBeanInstance.java:83) em org.jboss.weld.bean.proxy.ProxyMethodHandler.getInstance (ProxyMethodHandler.java:5): $ Proxy $ _ $ _ WeldClientProxy.toString (origem desconhecida)