संपादित करें: मैं अब लगता है कि समस्या 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
पाने के लिए मेरे एप्लिकेशन को तैनात करने की कोशिश की है। मैं क्या गलत कर रहा हूँ?
क्या मेरे पास हमेशा कोई धागा नहीं चल रहा है? जब ऐप हटा दिया जाता है, तो उस थ्रेड को मेरे 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)
मेरे कोड:
स्वरूपण गंदगी के लिए, लेकिन मेरी "4 स्थानों से मांगपत्र कोड" के जीवन के लिए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;
}
}
क्षमा सिर्फ काम नहीं करता है मेरे लिए संपादित करें: 'अवरुद्ध करने' के बारे में पढ़ें और इसे लागू किया गया है, लेकिन मुझे अभी भी सटीक अपवाद और स्टैक ट्रेस मिल रहा है। 'BlockingQueue'
आपको हमें अपवाद का स्टैक ट्रेस देना होगा – skaffman
कृपया अपना कोड दिखाएं। जावा एपीआई में बहुत कम कक्षाएं हैं जो आपके द्वारा प्राप्त अपवाद को फेंक देती हैं, और उनका उपयोग आपके द्वारा प्रदान किए गए विवरण से ज़िंदा नहीं होता है। – SingleShot
आपको निश्चित रूप से अवरुद्ध कतार का उपयोग करना चाहिए। Http://java.sun.com/javase/6/docs/api/java/util/concurrent/BlockingQueue.html के लिए JavaDocs उदाहरण कोड है। –