2013-08-07 2 views
1

У меня следующая проблема, чтобы решить:связи между различной Jar в/загрузчиков классов

Есть два jar файлов. Эти банки начинаются независимо друг от друга.

Теперь предположим, что первая баночка A.jar вычисляет или вычисляет что-то и должна фиксировать результаты до B.jar.

Я попытался связаться через центральный синглтон (enum Singleton и Singleton, который использует собственный загрузчик классов, как упомянуто here: Singleton class with several different classloaders).

Но, похоже, это не работало для меня. Когда я запускаю две банки, хэш-код экземпляров отличается.

Может ли кто-нибудь сказать мне, что я делаю неправильно? Или другие идеи, как решить мою проблему?

ответ

3

Существует два файла jar. Эти баночки начинаются независимо от каждого .

Таким образом, они являются отдельными процессов. Они не будут передавать экземпляры классов, переменных и т. Д. Для обмена информацией между ними требуется некоторая форма связи между процессами .

Это обычно означает какой-либо сетевой протокол (например, сокеты TCP/UDP, HTTP и т. Д.). Вы также можете сделать что-то очень простое, например, чтение/запись общего файла (это не особенно приятно, но для простых случаев это просто)

+0

Хорошо, хороший совет, банки используют профиль устройства для веб-сервисов. Думаю, это был бы хороший подход. – smsnheck

3

Если вы используете 2 файла jar отдельно, то каждый файл jar запускает собственный экземпляр JVM и между ними нет ничего общего. Это два отдельных процесса. Полная остановка.

Если вы хотите установить связь между ними, то вот альтернативы: Это зависит от того, какие данные вы хотите передать.

Если это только строки, то: если number of process = 2, и если вы уверены в этом, то stdin это лучший путь вперед. Один процесс может запустить другой файл Jar, создав Process, используя ProcessBuilder, а затем используя потоки для связи. Другой процесс может просто сделать System.out для передачи сообщения. Это предпочтителен для Socket, потому что вам не нужно обрабатывать грациозное закрытие сокета и т. Д. (В случае его отказа, и порт не был успешно скреплен, это может быть большой проблемой)

, если number of jar files > 2 (то есть количество все процессы) и less than говорят 10, вы, вероятно, можете использовать Sockets и общаться через Socket. Это должно работать хорошо, хотя дополнительные усилия идут в изящном управлении сокетами.

если number of process - Large, то следует использовать JMS. Он делает много вещей, которые вам не нужно обрабатывать. Слишком большая задача, если количество процессов меньше.

Так что в вашем случае процесс - лучший способ продвижения вперед. Если данные, которые вы хотите передать, могут быть объектами. RMI можно использовать, если число процессов меньше. Если больше, снова используйте JMS.

Редактировать: теперь для всего вышеперечисленного существует много грязной работы. Для перемен, если вы смотрите на что-то новое & захватывающее, я бы посоветовал akka. Это актерская модель, которая обменивается данными друг с другом с помощью сообщений. Красота такова, актеры могут быть на одном JVM или другом (очень маленькая конфига), а акка заботится о вас остальным. Я не видел более чистого способа, чем это делать :)

+0

Транк вам за большой ответ. – smsnheck

+0

@smsnheck Нет проблем :-) – Jatin

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