如何在并发 JSF 查询中共享变量?

How to share a variable in concurrent JSF queries?

我有一个基于 JSF 1.2 / RichFaces 3.3 / Oracle 10g 的应用程序。我有一个 <h:inputText>,它在按 Return 键时在数据库中执行搜索查询。如果一个接一个地提交多个查询,程序将向数据库触发多个查询(returns 一个结果列表)。该程序要求仅显示最近提交的查询的结果。

每次为 <h:inputText> 按回车键时都会触发此示例代码。

public void searchUser() {
    resultList = null;  // getters and setters are defined for resultList, resultList is directly accessed in .jsp pages.
    resultList = getUserServiceInterface().getFilteredUsers(searchString);  //results in JPA query to database.
}

假设,如果query1在t秒提交,它的答案在t+10秒到达。

同时,query2在t+2秒提交,它的答案在t+7秒到达。

.jsp页面使用resultList在t+7秒显示query2的结果,然后在t+10秒切换到query1的结果。 我想避免在这里显示 query1 的结果。

我为此使用的方法是忽略非最近查询的结果,它要求我能够使用一些公共变量将非最近查询的结果与最近查询的结果区分开来。我注意到每个查询都会产生一个新的 FacesContext 和 bean 的新实例,因此并发查询之间不能共享公共变量。我也尝试在 phaseListener 中管理最近查询的状态,但没有成功。我怎么能在程序中有一个变量,它在并发 JSF 查询期间是原子的。

可以通过 Ajax 请求优化来解决。我使用了单独的队列来进行流量防洪。

如果 Return 键被按下,下面的代码执行函数 searchUser()

<h:inputText value="#{searchUser.searchString}">    
    <a4j:support event="onkeydown" onsubmit="if (event.keyCode == 13) {return false;} else {return true;}"/>    
    <a4j:support event="onkeyup" onsubmit="if (event.keyCode != 13) {return false;} else {searchUser(); return false;}"/>
</h:inputText>

我为该函数定义了一个单独的队列并使用了ignoreDupResponses="true",这避免了类似的请求。

<a4j:jsFunction name="searchUser" eventsQueue="foo" ignoreDupResponses="true" requestDelay="1000" action="#{searchUser.searchUser}" reRender="homeContent, userList2"/>

可在以下 link 处找到更多信息:https://docs.jboss.org/richfaces/latest_3_3_X/en/devguide/html/ArchitectureOverview.html#QueueandTrafficFloodProtection