Сценарий
Я собираюсь быть кратким, насколько это возможно. В основном со ссылкой на этот classdiag , у меня есть фасад, который управляет списком SocketManager (который управляет одним соединением Socket). Каждый SocketManager входит на удаленный сервер, используя уникальный SocketUserId . Кроме того, каждый SocketManager будет принимать сообщения от клиентов, предназначенных для определенного списка Получатели . Для обсуждения рассмотрим эти Получатели просто как удаленные области данных, идентифицируемые по имени.
Клиенты будут отправлять данные следующим образом:
SocketFacade facade = ...;
byte[] data = ...
facade.sendData( receipient, data );
Когда SocketFacade запускается, он запрашивает таблицу mysql, которая возвращает 1-м соотношение между SocketUserId и Receipients . Я буду использовать MultiValuedMap , чтобы представить это 1-м отношение. Несколько SocketManager будут запущены путем перебора карты.
(1) Map< SocketUserId, List<Receipient> >
например. Предположим, у нас есть 2 SocketManager с SocketUserId с "Алиса" и "Том" соответственно
+----SocketManager1 ( "alice" ) for Receipients { "B", "C" }
|
SocketFacade
|
+----SocketManager2 ( "tom" ) for Receipients { "A", "D" }
Вопрос
Я не знаю, как реализовать метод sendData . По сути, мне нужен способ сопоставления получателя (например, «B») с ответственным SocketManager (например, SocketManager1 ).
Давайте предположим, что я делаю это
(2) Map< SocketUserId, SocketManager >
(3) Map< Receipient, SocketUserId >
- Нужно ли SoftReference для значения в (2)?
- Должен ли я просто сопоставить Получатель непосредственно с SocketManager ?
SocketFacade также поддерживает методы, которые изменят отношение, представленное (1). Если я запишу в базу данных, структуры данных в памяти (1), (2) и (3) должны будут синхронизироваться. SocketFacade также должен быть поточно-ориентированным. Первоначальная идея состоит в том, чтобы иметь какую-то систему подписки на публикацию, при которой добавление / удаление в БД приведет к распространению изменений через обратные вызовы.
interface Callback
{
void receipientAdded( Receipient r );
void receipientDeleted( Receipient r );
}