当前位置: 首页 > 面试题库 >

ejb 3.1中的计时器服务-计划呼叫超时问题

乐正涵忍
2023-03-14
问题内容

我用@ Singleton,@ Schedule和@Timeout注释创建了一个简单的示例,以尝试它们是否可以解决我的问题。

场景是这样的:EJB每5秒调用一次“检查”功能,并且如果满足某些条件,EJB将创建单个动作计时器,该计时器将以异步方式调用一些长时间运行的进程。(这是某种队列实现类型的东西)。然后它继续检查,但是尽管运行了很长时间,但不会启动另一个过程。

下面是我想出的代码,但是该解决方案不起作用,因为看起来我正在进行的异步调用实际上阻止了@Schedule方法。

@Singleton
@Startup
public class GenerationQueue {

    private Logger logger = Logger.getLogger(GenerationQueue.class.getName());

    private List<String> queue = new ArrayList<String>();

    private boolean available = true;

    @Resource
    TimerService timerService;

    @Schedule(persistent=true, minute="*", second="*/5", hour="*")
    public void checkQueueState() {

        logger.log(Level.INFO,"Queue state check: "+available+" size: "+queue.size()+", "+new Date());

        if (available) {

            timerService.createSingleActionTimer(new Date(), new TimerConfig(null, false));
        }

    }

    @Timeout
    private void generateReport(Timer timer) {

        logger.info("!!--timeout invoked here "+new Date());

        available = false;

        try {

            Thread.sleep(1000*60*2); // something that lasts for a bit

        } catch (Exception e) {}

        available = true;

        logger.info("New report generation complete");

    }

我在这里缺少什么,还是应该尝试其他方法?任何想法最欢迎:)

使用Glassfish 3.0.1最新版本进行测试-忘了提及


问题答案:

单例的默认@ConcurrencyManagement为ConcurrencyManagementType.CONTAINER,默认@Lock为LockType.WRITE。基本上,这意味着每个方法(包括generateReports)都被有效地标记为synced关键字,这意味着在generateReport运行时,checkQueueState将被阻止。

考虑使用ConcurrencyManagement(ConcurrencyManagementType.BEAN)或@Lock(LockType.READ)。如果上述建议均无济于事,我怀疑您已找到Glassfish的错误。

顺便说一句,您可能需要persistent =
false,因为即使您的服务器处于脱机状态,您也不必保证checkQueueState方法每5秒触发一次。换句话说,当您使服务器重新联机时,您可能不需要容器触发“追赶”。



 类似资料:
  • 我已经在 Windows 服务器 2008年的任务计划程序中计划了我的批处理文件。任务在执行之间自动终止。我检查了任务的历史记录并找到消息: 任务计划程序终止了任务的“{69903b02-c15a-4c67-97b8-3e7d15a125f6}”实例。 使用事件 ID 111。 上次运行结果显示以下消息: 呼叫被消息过滤器取消 (0x80010002) 请建议其原因以及如何在将来避免这种情况?

  • 我对方法的期望(根据我在中给出的理解,其中每次执行都是在前一个任务执行完成后安排的)应该在第1行之后创建两个线程。 一个用于计时器,它为任务生成另一个线程。一旦第一个任务线程死亡,将创建另一个任务线程并继续执行。但在调试点,我只看到一个线程对应于计时器。为什么不为实现可运行的任务执行线程? 我对scheduleAtFixedRate()方法的期望(根据我在javadocs中给出的理解,其中每个执行

  • 使用Twilio Studio和我们的流设置为“连接呼叫到”小部件一个通用电话,除非输入了分机,然后“连接呼叫到”小部件一个人的桌面电话,这是使用“基于拆分”小部件。当用户不拿起他们的电话和超时发生时,问题就会发生。流如何将用户发送回Twilio“记录语音邮件”小部件?

  • 关于Java定时器类或ScheduledExecutorService接口,我可以在执行器线程(其他调度器)的运行方法(或TimerTask)内设置调度器(或定时器)吗? 案例研究:我有一个数据库,其中包含歌曲列表(10000首)和播放歌曲的时间表。 所以我想创建一个调度程序(比如1)(周期为1小时),它将搜索数据库,并为计划在一小时内播放的所有歌曲创建调度程序。 一小时后,scheduler1将

  • 我已经安装了selenium IDE和selenium server(selenium RC)。。。当使用phpunit在命令提示符下运行测试用例时,会出现如下错误 访问位于“”的Selenium服务器时,响应无效http://localhost:4444/selenium-服务器/驱动程序/':30000ms后超时 我在selenium IDE选项超时属性中进行了更改,并且在启动服务器时 jav

  • 我正在编写一个Android应用程序,每10分钟录制一次音频。我用定时器来做这件事。但是scheduleAtFixedRate和scheduleAtFixedRate之间有什么区别呢?使用其中一种方法是否有性能优势?