2012-04-10 2 views
4

Я работаю над темой Java RMI и нуждаюсь в некоторой информации о пуле соединений на стороне клиента. В литературе и документации нет четких ответов на эти темы. Я знаю, что объединение пулов не является частью спецификации RMI. Но в некоторых реализациях (например, в реализации SUN) это делается. Поэтому мои вопросы касаются этой реализации.Сведения о подключении пула Java RMI

Я полагаю, что сокет (java.net.Socket), созданный фабрикой сокетов RMI, кэшируется в пуле. Это верно?

Как сохраняются эти соединения? Я хотел бы исключить, что HashMap используется с целевым ip/port как ключ, а сокет - как значение.

Розетки закрыты таймаутом. Как достигается информация о времени простоя соединения? Возможно, существует некоторая временная метка, когда соединение используется в последний раз.

+0

На все эти вопросы можно ответить, посмотрев в источнике OpenJDK. Начните с 'sun.rmi.transport.proxy.RMIMasterSocketFactory' – artbristol

ответ

2

Принимая во внимание, что я говорю только о реализации Sun:

Я полагаю, что гнездо (java.net.Socket), который создается сокет завода RMI кэшируется в бассейне. Это верно?

Да, после того, как он освобожден от удаленного вызова, и, конечно, удаленный вызов смотрит в пул сначала, прежде чем он попросит фабрику сокетов создать новый Socket.

Как сохраняются эти соединения? Я хотел бы исключить, что HashMap используется с ключом ip/port назначения и ключом как сокет.

Давайте просто скажем, что логически должна быть Карта из ip: port to Socket. Детали реализации на самом деле не важны.

Розетки закрыты таймаутом. Какова информация о времени простоя соединения ?

Отметив, что соединение было установлено в бассейн.

0

В Oracle/OpenJDK список (незанятых) соединений с определенной конечной точкой (для определенного канала) поддерживается в List<TCPConnectiont> sun.rmi.transport.tcp.TCPChannel#freeList. Максимального размера нет. Существует резьба с резьбой, которая проверяет розетки на холостом ходу более 15 секунд (-Dsun.rmi.transport.connectionTimeout=15000).

Каналы хранятся в Map<TCPEndpoint,Reference<TCPChannel>> sun.rmi.transport.tcp.TCPTransport#channelTable как карта WeakHashMap.

Существует BTW возможный предел обработки потоков (-Dsun.rmi.transport.tcp.maxConnectionThreads=unlimited) на принимающей стороне.

Смежные вопросы