2015-01-31 3 views
1

모든 사용자가 음성으로 말하고 사용할 수있는 음성 회의실을 만들려고합니다. 하지만 관리자로서 모든 사용자를 음소거 할 수있는 특권이 있어야합니다. 그래서, 나는 클라이언트 측에서 체크인하고 그에 따라 사용자의 마이크를 활성화/비활성화 할 마이크 속성을 사용자에게 추가합니다. 서버 측 코드는 다음과 같습니다.Red5 SharedObject 클로징 스트림 업데이트

String identifier; 
String userID; 
private int _gId = 1; 
private Map<String,Object> newUser; 
@Override 
public boolean appConnect(IConnection conn, Object[] params) { 

    identifier = (String)params[1]; 
    userID = (String)params[0]; 
    int _globalUserId = _gId++; 

    conn.getClient().setAttribute("id", _globalUserId); 

    newUser = new HashMap<String,Object>(); 
    newUser.put("identifier", (String)params[0]); 
    newUser.put("mic", 1); //mic value to be checked in client side 
    return true; 
} 

@Override 
public boolean roomJoin(IClient client, IScope scope) { 
    ISharedObject so = getSharedObject(scope, "users_so"); 
    so.setAttribute(userID,newUser); 

    return true; 
} 

@SuppressWarnings("unchecked") 
public void muteUser(String userID){ 
    IScope scope = Red5.getConnectionLocal().getScope(); 
    ISharedObject so = getSharedObject(scope, "users_so"); 
    Map<String,Object> user= new HashMap<String,Object>(); 
    user = (Map<String, Object>) so.getAttribute(userID); 
    if(user != null){ 
    user.put("mic", 0); 
    so.beginUpdate(); 
    boolean removed = so.removeAttribute(userID); 
    boolean updated = so.setAttribute(userID,user); 
    so.endUpdate(); 
    log.info("Mic: " + user.get("mic")); 
    log.info("Removed: " + removed); 
    log.info("Updated: " + updated); 
    } 

    } 

muteUser 메소드를 호출 할 때 문제가 발생합니다. Red5는 스트림이 폐쇄되었다고 말합니다. 나는 이것이 사용자의 속성을 제거하고 다시 추가 할 때 발생한다고 생각하지만 sharedObject의 마이크 값을 업데이트하는 다른 방법을 찾을 수 없습니다.

스트림을 잃지 않고 sharedObject를 업데이트하는 것이 좋습니다.

답변

0

요청한 것은 사용자가 생각하는 것처럼 보이는 사용자 맵처럼 작동하지 않습니다. 나는 SO에지도를 저장하고지도에 get/add를 할 것을 제안합니다. 이 경우 맵은 공유되므로 스레드로부터 안전하게해야합니다. 거기에 ConcurrentMap을 사용하겠습니다.

ISharedObject so = getSharedObject(scope, "users_so"); 
if (so == null) { 
    // make sure your so exists 
} 
so.beginUpdate(); 
ConcurrentMap<String, Object> users = (ConcurrentMap<String, Object>) so.getAttribute("users"); 
if (users == null) { 
    users = new ConcurrentHashMap<String, Object>(); 
    so.setAttribute("users" users); 
} 
Object user = users.get(userID); 
user.put("mic", 0); 
so.endUpdate(); 
+0

매우 흥미 롭습니다. ConcurrentHashMap을 생각한 적이 없습니다. 결과를 사용하여 다시 사용하도록 노력하겠습니다. –

관련 문제