【问题标题】:Run process on a thread (JSF 2.2 - WELD 2.3)在线程上运行进程 (JSF 2.2 - WELD 2.3)
【发布时间】:2017-09-08 17:41:17
【问题描述】:

当我尝试运行线程时出现此错误:

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

我从 bean 调用的方法

    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();
}

【问题讨论】:

    标签: multithreading jsf jsf-2 jsf-2.2 weld


    【解决方案1】:

    对于 JEE 应用程序,不要自己创建线程!

    你必须使用@Asynchronous注解。

    像这样在 EJB 中使用:

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

    在其他组件(JSF托管bean、CDI bean、其他EJB...)中注入并使用它

    @Named
    @ViewScoped
    public class CDIBean implements Serializable {
    
        private static final long serialVersionUID = 1L;
    
        @EJB
        private NameOfEJB nameOfEJB;
    
        public void processForm() {
            nameOfEJB.sendEmail();
        }
    
    }
    

    容器将为您执行异步过程。

    请注意,代码更加简单、干净和可维护。

    【讨论】:

      猜你喜欢
      • 2014-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-05
      • 1970-01-01
      • 2015-05-02
      • 2015-02-06
      相关资源
      最近更新 更多