2012-12-03 4 views
13

내 jsf 프로젝트의 페이지를 탐색하는 동안 BusyConversationException이 발생합니다. 이것은 주로 사용자가 ajax 호출 중에 다른 페이지로 이동하려고 시도 할 때 발생합니다. 이는 사용자가 페이지로드를 기다리지 않고 다른 링크를 클릭 한 직후에 링크를 클릭 할 때도 발생합니다.jsf에서 BusyConversationException을 피하는 방법

예를 들어 사용자가 아래 코드와 비슷한 코드를 통해 생성 된 둘 이상의 링크를 클릭하면이 예외가 발생합니다. 또 다른 예는 사용자가 텍스트 필드에 쿼리를 입력하고 애플리케이션에서이 쿼리를 검색하기 위해 ajax 호출을 수행하는 것입니다. 이 쿼리 중에 사용자가 다른 페이지로 이동하기 위해 일부 단추를 클릭하면 BusyConversationException도 발생합니다.

<h:commandLink value="#{theProfile.profileName}" 
       title="#{theProfile.profileName}" 
       action="#{profileBean.aProfileSelected}"> 
       <f:setPropertyActionListener target="#{currentProfileWebBean.theProfile}" value="#{theProfile}"/> 
</h:commandLink> 
내가하지만 난 내 현재 상태와 나는이 경우에 할 수있는 최선이 예외가 발생하면 메인 페이지로 리디렉션하는 것입니다 저장할 수 없습니다 ExceptionHandlerWrapper 클래스를 확장하는 ExceptionHandler 클래스에서 예외의 유형을 잡을 수

.

이것을 피하는 해결책이 있습니까? 답변과 의견에 미리 감사드립니다.

+0

주 : 'BusyConversationException'은 JSF의 일부가 아닙니다. CDI 태그를 추가했습니다. – BalusC

+0

Conversation.begin 호출이 여러 번 발생합니까? – LightGuard

+1

안심할 수 있으면이 문제도 발생합니다. 웹 검색을 기반으로하는 _few_ 사람들의 반응이 놀랍습니다. 나는 대화 범위의 bean을 제거하고 session-scoped와 view-scoped (Seam Faces가 제공하는 CDI 뷰 범위로)를 사용하는 경우가있다. – Nick

답변

2

의 제출 CommandLink는에 아약스 요청이 아직 처리되는 경우 또는 아약스 이벤트가 실제 클릭하기 전에 트리거되는 경우 이런 일이 발생을 받고 있지 않다 또는 commandButton (예 : 입력 필드의 변경 이벤트). AJAX와 이벤트가 전파를 통해 트리거되지 않기 때문에

는 Therfore 그것은 onclick="preventEventPropagation(event)";와 BusyConversationExceptions을 피하기 위해 수없는 입니다.

대기중인 아약스 이벤트가 완료 될 때까지 실행중인 아약스 요청을 수신 대기하고 제출을 차단하면 쉽게 피할 수 있습니다.

문제와 해결 방법은이 블로그 게시물 JSF2 AJAX/Submit conversation issue에 자세히 설명되어 있습니다.

-1

나는 때때로 이것을 보았습니다. 나는 대화를 직렬화 액세스에 어떤 노력을 넣어 좋은 아이디어라고 생각하기 시작 해요 :

  1. 피가 대상보기 위해 그 대화의 인스턴스를 필요로하지 않는 대화 ID (CID)를 전파. 특히 무관 한 탐색 링크/단추는 cid 매개 변수를 억제해야합니다 (정확하게 수행하는 방법은 생각하지 않았습니다).
  2. 활성 대화를 사용하는 요청을 시작할 때 대화를 전파하는 다른 UI 요소를 사용하지 않도록 설정하면 동시 접속하다. PrimeFaces 또는 (더 나은) PrimeFaces Extension blockUI 구성 요소는 PrimeFaces p : ajaxStatus와 함께 반투명 오버레이와 함께 작동하여 통화 중 상태를 표시합니다.
  3. 가능한 한 늦게 대화를 시작하십시오. 이렇게하면 장기간 대화가 전파되는 경우를 최소화 할 수 있습니다.

나는이 모든 것이 완전한 해결책이라고 생각하지 않습니다. 위치 표시 줄에서 시드가 끝나자 마자 (대화가 활성화되어있을 때 양식의 아약스가 아닌 포스트 백을 수행 할 때 발생 함) 여러 탭/탭으로 인해 해당 대화에 대한 액세스 시간을 제어하지 못할 가능성이 있습니다. 창 등, 북마크

+0

우리의 경우 우리는 대화를 끝내고 새로운 대화를 시작할 때 문제가 있습니다. 사용자가 h : commandLink를 클릭 할 때마다 새로운 대화를 시작하려면 어떻게해야합니까? setter # {currentProfileWebBean.theProfile}을 통해 백킹 빈에서 대화를 끝내려고했으나 cid가 전혀 변경되지 않고 postConstructs가 다시 호출되지 않는다는 것을 알 수 있습니까? 그래서 나는 대화가 제대로 끝나지 않았다고 생각해. 너 그것에 대해 생각해? – cubbuk

+0

여기에서 cid가'h : commandLink'에서 제출되는 것을 막기를 원할 것입니다. (이것은 다시 성취 방법을 생각하지 못했고,'h : link 대신'h : link'를 사용해야 할 수도 있습니다. commandLink'). 그렇게하면 요청에 대한 대화가 활성화되지 않고 새로운 대화를 시작할 수 있습니다. 이 기술은 대화를 끝내기보다는 대화를 떠나는 것으로 생각할 수 있습니다. – Brian

+0

정확히 내가 배우고 싶은 것, h : commandLink를 사용하여 일부 매개 변수 게시, 새 대화를 새 페이지에서 시작할 수 있도록 cid 게시하지 않음. h : link를 사용하면 일부 매개 변수를 전달해야합니다 (이 예에서는 "theProfile"객체를 매개 변수로 전달해야합니다). 그렇게하지 않으려는 URL 링크에 있습니다. – cubbuk

0

난이 발견

는 동시에 동일한 요청이 대화 컨텍스트와 연관되어 있기 때문에, 용기가 요청을 거부했음을 나타낸다.

컨테이너는 동시 요청을 차단하거나 거부하여 한 번에 하나 이상의 요청과 장기 실행 대화를 연관시킬 수 있습니다. 컨테이너가 요청을 거부하면 요청을 새 임시 대화와 연결하고 JSF 수명주기의 복원보기 단계에서 BusyConversationException 유형의 예외를 throw해야합니다.

내가를 클릭하여 사용하는 경우

-1

here 나는 또한 같은 문제에 직면 참조하십시오.

busyConevrsation은 해당 이벤트에서 두 가지 작업이 발생하므로 commandLink에서 해당 클릭에 대한 이벤트 전파를 방지하기 위해 onclick="preventEventPropagation(event)";을 사용합니다.그래서 나는 그것을 사용했고 그것은 나를 위해 일하고있다.

그래서 지금 BusyConversationException : 다른 답변에서 언급 한 바와 같이

+0

preventEventPropogration이 여기에서 도움이되지 않는다면, 클릭 리스너에 트리거 된 다른 것이있는 경우에만 작동합니다. 그러나이 경우 AJAX 요청이 이미 트리거되어 처리 중이거나 Ajax 변경 이벤트로 실제 클릭을 처리하기 전에 트리거됩니다. 이러한 문제를 피하려면 보류중인 Ajax 요청을 수신 대기하고 요청 처리가 완료 될 때까지 제출을 연기해야합니다. 문제에 대한 설명과 좀 더 자세히 설명 할 수있는 자체 답변으로 블로그 게시물을 연결했습니다. – dngfng