문제

시나리오 : Tomcat Server에서 실행되는 Apache 개찰구 기반 웹 응용 프로그램.

사용자는 브라우저에서 URL을 열고 세션이 생성되고 간단한 메인 페이지가 브라우저에 표시되며 사용자 클릭 버튼 및 Ajax 호출이 호출됩니다. 응용 프로그램은 요청을 받고 응답을 준비하는 일부 작업을 수행합니다. 동시에 브라우저의 사용자 또는 JavaScript가 호출됩니다 또 다른 Ajax 호출 -이 두 번째 요청은 응용 프로그램의 다른 스레드에서 처리되며 응용 프로그램의 대부분의 부분은 세션에 따라 다르고 스레드-안전하지 않기 때문에 (하나의 사용자 = 한 세션), 예외가 발생합니다.

가능한 해결책:

  1. 모든 애플리케이션 클래스를 스레드 안전 (매우 비용이 많이 드는)으로 만듭니다.

  2. GUI를 적응 시켜서 동시에 한 세션에서 두 개의 Ajax 호출을 실행하지 않습니다 (브라우저 GUI의 특성은 불가능하지 않음)

  3. 개찰구 또는 Tomcat 레벨에서 한 세션의 모든 요청을 동기화합니다 (그러나 어떻게?)

  4. 또 다른 연습이나 기술 ???

감사

도움이 되었습니까?

해결책

단일 세션에서 동일한 Pagemap 내에서 페이지 또는 구성 요소에 대한 요청은 이미 동기식입니다. 한 번에 하나의 스레드 만 있습니다. 이미지, JavaScript, CSS 파일 등과 같은 리소스 요청은 비동기 적으로 처리됩니다. (각 고객이 자체 세션과 Pagemap을 가지고 있기 때문에 다른 클라이언트는 서로를 차단하지 않습니다).

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

또한 요청 스레드가 아닌 스레드에서 세션/페이지에 액세스하는 것은 컨테이너가 요청간에 세션/페이지로 무료로 수행 할 수 있기 때문에 좋은 아이디어가 아닙니다. 예 : 디스크 등으로 작성하십시오.

다른 팁

던지는 예외는 무엇입니까? 예외가 발생하면 세션 객체의 중요한 섹션이 더 많은주의를 기울이거나 전체 세션이 아닐 수도있는 중요한 섹션이 있다고 가정합니다.

나는 그것들을 많이 활용할 이유가 없었지만 개찰구-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.
 */
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top