2009-09-17 28 views
1

我們使用JBoss 4.22和portlet。當偵聽器標籤不在web.xml中時,portlet加載,但偵聽器sessionDestroyed()從不被調用(顯然)。添加portlet時未加載,並且沒有任何例外或日誌消息。是否有任何我應該知道的陷阱?我的web.xml中的監聽器有什麼問題?

<web-app xmlns="http://java.sun.com/xml/ns/j2ee" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" 
      version="2.4"> 


      <!-- Listeners used by application --> 
     <listener> 
      <listener-class>listenerpackage.MyClassThatImplementsHttpSessionListener</listener-class> 
     </listener> 
    ...Other tags... 
    </web-app> 

在回覆評論時,我一直在尋找代碼來查找問題點。我的Listener的構造函數確實有一些可能的麻煩。通常(不是偵聽器)一個實例將由相關的portlet(當偵聽器添加到web.xml中時未加載的)構造函數創建。我仍然可以期待這種情況,或容器是否自己創建實例?

+0

原則上,應該沒問題。你的聽衆是否會做出任何可能帶來連鎖效應的俏皮話? – skaffman 2009-09-17 16:56:58

+0

我不熟悉「連鎖」效果。監聽器是一個委託並管理多個對象和連接。我們讓它實現了HttpSessionListener,以便它可以清理對象並清理連接。 – Adam 2009-09-17 17:06:15

+0

你的聽衆在做什麼?不知何故,它可能會阻止整個網絡應用程序? – nos 2009-09-17 19:18:45

回答

1

問題是在部署文檔中聲明的偵聽器在加載文檔時實例化。我的類被設計爲由portlet實例化,所以需要的信息不可用。

解決方案是使用HttpSessionBindingListener並將該類作爲屬性添加到會話中。然後在會話無效時調用unbound()。 :)

1

在web.xml中,您的偵聽器節點是否以正確的順序排列?由於沒有遵循DTD,可能會被忽略?例如,servlet,servlet-mappings,session-configs都應該在偵聽器之前。

+0

你從哪裏看到這個?我的搜索傾向於在頂部和底部顯示聽衆標籤。我也讀過一些線索,指出它只對重複和參數很重要,儘管我現在沒有它們。 – Adam 2009-09-18 14:57:30