编辑:我现在确定问题与while (true)
保存所有其他命令的循环有关,
因为我已将其注释掉,并且在部署应用程序时没有附加的异常。我不确定它有多重要,但是我的ServletContextListener
实现看起来像这样:
public class BidPushService implements ServletContextListener{
public void contextInitialized(ServletContextEvent sce) {
//Some init code not relevant, omitted for clarity
BidPushThread t= new BidPushThread();
t.setServletContext(sce.getServletContext());
t.run();
}
因此,现在该线程在部署应用程序时运行,但是由于while
注释了循环,因此它没有实际意义。
当我的应用程序加载时,我需要在后台运行一个线程,并不断(无超时)检查某个对象队列。当然,一旦有了对象,它就会“照顾它们”,然后继续检查队列。
目前,我正在实现ServletContextListener
界面,并且在应用加载时会被调用。在其中,我做了一些维护工作,并启动了一个我继承自的线程java.lang.Thread
。
这是我的问题开始的地方(或者我认为是这样)。用我的run()
方法,我有一个
while (true) {
//some code which doesn't put the thread to sleep ever
}
当我尝试将我的应用程序部署到服务器时,出现错误消息java.util.concurrent.TimeOutException
。我究竟做错了什么?
我不能一直运行一个线程吗?删除应用程序后,该线程将被my中的相应事件停止ServletContextListener
。
我确实确实需要一些可以不延迟地检查队列的东西。
非常感谢您的帮助!
编辑:这是堆栈跟踪
GlassFish: deploy is failing=
java.util.concurrent.TimeoutException
at java.util.concurrent.FutureTask$Sync.innerGet(Unknown Source)
at java.util.concurrent.FutureTask.get(Unknown Source)
at com.sun.enterprise.jst.server.sunappsrv.SunAppServerBehaviour.publishDeployedDirectory(SunAppServerBehaviour.java:710)
at com.sun.enterprise.jst.server.sunappsrv.SunAppServerBehaviour.publishModuleForGlassFishV3(SunAppServerBehaviour.java:569)
at com.sun.enterprise.jst.server.sunappsrv.SunAppServerBehaviour.publishModule(SunAppServerBehaviour.java:266)
at org.eclipse.wst.server.core.model.ServerBehaviourDelegate.publishModule(ServerBehaviourDelegate.java:948)
at org.eclipse.wst.server.core.model.ServerBehaviourDelegate.publishModules(ServerBehaviourDelegate.java:1038)
at org.eclipse.wst.server.core.model.ServerBehaviourDelegate.publish(ServerBehaviourDelegate.java:872)
at org.eclipse.wst.server.core.model.ServerBehaviourDelegate.publish(ServerBehaviourDelegate.java:708)
at org.eclipse.wst.server.core.internal.Server.publishImpl(Server.java:2690)
at org.eclipse.wst.server.core.internal.Server$PublishJob.run(Server.java:272)
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55)
我的代码:
public class BidPushThread extends Thread {
private ServletContext sc=null;
@Override
public void run() {
if (sc!=null){
final Map<String, List<AsyncContext>> aucWatchers = (Map<String, List<AsyncContext>>) sc.getAttribute("aucWatchers");
BlockingQueue<Bid> aucBids = (BlockingQueue<Bid>) sc.getAttribute("aucBids");
Executor bidExecutor = Executors.newCachedThreadPool();
final Executor watcherExecutor = Executors.newCachedThreadPool();
while(true)
{
try // There are unpublished new bid events.
{
final Bid bid = aucBids.take();
bidExecutor.execute(new Runnable(){
public void run() {
List<AsyncContext> watchers = aucWatchers.get(bid.getAuctionId());
for(final AsyncContext aCtx : watchers)
{
watcherExecutor.execute(new Runnable(){
public void run() {
// publish a new bid event to a watcher
try {
aCtx.getResponse().getWriter().print("A new bid on the item was placed. The current price "+bid.getBid()+" , next bid price is "+(bid.getBid()+1));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
};
});
}
}
});
} catch(InterruptedException e){}
}
}
}
public void setServletContext(ServletContext sc){
this.sc=sc;
}
}
抱歉,格式化混乱,但我的“缩进代码4个空格”对我来说不起作用编辑:阅读’BlockingQueue’并实现了它,但是我仍然得到完全相同的异常和堆栈跟踪。更改了上面的代码以反映“
BlockingQueue”的使用
您的代码不会启动新线程,而是在同一线程中运行循环,这就是为什么在部署时遇到超时错误的原因。
要启动线程,您必须调用start方法,而不是run方法。
public void contextInitialized(ServletContextEvent sce) {
//Some init code not relevant, omitted for clarity
BidPushThread t= new BidPushThread();
t.setServletContext(sce.getServletContext());
t.start();// run();
}
我想让我的Flutter应用程序总是在后台运行。在android中,我们必须创建一个始终在后台运行的服务。我在Flutter文档中找不到关于服务的东西。 有可能用Flutter做这种事情吗?
Updtaed MainActivity.cs 提前谢了。
我有一台服务器(Ubuntu 14.04.4 LTS),并希望某个Java应用程序一直在其上运行。目前我使用
我有一个正在运行的Spark应用程序,它占据了所有核心,而我的其他应用程序将不会被分配任何资源。 我做了一些快速的研究,人们建议使用YARN kill或 /bin/spark-class来杀死命令。然而,我使用的是CDH版本, /bin/spark-class根本不存在,YARN kill应用程序也不起作用。 有人能和我一起吗?
我试着运行一个程序,使用线程显示带有数字的乘法、除法、加法和减法表。 但是我希望数字被乘以或相加等。由用户选择。 也就是说,程序应该在用户为每个操作选择一个数字后运行,然后显示结果。
问题内容: 尽管这是一个范围更广的问题,但我想为我的公司编写一个在线测试代码,在该代码中,人们可以被问到如何用java / php / c等编写代码,并且该代码可以在线运行和编译。我已经在Codeacademy,Udacity等网站上看到了这种情况。只是想了解其背后的架构。我在Google上进行了很多类似的搜索,但找不到具体答案。尽管在这里和那里读完了零散的片段后,我知道代码已发送到服务器上的编译