2017-09-08 21 views
2

は私がスレッドを実行しようとすると、このエラーがあります:実行プロセス(JSF 2.2 - WELD 2.3)

WELD-001303: No active contexts for scope type javax.enterprise.context.RequestScoped 

私はこの試みた: No active contexts for scope type javax.enterprise.context.RequestScoped when invoking a bean from a thread

をだから私はこのエラーがあります:

2017-09-08 14:09:56,205 ERROR [br.com.ideallsistemas.obrigacoes.util.jsf.JsfExceptionHandler] Erro: #{emailCadastroBean.enviarEmail()}: java.lang.NoClassDefFoundError: org/jboss/weld/environment/se/Weldjavax.faces.FacesException: #{emailCadastroBean.enviarEmail()}: java.lang.NoClassDefFoundError: org/jboss/weld/environment/se/Weld 

豆から呼び出された私の方法

public void enviarEmail(Email email) { 
    List<String> destinatarios = destinatariosOf(email); 
    Weld weld = new Weld(); 
    final WeldContainer container = weld.initialize(); 
    RequestContext requestContext= container.instance().select(RequestContext.class, UnboundLiteral.INSTANCE).get(); 
     requestContext.activate(); 

    final EnvioEmailService pojo = container.instance().select(EnvioEmailService.class).get(); 
    Thread envioiEmail = new Thread() { 
     public void run() { 
      try {           
       for (String destinatario : destinatarios) { 
        pojo.envioEmailTaskDo(email, destinatario); 
       } 
      }catch (Exception e) { 
       System.out.println(e.getMessage()); 
      } 
     } 
    }; 
    envioiEmail.start(); 
    weld.shutdown(); 
} 

答えて

1

JEEアプリケーションの場合、自分でスレッドを作成しないでください!

@Asynchronous注釈を使用する必要があります。

このようなEJBで

使用:

@Stateless 
public class NameOfEJB { 

    @Asynchronous 
    public void sendEmail() { 
     //send email here 
    } 
} 

注入し、他のコンポーネントで使用(JSFは...豆、CDI豆、他のEJBを管理)

@Named 
@ViewScoped 
public class CDIBean implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @EJB 
    private NameOfEJB nameOfEJB; 

    public void processForm() { 
     nameOfEJB.sendEmail(); 
    } 

} 

コンテナが行いますあなたのための非同期処理。

コードはより単純で清潔で保守性が高いことに注意してください。

関連する問題