2012-03-18 3 views
0

내가 성취하려고하는 것이 가능하다면 어떤 도움이 될지 모르겠다. 기본적으로 내가하려고하는 것은 사용자가 서로 경쟁 할 수있는 온라인 체커 게임을 만드는 것입니다. 게임의 논리는 EJB 내부에 있으며 지금까지 제대로 작동합니다. 지금까지 나는 플레이어 - 컴퓨터 게임을 완수했습니다, 그리고 그것은 잘 작동합니다 - 플레이어는 이동의 출발지와 목적지를 선택합니다 (논리가 유효한지 결정하는 동안). 그리고 컴퓨터가 움직이면 보드가 업데이트됩니다. . 그러나 현재 해결해야 할 2 가지 문제가 있습니다. 1) 플레이어가 완료된 후 약 1 초가 지나면 컴퓨터가 움직이기를 원합니다. 그것은 작동합니다 - 그러나 보드가 업데이트되지 않았습니다. (이유에 대해 나중에 설명하겠습니다) 2) 컴퓨터가 움직이면 2 ~ 3 번 깜박 거려야합니다. 'clickImg에jsf 2 지연 + 깜박임 후 빈에서 UI 업데이트

public String getImgSrc() 
{ 
    FacesContext fc = FacesContext.getCurrentInstance(); 
    UIComponent c = UIComponent.getCurrentComponent(fc); 
    String cID = c.getId(); 
    String output = "/resources/EMPTY_BOX.jpg"; 
    String currOption = gameBoard.get(cID); 
    if (currOption != null) 
    { 
     output = "/resources/" + currOption + ".jpg"; 
    } 
    return output; 
    } 

:

내 빈에서
<h:commandButton id="B1" image="#{CodeBean.imgSrc}" actionListener="#{CodeBean.clickImg()}" action="#{CodeBean.update}" onmouseover="this.src='#{CodeBean.overImgSrc}'" onmouseout="this.src='/CheckersClientSide#{CodeBean.imgSrc}'"> 
    <f:ajax render="@form" /> 
</h:commandButton> 

는'이 imgsrc '게터는 다음과 같습니다

내 보드에

각 사각형은 다음과 같습니다 명령 단추입니다 '함수가 콩 내부에서 어떤 사각형이 이미 선택되었는지 확인합니다. 그렇지 않으면 사각형이 이동의 원점으로 선택되었습니다. 그렇지 않으면 업데이트 된 보드 맵을 반환하는 EJB의 move 함수를 호출 한 후 보드를 업데이트하는 'getImgSrc'함수를 호출 한 다음 업데이트 된 보드의 맵을 반환하는 EJB의 컴퓨터 이동 함수를 호출 한 다음 다시 'getImgSrc'를 호출하여 보드 자체를 업데이트합니다.
그러나, 나는 다음과 같이 타이머를 사용하여 컴퓨터의 이동 함수를 호출하려고하면 -

Timer timer = new Timer(); 
timer.schedule(new TimerTask() 
{ 
    @Override 
    public void run() 
    { 
     getMachineMove(); 
    } 
} , 1000); 

'getMachineMove'기능은 두 번째 이후 호출하고, 그 기능은 'getImgSrc',하지만 보드를 호출 업데이트되지 않습니다. 'FacesContext.getCurrentInstance()'가 null을 반환하기 때문에 업데이트되지 않습니다. 내가 충분히 명확했으면 좋았을 텐데. 내가 원했던 경우, 어떤 종류의 도움을 주어도 좋을 것입니다.

건배, eRez

답변

1

는 몇 가지 심각한 개념 실수 있습니다.

먼저 HTTP 요청에 HTTP 응답 만 보낼 수 있습니다. HTTP 요청이 없을 때 HTTP 응답을 보낼 수 없습니다. HTTP 요청은 클라이언트에 의해서만 시작됩니다. FacesContext은 HTTP 요청 스레드에 저장됩니다. 따라서 타이머 스레드에 FacesContext이없는 이유가 설명됩니다.

웹 소켓과 함께 HTTP 푸시 기능을 도입 할 수도 있지만 이는 그리 간단하지 않습니다. PrimeFaces 컴포넌트 라이브러리의 경우 a <p:push> component입니다. 그러나 다음 작업을 직접 계산하고 JSF가 업데이트 작업 클라이언트 측에서 수행하는 JavaScript 코드 행을 setTimeout(callback, millis)으로 인쇄하도록하는 것이 더 쉬울 것입니다.

둘째, Timer/TimerTask을 사용하는 것은 평생 동안 계속 실행되는 Java EE 웹 응용 프로그램에서 매우 나쁜 생각입니다. 나중에 다시 한번 그렇게 생각하지 마십시오. java.util.concurrent API 또는 서버 제공 태스크 스케줄러를 사용해야합니다. 이것은 귀하의 질문에 대한 답변이 아니며 (HTTP 푸시 또는 JS 사용), 자세한 내용은 Spawning threads in a JSF managed bean for scheduled tasks using a timer

+0

과 같이 항상 확인하십시오. 자세한 답변을 주셔서 감사합니다. 'ScheduledExecutorService'를 아주 쉽게 관리했지만, PrimeFace의 푸시를 구현하려고 시도했을 때 작동하지 않았습니다 (예제는 간단 해 보였지만). 내 대답은 여기에있다 - http://blog.primefaces.org/?p=1440, 내가 GlassFish 3.0을 사용하고있는 것 같습니다. 따라서 JS 내에서 타임 아웃을 구현하려고합니다. – eRez