Hello all!
I'm facing the following effect: several flash clients (two) connects
to a SharedObject and listens changes issued from server side via
onSync listener. Everything works, clients disconnects.
After several reconnects (often at the second connect) w/o server
restarts, flash client does not receive any notifications of SO
changes. Everything works at server side, so.setAttribute(...) is
invoked - but a client does not get anything.
Any thoughts?
Can this be due to an application Exception occur?
Can 'onSharedObjectDelete()' be not invoked on
SO removal in attached ISharedObjectListener?
Serverside code:
public class RoomService implements IRoomService {
/** Map of roomId -> roomSO */
private static final Map<Long, ISharedObject> roomSOs
= Collections.synchronizedMap(new WeakHashMap<Long,
ISharedObject>());
/** SharedObject service */
@NotNull private final ISharedObjectService soService;
/** Application scope */
@NotNull private final IScope scope;
public void handle(@NotNull String roomId, @NotNull Map<String, Object>
event) throws AppException {
...
// Post to others
// Obtain SO ref
final ISharedObject roomSO = getRoomSO(roomId);
// Send event to all the stakeholders via the queue attr update
roomSO.setAttribute(EVENT_QUEUE, event);
}
/**
* Creates SO for a room
* @param roomId Id of the room
* @return SO assotiated with a room with the given Id
*/
protected ISharedObject getRoomSO(@NotNull final Long roomId) {
ISharedObject roomSO = roomSOs.get(roomId);
if (roomSO == null) {
// If absent, create (or get if has been GCed from map for some
reason)
String soId = "room_" + roomId;
roomSO = soService.getSharedObject(scope, soId);
if (roomSO == null) {
// Create and get
soService.createSharedObject(scope, soId, false);
roomSO = soService.getSharedObject(scope, soId);
// Paranoid
if (roomSO == null) throw new IllegalStateException("Unable to
get and unable to create SharedObject with name = '" + soId + '\'');
// Add listener for guaranteed removal from map @ onDelete
roomSO.addSharedObjectListener(new SharedObjectListenerAdapter()
{
@Override public void onSharedObjectDelete(ISharedObjectBase
so, String key) {
roomSOs.remove(roomId);
}
});
}
// Put into map
roomSOs.put(roomId, roomSO);
}
return roomSO;
}
}
Thanks in advance,
Alex.
_______________________________________________
Red5 mailing list
[email protected]
http://osflash.org/mailman/listinfo/red5_osflash.org