Jsf 我可以在无限线程中使用EJB吗

Jsf 我可以在无限线程中使用EJB吗,jsf,jakarta-ee,ejb,Jsf,Jakarta Ee,Ejb,我想知道是否禁止在无限线程中使用EJB(因为它不能返回给容器) 大概是这样的: @ManagedBean(eager = true) @ApplicationScoped public class TestListenner { private ResultThread result; @PostConstruct public void init() { result = new ResultThread (); Thread myT

我想知道是否禁止在无限线程中使用EJB(因为它不能返回给容器)

大概是这样的:

@ManagedBean(eager = true)
@ApplicationScoped
public class TestListenner {

    private ResultThread result;

    @PostConstruct
    public void init() {
        result = new ResultThread ();
        Thread myThread = new Thread(result);
        myThread.start();
    }
    public ResultThread getResult() {
        return result;
    }
}
而线程:

public class ResultThread implements Runnable{
    @EJB
    private SomeService service;
    private boolean continueWork = true;

    public void run(){
        while(continueWork){
            service.doSomething();
            //some proccessing
        }
    }
自从我开始使用数据库以来,我一直在使用EJB。我去了很多工厂,但是我忘记了(那是一年前)。当用户请求我的web应用程序上的网页时,我使用它们在我的数据库上执行操作。但是现在我需要一个线程来不断计算数据库中的内容,以减少响应时间。如果我不能使用EJB的原因是容器需要有一个句柄,那么我应该使用什么呢

希望我可以使用一个与我以前使用的类似的类:

@Stateless
public class SomeServiceImpl implements SomeService {
    @PersistenceContext(unitName = "my-pu")
    private EntityManager em;

    @Override
    public void updateCategory(SomeClass theclass) {
        em.merge(theclass);
    }
}

编辑:在本主题中,这似乎意味着在ManagedBean中生成线程在无法生成其他线程的情况下并不危险。因为我的bean是ApplicationScoped,web应用程序使用它的1个实例(而且只有1个实例)对数据库进行后台工作(实际上我喜欢一个前100个“posts”表,需要随着时间的推移不断重新计算,这样我就可以查询该表(使用另一个bean)以获得快速答案).

至少有一个原因使您现在拥有的无法使用:

。为了使
@EJB
注释起作用,
ResultThread
应该是一个托管bean,并由容器注入。这意味着,您至少必须使用CDI来注入它,而不是使用现在的
新ResultThread
。工作原理如下:

@Inject
private ResultThread result;
这样,容器就参与了操作

然而,底线是,有更好的方法来做你似乎想做的事情

您可能还想知道,EJB不允许生成自己的线程;事实上,人们不赞成在容器中手工穿线。为什么?容器是一个托管环境,在这个环境中,内存和并发性已经得到了很好的考虑和设计。你的handspun线程破坏了这个模型,也破坏了容器在你的bean和其他应用程序组件上可能给你的任何保证

相关:


至少有一个原因使您现在拥有的无法使用:

。为了使
@EJB
注释起作用,
ResultThread
应该是一个托管bean,并由容器注入。这意味着,您至少必须使用CDI来注入它,而不是使用现在的
新ResultThread
。工作原理如下:

@Inject
private ResultThread result;
这样,容器就参与了操作

然而,底线是,有更好的方法来做你似乎想做的事情

您可能还想知道,EJB不允许生成自己的线程;事实上,人们不赞成在容器中手工穿线。为什么?容器是一个托管环境,在这个环境中,内存和并发性已经得到了很好的考虑和设计。你的handspun线程破坏了这个模型,也破坏了容器在你的bean和其他应用程序组件上可能给你的任何保证

相关:


您不能在Java EE容器上使用自己的线程

JavaEE规范为这类工作提供了TimerService


您不能在JavaEE容器上使用自己的线程

JavaEE规范为这类工作提供了TimerService


您计划使用哪台服务器?(这对解决方案有很大影响)@SteveC glassfish 4.1是服务器吗?您计划使用什么服务器?(这对解决方案有很大的影响)@SteveC glassfish 4.1是服务器>不允许EJB生成自己的线程——这是一个历史记录;实际上,这不仅仅是ejb,而是整个javaee服务器。然而,当时的想法是EJB已经或将成为一切JavaEE的基础,包括servlet。这从来没有发生过,所以现在(太多)人认为EJB不允许使用线程,但所有其他组件类型都可以,正如我们所说的“从来没有意图”。@kolossus感谢您的回答,我在无状态EJB中使用异步anotation使其工作,并在我的应用程序范围bean中调用它。我已经对我在底部的帖子进行了编辑,显示了balusC的回答,这让我有点困惑,我怀疑我是否是唯一一个(因为有人说不应该这样做,但他说可以),所以yeh mayby解释了这一点。不过我有一个问题:只要我的web应用程序还在运行,我就会依赖这个包含while(真的)循环(某种程度上)的“线程”。不会有任何打嗝,对吧,它肯定不会因为任何原因停止?谢谢@ArjanTijms;我应该更清楚一点:我不相信在容器中的任何地方产生一个线程是合乎犹太教义的(主要是因为我很懒哈),但是,是的,这可以用不同的措辞:它不会“停止”,但你在你的虚拟机上开了一个洞,没有什么好处。巴卢斯克的回答中没有任何一条支持手推的线索,事实上,他非常清楚地表明,你不能这样做。这里的主题是,您几乎不可能自己正确地管理线程,而不会对应用程序的其余部分产生副作用。>EJB不允许生成自己的线程——这是一个历史记录;实际上,这不仅仅是ejb,而是整个javaee服务器。然而,当时的想法是EJB已经或将成为一切JavaEE的基础,包括servlet。这从来没有发生过,所以现在(太多)人认为EJB不允许使用线程,但所有其他组件类型都可以,正如我们所说的“从来没有意图”。@kolossus感谢您的回答,我使用异步方式使其工作