当前位置: 首页 > 知识库问答 >
问题:

@计划无法从@SessionScoped CDI bean获取数据

习哲彦
2023-03-14

登录后,存储在SessionScoped bean中的用户数据。我希望每5秒钟将每个帐户存储在会话中并发送到后端。我的计时器

@Singleton
@Startup
public class FrontendTimer {

    @Inject
    private UserContext userContext;

    @Schedule(second = "*/5", minute = "*", hour = "*", persistent = false)
    @Asynchronous
    public void atSchedule() throws InterruptedException {
        System.out.println("Get Logged user stored in the session each 5 seconds ");
        System.out.println("FR " + userContext.getAccount().toString());
    }

}

启动调度程序的唯一方法是创建@Startup和@Singleton类。将用户数据保存在前端的唯一方法是将帐户保存到SessionScoped CDIBean,不推荐使用JSF原生bean。

您将得到如下错误:WELD-001303:范围类型javax没有活动上下文。企业上下文会议范围

项目地点在这里https://github.com/armdev/eap单独上课https://github.com/armdev/eap/blob/master/eap-web/src/main/java/io/project/app/beans/FrontendTimer.java

基本上,我希望有一个标准的计时器,可以从会话范围中获取数据。

共有1个答案

云啸
2023-03-14

您当前的方法不会像您预期的那样工作,因为每个调度程序调用都将在与会话完全隔离的上下文中发生(因此出现无活动上下文…错误消息)。

我建议你在这里使用简单的倒置。在应用程序范围内的单例中,添加一个简单的List

@Singleton
public class SessionManager {

    private List<String> currentSessions;

    @Schedule(second = "*/5", minute = "*", hour = "*", persistent = false)
    @Asynchronous
    public void atSchedule() throws InterruptedException {
        //Do something with currentSessions
    }

    public void add(String account){
        currentSessions.add(account);
    }

    public void remove(String account){
        currentSessions.remove(account);
    }

}
@SessionScoped
public class UserContext implements Serializable {

    @Inject
    private SessionManager sessionManager;

    /*
    ...
    */

    public void sessionCreated(){
        sessionManager.add(account.toString());
    }

    public void sessionDestroyed(){
        sessionManager.remove(account.toString());
    }

}
@WebListener
    public class SessionListener implements HttpSessionListener {

        @Override
        public void sessionCreated(HttpSessionEvent se) {
            HttpSession session = se.getSession();

            FacesContext context = FacesContext.getCurrentInstance();
            UserContext userContext = (UserContext) session.getAttribute("userContext");
            userContext.sessionCreated();
        }

        @Override
        public void sessionDestroyed(HttpSessionEvent se) {
            HttpSession session = se.getSession();

            FacesContext context = FacesContext.getCurrentInstance();
            UserContext userContext = (UserContext) session.getAttribute("userContext");
            userContext.sessionDestroyed();

        } 
    }

 类似资料:
  • 我一直在尝试使用nativescript创建一个android应用程序。我正在使用fetch模块从服务器获取响应。当我试图从httpbin获得响应时。org/get,没关系。但当我试图从本地服务器获取响应时,网络请求失败。错误 发送到httpbin。组织/获取- 发送到本地主机:8000/api- 当我尝试从纯节点中的localhost:8000/api获取响应时。js通过请求模块。它工作得很好。

  • 这是我收到的错误: 请求的资源上不存在“< code > Access-Control-Allow-Origin ”标头。因此,不允许访问源“https://s.codepen.io”。如果不透明响应满足您的需要,请将请求的模式设置为' < code>no-cors ',以便在禁用cors的情况下获取资源。 我将模式设置为但仍然没有运气。

  • 我有一个简单的web应用程序,我从应用程序的前端获取json。我有一个对象,它包含很少的属性和一个对象数组。 它看起来像这样: 我通过使用。我用向我的PHP-Laravel后端发送了一个请求,我想对它进行解析。 这就是我所拥有的: 我尝试像这样获取json数据: 但它就是不起作用。我总是遇到一个错误,我试图访问对象上的,但它不存在。我也试过这样做: 但是我也有同样的问题。我做错了什么,我看到了关于

  • 问题内容: 我最近将应用程序中的hiberbnate模式更新为5.4.4.Final。现在,在部署过程中我面临以下异常。 我使用以下persistence.xml。 经过进一步调查,我发现根本原因是:hibernate使用 SequenceInformation 接口进行序列元数据操作 但是,我的应用程序使用如下序列: 该 Long.MAX_VALUE 等于9223372036854775807,

  • 问题内容: 每个人,我都试图制作一个音乐应用程序,为此,我在自己的作品中创建了一个Horizo​​ntal ,而我的Horizo​​ntal 正在获取带有艺术家姓名的图像。 但是单击后,我加载了另一个活动。在我的其他活动,我试图在从火力加载SongsData 用。 但是问题是我没有从Firebase获取数据,而是返回了空数据。我在下面提供了我的代码,这是我的Firebase数据库的屏幕截图:-Sc

  • 我正在React中的useEffect()内尝试从axios获取数据。我测试了后端,它工作正常,但在前端,我得到了一个错误401(未经授权) 反应代码: 后端代码: 服务器.js 项目路线.js 我得到的错误是: 如果有人能帮我找出错误,我会很高兴的