2009-12-03 3 views
2

시나리오 : Tomcat 서버에서 실행되는 Apache Wicket 기반 웹 응용 프로그램.Wicket : 세션 내에서 요청을 동기화하는 방법

사용자가 브라우저에서 URL을 열고 세션이 만들어지고 브라우저에 간단한 기본 페이지가 표시되고 사용자가 버튼을 클릭하면 AJAX 호출이으로 호출됩니다. 응용 프로그램은 요청을 받고 응답을 준비하는 몇 가지 작업을 수행합니다. 같은 시간에 브라우저 또는 브라우저의 JavaScript가 번 AYAX 호출을 호출합니다.이 두 번째 요청은 응용 프로그램의 다른 스레드에서 처리되며 응용 프로그램의 대부분이 세션 특정 적이기 때문에 스레드로부터 안전하지 않습니다 (한 명의 사용자 = 한 세션), 예외는을 던졌습니다.

가능한 해결책 : 모든 응용 프로그램 클래스가 스레드 안전 (매우 비용이 많이 드는)

  • GUI를 적용

    1. 메이크업은 그래서 동시에 AJAX는 하나 개의 세션 (브라우저 GUI의 불가능으로 인해 자연에서 호출이 실행되지) 개찰구 또는 톰캣 레벨 (하지만 방법에 대한 하나 개의 세션에서

    2. 동기화 모든 요청?)

    3. 다른 연습 또는 기술 ???

    감사

  • 답변

    4

    요청 하나의 세션이 이미 동기입니다 :이 파일에서 다음과 같은 의견입니다. 이미지, 자바 스크립트, CSS 파일 등과 같은 리소스에 대한 요청은 비동기 적으로 처리됩니다. (다른 클라이언트 은 각 클라이언트가 고유 한 세션 및 PageMap을 가짐에 따라 서로를 차단하지 않습니다.)

    그러나 세션 자체의 항목에 대한 액세스는 명시 적으로 동기화되지 않았습니다.

    덧붙여 말하면 요청 스레드가 아닌 스레드에서 세션/페이지에 액세스하는 것은 좋은 생각이 아닙니다. 컨테이너는 요청 사이의 세션/페이지를 자유롭게 처리 할 수 ​​있습니다. 디스크 등등에 그것을 써주십시오.

    +0

    언급 한대로 마침내 요청을 처리하는 스레드의 동시 액세스와 이전에 처리 된 다른 요청에서 시작된 다른 스레드가있었습니다. Wicket (I belive)은 실제로 같은 페이지의 요청을 동기화합니다. 고맙습니다. – mschayna

    3

    인 예외는 무엇을 발생합니다? 예외가 발생하면 세션 객체의 중요한 부분이 동기화되거나 처리되어야하며 전체 세션이 아닌 것으로 간주합니다.

    나는 그 (것)들을 많이 사용할 이유가 없지만 wicket-ajax.js (org.apache.wicket.ajax 패키지에 있음)의 일부로 채널이 있음을 알고 있습니다. 여러 AJAX 호출을 처리하는 방법을 제어합니다. 그들은 가치가 있을지도 모른다. - 한 번에 하나 개의 스레드 에서 같은 페이지지도 내에서 페이지 또는 구성 요소

    /** 
    * Channel management 
    * 
    * Wicket Ajax requests are organized in channels. A channel maintain the order of 
    * requests and determines, what should happen when a request is fired while another 
    * one is being processed. The default behavior (stack) puts the all subsequent requests 
    * in a queue, while the drop behavior limits queue size to one, so only the most 
    * recent of subsequent requests is executed. 
    * The name of channel determines the policy. E.g. channel with name foochannel|s is 
    * a stack channel, while barchannel|d is a drop channel. 
    * 
    * The Channel class is supposed to be used through the ChannelManager. 
    */ 
    
    +0

    나는 그 특정 예외는 무의미하다고 생각합니다. 사실 그것은 ConcurrentModificationException입니다. 더 중요한 점은 설계 상 스레드로부터 안전하지 않은 코드가 두 스레드에서 동시에 호출된다는 것입니다. 나는 Wicket 수준에서 이것을 차단하고 싶다. 모든 응용 프로그램 논리를 변경하고 싶지 않습니다. – mschayna

    +0

    동일한 데이터를 수정하고 있습니까? 나는 우리의 응용 프로그램에서 우리 세션에 물건을 넣기보다는 Wicket의 모델 객체를 활용할 수있는 좋은 길을 간 것을 알고 있습니다. 우리 세션에는 몇 가지 사항이 있지만 많지는 않습니다. – Matt

    +0

    마지막으로 : 이전에 처리 된 다른 요청에서 시작된 요청과 다른 스레드를 처리하는 스레드에서 동시에 액세스했습니다.Wicket (I belive)은 실제로 같은 페이지의 요청을 동기화합니다. 감사. – mschayna

    관련 문제