2016-02-08 130 views
0

我們目前正在將Apache Ignite集成到我們的應用程序中,以在羣集中共享會話。請參閱Ignite docs。 此時我們可以在兩個本地tomcat實例之間成功共享會話,但有一個用例,Ignite不支持(似乎)。更新Apache Ignite WebSession屬性

在我們的應用程序中,我們有一個名爲'Profile'的會話對象。此配置文件是用戶特定的,並且在用戶瀏覽應用程序時將各種屬性添加到此對象中。

我們更新以下列方式將「個人資料」對象(僞代碼):

profile = request.getSession().getProfile(); //Get Profile object from session 
profile.setLastVisitedPage("test"); 

沒有阿帕奇點燃,我們的會議將包含「setLastVisitedPage」(「測試」)正確的值。但是在使用Ignite時,Ignite的'WebSession'對象似乎有點不同:當在會話對象中設置'setLastVisitedPage'值時,WebSession將首先正確地包含正確的值('test'),但當瀏覽到下一頁中,從Ignite緩存中解析的WebSession對象不包含已更改的「setLastVisitedPage」屬性。

我已經看了一下Ignite代碼,我想,我知道爲什麼這不按預期工作。縱觀點燃「WebSession」課,我看到下面的方法:

public void setAttribute(String name, Object val) { 
    attrs.put(name, val); 

    if (updates != null) 
     updates.add(new T2<>(name, val)); 
} 

簡而言之:點燃希望,每次更新會話對象後,調用session.setAttribute方法,所以點燃將增加的變化它是內部的「更新」集合,用於更新Ignite網格中的對象。我們的應用程序的一個解決方案是更改我們的應用程序代碼,在每次更新後調用setAttribute,但我們也使用代碼依賴關係,這是我們無法更改的,並且會話對象更改後可能不會調用setAttribute ..

Ignite需要在會話對象更改後調用setAttribute的原因,還是Ignite中存在缺陷?

回答

0

你說得對,它現在是如何實現的,唯一的解決方法是在每次更新時明確地調用setAttribute()。我認爲這可以改善和創建一個Apache Ignite門票:https://issues.apache.org/jira/browse/IGNITE-2594

+0

奧克,很高興知道!現在我用我自己的版本覆蓋了WebSessionFilter,並添加了下面的代碼(這似乎有效): 'Enumeration names = ses.getAttributeNames(); while(names.hasMoreElements()){ \t String name = names.nextElement(); \t ses.setAttribute(name,ses.getAttribute(name));我收集了更新之前添加了這段代碼:'Collection > updates =((WebSession)ses).updates();' 您能否對此評論當Ignite Jira問題解決後回答? – NickGreen

+0

@NickGreen當然,您可以將自己添加到票務觀察人員並跟蹤進度。 –

+0

@NickGreen問題已修復。該修補程序將在最近的一個發行版中提供。現在,您可以從源代碼構建Apache Ignite,並在您身邊使用修補程序。 – dmagda