Как передать созданные сокеты другому процессу Java - PullRequest
4 голосов
/ 17 декабря 2009

У нас есть приложение, которое создает множество сокетов, которые принадлежат его потоку. По своему замыслу, если это приложение каким-то образом дает сбой, все потоки останавливаются, что не нужно. Таким образом, чтобы преодолеть эту проблему, каждый поток должен быть отделен от основного приложения, если один из потоков выходит из строя, остальные должны работать. Мы думаем о том, чтобы передать созданный сокет другому процессу Java, так каков правильный путь?

Другой подход также приветствуется?

Жду ваших предложений ...

Ответы [ 6 ]

3 голосов
/ 17 декабря 2009

Разветвление:

Насколько я могу судить, вы не можете передавать дескриптор сокета между процессами Java, используя обычный API. Тем не менее, кажется, что это возможно в Windows с использованием Winsock 2 API . В Posix вы должны иметь возможность ветвить дочерний процесс с доступом к родительскому сокету, так как разветвленные процессы наследуют родительские сокеты .

Я думаю, вы могли бы реализовать новый класс SocketImpl, который поддерживает перемещение дескриптора сокета в другой процесс, но для этого вам нужно написать некоторый код JNI.

Звучит довольно волосато для меня, я сомневаюсь, что создание нового процесса из Java - хорошая идея!

Слушателей:

Другим подходом может быть создание нового процесса «слушателя», который, по сути, является новым предварительно разветвленным рабочим. Затем каждый работник может по очереди прослушивать сокет для соединений. Затем рабочие должны будут координировать свои действия с процессом управления, который по мере необходимости управляет порождением новых процессов.

Я согласен с @Bozho, если ошибка в одном потоке может привести к их уничтожению (я думаю, это должно быть исключение JVM, убивающее все приложение), у вас большая проблема. Если возможно, вы должны рассмотреть возможность изоляции потоков.

2 голосов
/ 17 декабря 2009

см. Этот же вопрос сокет, проходящий между процессами .
К сожалению, барьер адресного пространства не может быть превышен.

2 голосов
/ 17 декабря 2009

Это не так. (Сокеты не могут быть сериализованы.)

При сбое одного потока его исключение должно быть перехвачено, зарегистрировано, и это не должно мешать другим потокам. Так что либо дизайн остановится полностью, либо дизайн не останов полностью.

Или передать всю информацию о сокете (адрес / порт) в другое приложение, которое само может открыть аналогичный сокет.

1 голос
/ 17 декабря 2009

Я скорее согласен с Bozho, что вам нужно изменить дизайн ваших потоков приложений / критики, чтобы исключение или ошибка действительно убили всю вашу виртуальную машину.

Чтобы помочь вам с этим, я предлагаю вам взглянуть на:

  • Thread.set По умолчанию UncaughtExceptionHandler (...) и Thread.setUncaughtExceptionHandler (...) (см. Гиперссылку ниже) , которая помогает получить непредвиденный проблемы (такие как время выполнения)
  • Runtime.addShutdownHook (...) (см. Гиперссылку ниже) , которая помогает красиво закрывать вещи (например, при возникновении ошибки OutOfMemoryError)

Привет

Цербер

http: //java.sun.com/j2se/1.5.0/docs/api/java/lang/Thread.html#setUncaughtExceptionHandler(java.lang.Thread.UncaughtExceptionHandler) http: //java.sun.com/j2se/1.5.0/docs/api/java/lang/Runtime.html#addShutdownHook(java.lang.Thread)

0 голосов
/ 02 февраля 2012

Я хочу ответить тем, кто говорит: «Просто поймайте исключения и выйдите из потока».

Вы не можете перехватить все исключения. Следующая причина для выхода Java Java:

  • утверждение jvm из-за ошибок в реализации jvm
  • некоторые ошибки в коде jni (sigsegv, sigabrt)
  • OutOfMemory
0 голосов
/ 17 декабря 2009

Используйте класс, который разделяется между потоками для хранения сокетов. Вы можете использовать HashMap для маркировки каждого сокета, чтобы другие потоки могли ссылаться на тот, который ему нужен.

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