2010-12-02 3 views
0

플렉스 클라이언트와 블레이즈/스프링/자바 백엔드로 구성된 다중 사용자 응용 프로그램이 있습니다. 즉 주요 요소가 정상적으로 작동합니다. 목적지로 메시지를 보내 소비하고 생산하는 것. Flex 클라이언트는이 클래스의 문자열을 보내고 가져올 수 있습니다. 내가하고 싶은 일은 동일한 변수에 대한 액세스 권한을 가진 2 명의 클라이언트를 갖는 것입니다.이 원시 샘플에서는 string에 _players 서버 측을 추가하는 각 swf에서 GUID를 보냅니다. Swf A를 실행하면 Swf B와 마찬가지로 GUID를 다시 수신합니다. Swf A는 Swf B에서 guid를 받지만 Swf B는 Swf A를 수신하지 않습니다. BTW 이것은 방금 두 번 실행 한 swf 코드입니다 각각은 다른 브라우저에 있습니다.단일 자바 클래스에 여러 플렉스 클라이언트 연결

누구나 내가 잘못 가고있는 곳이나 더 나은 해결책을 찾을 수 있습니까?

public class GameFeed { 

    private static GaneFeedThread thread; 

    private final MessageTemplate template; 

    public GameFeed(MessageTemplate template) { 
     this.template = template; 
    } 

    public void start() { 
     if (thread == null) { 
      thread = new GaneFeedThread(this.template); 
      thread.start(); 
     } 
    } 

    public void stop() { 
     thread.running = false; 
     thread = null; 
    } 

    public static class GaneFeedThread extends Thread { 

     public boolean running = false; 

     private final MessageTemplate template; 

     public GaneFeedThread(MessageTemplate template) { 
      this.template = template; 
     } 

     private static String _players; 

     public void addPlayer(String name) 
     { 
      _players += name + ","; 
     } 
     while (this.running) { 


       this.template.send("game-feed", _players); 

     } 

답변

0

수업 중에 스레딩 문제가 있습니다. 이것이 문제의 원인인지는 확실하지 않지만 그렇게 할 수는 있습니다.

_player 변수를 통해 데이터를 공유하는 솔기가 있습니다. 그러나이 변수는 스레드로부터 안전하지 않습니다.

  • 문제 1 : 그것은 두 가지 주요 문제가있다 - 플레이어 변수에 일이 무엇인지 분명하지 않다 - 두 클라이언트가 동시에 addPlayer 메소드를 호출하면 고도는 적어도 당신은 잃어버린 업데이 트 같은 것을 가질 수를
  • 문제 2 : (아마도 원인 일 수 있습니다.) Java 메모리 모델은 _player 변수가 적절한 동시성 관리없이 두 스레드에서 업데이트된다는 것을 보장하지 않습니다.

    • 첫째 :
    • 초 (문제 1)는 동기화 블록에 _players += name + ","; 포장 : 마크 _playersvolatile로 (문제 2)

    은 두 가지를 할 필요를 해결하려면

@see http://jeremymanson.blogspot.com/2008/11/what-volatile-means-in-java.html

+0

동기화 된 블록에 사용되는 모니터를 선택하십시오. '이'가 될 수 없습니다. – Ralph

+0

감사합니다. 결국 문제를 발견했지만 도움을 주셔서 감사합니다. 문제는 실제로 매우 바보스럽고 가변 범위로 인해 발생했습니다. 변수를 GameFeed 클래스로 옮겼습니다. 클라이언트가 활성화 한 Thread 클래스와 반대로 잘 동작했습니다. – MikeW

0

아마이 문제를 방지하는 서버 일 수 있습니다. 전통적으로 클라이언트간에 공유되거나 그렇지 않으면 유지되는 데이터는 DB 또는 다른 데이터 소스에 기록됩니다. 당신은 메모리 DB에서 잘 할 것입니다. 대부분의 웹 서버는 HSQLDB 또는 Derby을 사용하여 즉시 구성됩니다.

0

GENER 다른 솔루션은 문자열 대신 스레드 저장 콜렉션을 사용하지만,이 문제는 다른 문제로 이어지고 문자열과 같이 효율적이지는 않습니다.

그럼에도 불구하고 당신은 결정을 내리는 것이 좋습니다 : Thread 클래스의 정적 변수를 사용하여 플레이어 목록과 같은 공유 비즈니스 데이터를 저장하는 것입니다.

관련 문제