2012-05-29 3 views
1

У меня есть часть кода, которая должна запускаться внутри приложения Swing, а также в веб-приложении. Но в каждой среде он должен делать несколько разные вещи. Поэтому мы проверяем SwingUtilities.isEventDispatchThread()Почему webapp зависает на SwingUtilities.isEventDispatchThread()

После некоторого времени работы это внезапно перестало работать. Он просто зависает от этого звонка и никогда не возвращается. Любая идея, почему это может быть?

Мы находимся на java 6, tomcat 7 на коробке linux.

UPDATE:

Мы удалили вызов isEventDispatchThread(), поэтому моя ближайшая задача решена, но я по-прежнему заинтересован в ответ, почему это происходит.

Мы отлаживали немного больше, получали дамп потоков и нашли материал ниже для одного потока. Показывает, что на нем ожидают многие потоки. Так что это объясняет повешение.

java.awt.Toolkit.getDefaultToolkit, кажется, вызывает блокировку, так как она синхронизирована. Поэтому Юра намекнул в правильном направлении.

Так что остается вопрос: почему он не завершает или не ставит вопрос о том, почему sun.awt.X11GraphicsEnvironment.initDisplay(X11GraphicsEnvironment.java:-1) повесить?

Существует X11 работает на машине ....

"[email protected]" daemon prio=5 tid=0x1ae nid=NA runnable 
    java.lang.Thread.State: RUNNABLE 
    blocks [email protected] 
    blocks [email protected] 
    blocks [email protected] 
    blocks [email protected] 
    blocks [email protected] 
    blocks [email protected] 
    blocks [email protected] 
    blocks [email protected] 
    blocks [email protected] 
    blocks [email protected] 
    at sun.awt.X11GraphicsEnvironment.initDisplay(X11GraphicsEnvironment.java:-1) 
    at sun.awt.X11GraphicsEnvironment.access$100(X11GraphicsEnvironment.java:52) 
    at sun.awt.X11GraphicsEnvironment$1.run(X11GraphicsEnvironment.java:155) 
    at java.security.AccessController.doPrivileged(AccessController.java:-1) 
    at sun.awt.X11GraphicsEnvironment.<clinit>(X11GraphicsEnvironment.java:131) 
    at java.lang.Class.forName0(Class.java:-1) 
    at java.lang.Class.forName(Class.java:169) 
    at java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment(GraphicsEnvironment.java:68) 
    - locked <0x2507> (a java.lang.Class) 
    at sun.awt.X11.XToolkit.<clinit>(XToolkit.java:89) 
    at java.lang.Class.forName0(Class.java:-1) 
    at java.lang.Class.forName(Class.java:169) 
    at java.awt.Toolkit$2.run(Toolkit.java:834) 
    at java.security.AccessController.doPrivileged(AccessController.java:-1) 
    at java.awt.Toolkit.getDefaultToolkit(Toolkit.java:826) 
    - locked <0xf9d> (a java.lang.Class) 
    at java.awt.Toolkit.getEventQueue(Toolkit.java:1689) 
    at java.awt.EventQueue.isDispatchThread(EventQueue.java:857) 
    at javax.swing.SwingUtilities.isEventDispatchThread(SwingUtilities.java:1339) 
    at xxxxxxxxxA.setCurrentUser(xxxxxxxxxA.java:196) 
    at xxxxxxxxxB.setCurrentUser(xxxxxxxxxB.java:41) 
    at xxxxxxxxxC.UserThreadLocalHandler.afterCompletion(xxxxxxxxxC.java:96) 
    at org.springframework.web.servlet.DispatcherServlet.triggerAfterCompletion(DispatcherServlet.java:1108) 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:830) 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719) 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:669) 
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:574) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:621) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.springframework.web.filter.ShallowEtagHeaderFilter.doFilterInternal(ShallowEtagHeaderFilter.java:58) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at com.opensymphony.sitemesh.webapp.SiteMeshFilter.obtainContent(SiteMeshFilter.java:129) 
    at com.opensymphony.sitemesh.webapp.SiteMeshFilter.doFilter(SiteMeshFilter.java:77) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:162) 
    at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237) 
    at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:999) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:565) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:309) 
    - locked <0x2a42> (a org.apache.tomcat.util.net.SocketWrapper) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
    at java.lang.Thread.run(Thread.java:662) 
+1

Вы должны показать некоторые краткие примеры кода в вашем посте иначе мы только гадать. – Gray

+0

Образованные угадывания были бы прекрасны для меня. Поскольку я понятия не имею, что может вызвать такое поведение, я не знаю, какая часть базы кода может быть полезна. –

+0

Попробуйте ввести логическую переменную isSwing и установите ее извне этого кода. как из ContextListener в веб-контексте и из основного класса в контексте swing. –

ответ

1

Под капотом SwingUtilities.isEventDispatchThread() вызывает Toolkit.getEventQueue() метод, который следующий источник:

/* Accessor method for use by AWT package routines. */ 
static EventQueue getEventQueue() { 
    return getDefaultToolkit().getSystemEventQueueImpl(); 
} 

Toolkit.getDefaultToolkit объявлен synchronized методом - может быть, это так. Кроме того, пожалуйста, обратитесь к JavaDoc этого метода: http://docs.oracle.com/javase/6/docs/api/java/awt/Toolkit.html#getDefaultToolkit%28%29

Надеется, что это помогает

Смежные вопросы