我正在使用Java,我想在我的应用程序中保持servlet不断运行,但我不知道怎么做.我的servlet有一个方法,它每天从数据库中提供用户的计数以及整个数据库中用户的总数.所以我想保持servlet不断运行.
multithreading servlets background-process java-ee scheduledexecutorservice
我使用ScheduledExecutorService定期执行方法.
p代码:
ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
ScheduledFuture<?> handle =
scheduler.scheduleWithFixedDelay(new Runnable() {
public void run() {
//Do business logic, may Exception occurs
}
}, 1, 10, TimeUnit.SECONDS);
Run Code Online (Sandbox Code Playgroud)
我的问题:
如果run()抛出异常,如何继续调度程序?我应该尝试捕获方法中的所有异常run()吗?或者任何内置的回调方法来处理异常?谢谢!
我无法找到一个明确的答案,确定在会话范围内的JSF托管bean中生成线程是否安全.线程需要调用无状态EJB实例上的方法(依赖注入到托管bean).
背景是我们有一个需要很长时间才能生成的报告.这导致HTTP请求由于我们无法更改的服务器设置而超时.因此,我们的想法是启动一个新线程,让它生成报告并暂时存储它.与此同时,JSF页面显示了一个进度条,轮询托管bean直到生成完成,然后再发出第二个请求来下载存储的报告.这似乎有效,但我想确定我所做的不是黑客.
我有一个jsf视图,它显示了一个远程检索的表中的托管bean(viewscope)的一些数据.
目前,使用primefaces poll组件通过客户端视图轮询更新数据.
这还不够,因为要向客户端发送大量流量,现在Primefaces支持服务器推送我只想重新加载数据并在数据发生变化时将其推送到客户端视图.
这应该通过从Web层到应用层的轮询来实现,调用类似的方法hasChanged(...).如果数据已更改,则Web层会将通知推送到客户端以重新加载数据.
当前的客户投票
客户端>> web-tier >> app-tier
客户端通过ajax向web层询问数据,该数据再次向app-tier请求数据和更新视图
希望网络层轮询和推送
客户端<< web-tier >> app-tier
如果数据已更改并代表重新加载并通知(推送)客户端更新视图,则web-tier轮询应用层
处理办法:
在Web层中实现托管bean轮询的最佳方法是什么?
编辑:
架构:(3层)

我有兴趣在PostgreSQL JDBC驱动程序上做一些工作来帮助实现驱动程序中Statement.setQueryTimeout(...)一个更有问题的规范一致性漏洞.为此,我需要一种可移植的方法来获取计时器或设置在所有Java EE应用服务器,servlet容器和Java SE环境中都能运行的警报/回调.
它似乎并不像它应该的那样简单,而且我已经足够坚持了,我会把自己倚靠在你的怜悯之上.我该怎么做一个在Java SE,Java EE和servlet容器中工作的简单定时器回调?
如果有必要,我可以忍受单独的-ee和-se版本,但这是非常不受欢迎的.每个容器的发布完全不切实际,但如果强烈不合适,则可以接受自动选择的每个容器适配器.
PgJDBC驱动程序必须在古老版本的JVM下运行在硬件旧的应用程序服务器中,但是如果语句超时仅在现代容器和JVM的驱动程序的JDBC4版本中可用,我并不在意.已经有一个条件编译基础设施允许发布JDBC3/JDK 1.4和JDBC4/JDK 1.5驱动程序,因此只能在1.5或甚至1.6下运行的代码不是问题.
(编辑):一个额外的复杂性是用户可以部署JDBC驱动程序:
war或ear...我们需要支持所有这些场景,最好不需要自定义应用程序配置!如果我们不能支持所有这些场景,它至少需要在没有语句超时支持的情况下工作,并且在不支持语句超时的情况下优雅地失败.
啊,写一次,跑啊......
java.util.Timer或java.util.concurrent:我看到广泛的声明,在Java EE中不鼓励使用java.util.TimerJava SE并发实用程序(JSR-166)java.util.concurrent,但很少有任何细节.JSR 236提案说:
java.util.Timer,java.lang.Thread和java.util.concurrency(sic)包中的Java SE并发实用程序(JSR-166)永远不应该在托管环境中使用,因为它创建了在受管环境之外的线程.容器.
更多的阅读表明来自非托管线程的调用不会获得容器服务,因此整个应用程序中的各种事情可能会以令人兴奋和意想不到的方式中断.假定定时器调用可能导致PgJDBC抛出异常并传播到用户应用程序代码中,这很重要.
(编辑):它自己的JDBC驱动程序不需要任何容器服务,因此我不关心它们是否在其计时器线程内工作,只要这些线程永远不会运行任何用户代码.问题是可靠地确保他们不这样做.
JSR 236已经不存在了,我没有看到任何满足便携式计时器相同要求的替代品.
我找不到任何对跨容器可移植方式的引用来获得容器池计时器.如果我可以从容器上的JNDI中获取一个计时器并回退到直接实例化,那么从JNDI获取一个计时器失败就可以了......但我甚至找不到办法做到这一点.
有EJB计时器,但它们不适合像JDBC驱动程序实现这样的低级别的东西,因为它们是:
因此,EJB计时器可以完全脱离列表.
阻止使用java.util.Timer和朋友的相同问题阻止我启动我自己的计时器线程和管理我自己的计时器.这不是首发.
Java EE规范说:
企业bean不得尝试管理线程.企业bean不得尝试启动,停止,暂停或恢复线程,或更改线程的优先级或名称.企业bean不得尝试管理线程组.
而EE教程说:
不正确地使用线程的资源适配器可能危及整个应用程序服务器环境.例如,资源适配器可能会创建太多线程,或者可能无法正确释放它创建的线程.糟糕的线程处理会阻止应用程序服务器关闭并影响应用程序服务器的性能,因为创建和销毁线程是一项昂贵的操作.
我试图FacesContext通过调用类FacesContext.getCurrentInstance()的run()方法来获取Runnable,但它返回null.
public class Task implements Runnable {
@Override
public void run() {
FacesContext context = FacesContext.getCurrentInstance(); // null!
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
这是怎么造成的,我该如何解决?
我有一个Java EE应用程序,每十五分钟从互联网上下载股票价格.从计时准确性的角度来看,最好是应用程序内化此定期操作,即Thread.sleep()与计数器结合使用或设置计时器或者通过URL公开任务并让平台cron作业定期点击URL更好(按照要求的频率).
这两种方法的优点和缺点是什么?
我看到针对OpenJDK实现报告的计时器错误让我感到震惊.该错误表明,系统时间的变化会影响与时间相关的操作和方法(如睡眠和计时器周期性)的操作.
我确信这个问题已被无数次问过,但我已经尝试了所有我读过的内容,似乎没有任何工作.我确信修复可能也很简单.
我有以下单例,应该在Web应用程序启动时执行但不执行,并且计划任务也不会运行.
@Singleton
@Startup
public class Scheduler {
private static int count = 0;
@PostConstruct
public void onStartup() {
System.out.println("Initialization success.");
}
@Schedule(second="*/10", minute="*", hour="*")
public void execute() {
System.out.println("its running count..."+count);
count++;
}
}
Run Code Online (Sandbox Code Playgroud)
我正在使用Glassfish服务器3.1.2.
任何帮助将不胜感激.
谢谢.
编辑
现在正在执行启动方法,但调度方法不会运行.
我的Java(Tomcat 8)Web服务器是否可以安全地生成线程以响应HTTP请求?我正在看帖子和论坛,有些人说这绝对没问题,其他人说不要这样做.
我的用例是这样的:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
...
...
final MyResult res = new MyResult();
Thread first = new Thread(new Runnable() {
@Override
public void run() {
// put this into res
}
});
Thread second = new Thread(new Runnable() {
@Override
public void run() {
// put that into res
}
});
first.start();
second.start();
first.join(10000);
second.join(10000);
// return res
}
Run Code Online (Sandbox Code Playgroud)
当我说安全时,我的意思是关于Web服务器的稳定性,我提出的内容是否存在任何内在的危险.正如@Burrman指出的那样,线程池在这里是个好主意,我会这样做.如果我正在使用线程池,那么我应该关注或需要解决的servlet容器是否存在任何其他潜在问题?
我想我正在考虑的是,例如,JDBC连接.我相信建议使用JNDI资源等进行设置,并使用Tomcat配置进行配置.是否有必要或建议产生任意线程,如我的例子?
我正在从Domino服务器端操作每30秒轮询一次外部Web服务.
一点点背景......
我们通过TomTom api跟踪汽车的位置.我们现在需要在我们的网络应用程序中显示这一点,覆盖到地图(谷歌,bing等),并与我们的应用程序中的其他lat长数据混在一起.可以把它想象成调度出租车,我们想把这些调用分配给出租车(......这不是出租车\调用,但它是类似的过程).我们非常积极地刷新调度控制器屏幕,因此他们可以看到所有对象的状态并分配给最近的汽车.如果我们从刷新用户屏幕触发数据,我们进入一些棘手的控制服务器端,否则我们将达到每分钟最大允许请求到TomTom api.
最初我打算安排一个代理来轮询Web服务,写入我们应用程序中的缓存对象,刷新调度控制器屏幕从我们的缓存中提取数据....很棒,除了用户要求是我们的缓存必须是每30秒更新一次.我可以创建一个每1分钟运行一次的程序文档,但仍然不够激进.
所以我们现在离开了:我们的.net人将创建一个服务,每30秒轮询一次TomTom,我们从他的服务中检索,或者我想办法在Domino中做.在Domino数据库中做的很好,而不是一些独立的Java应用程序或.net,以便在一个系统(Domino)中保留尽可能多的逻辑.
我们在系统中大量使用支持bean.我将在今天晚些时候对此进行测试,我希望,但这似乎是一条明智的路线......?: 使用计时器在JSF托管bean中为计划任务生成线程 ......或者是他们的局限性我不知道,有没有人在Domino之前解决这个问题或有任何意见?
提前致谢,
缺口
在Web App中,需要通过每页JSF显示6个对象(表DB的行)的视图.为了进入下一个视图,将显示另一个不同的随机6个对象,依此类推......
所以我在具有思维@Singleton,查询与该表中的所有行@Schedule在给定的时间间隔工作,比方说,每隔1小时.它将有一个getCollection()方法.
然后每个访问者都会有一个@SessionScoped CDI bean,它将查询@Singleton的Collection ,然后将其随机播放以对特定用户进行随机查看.
与许多访问一样,将创建许多将同时访问getCollection()方法的CDI bean.
这是正确的吗?这种情况需要任何特定的注释吗?这样做的其他任何方式?
----- UPDATE ---
与朋友沟通后,特意Luiggi门多萨,他们告诉我,在这里最好的办法是使用的Ehcache或类似的,而不是Singleon.我认为就是这样.
我正在使用JSF来创建一个Web应用程序.
我有一个应用程序作用域bean,它具有无限循环,以便它定期执行一个动作.
我的问题是这个bean(由于无限循环)阻塞整个应用程序.我以为bean会在自己的线程上运行.不是JSF的情况,默认情况下每个托管bean都在自己的线程上运行?
我应该创建一个线程,让无限循环在该线程中运行吗?
谢谢
我正在开发一个Web应用程序,我需要运行一个60秒的线程,需要检查来自Web服务的响应.如果响应在60秒内到达,我将转发成功,然后我将在60秒后转发到超时页面.我在使用JSF 2.0?我曾想过使用Timer,但不确定我是否只能在sprcefic的时间内运行定时器.
这有什么聪明的解决方案?
java-ee ×6
jsf ×5
java ×4
timer ×3
ejb ×2
scheduling ×2
servlets ×2
cdi ×1
concurrency ×1
ejb-3.1 ×1
facescontext ×1
java-ee-6 ×1
javabeans ×1
jdbc ×1
jsf-2 ×1
lotus-domino ×1
managed-bean ×1
postgresql ×1
runnable ×1
servlet-3.0 ×1
singleton ×1
startup ×1
threadpool ×1
tomcat ×1
xpages ×1