2016-02-07 2 views
1

У меня есть библиотека JVM (назовите ее «tool»), которая предоставляет услугу. Для некоторых конкретных функций tool должен вызывать сторонний код. Это происходит путем загрузки пользовательского файла Jar в пользовательский загрузчик классов и вызова пользовательской функции, принимающей список String s в качестве аргументов. По сути, это базовая инфраструктура плагина.Межъядерная связь в одном JVM

Для моего варианта использования я хотел бы, чтобы два плагина разговаривали друг с другом в рамках этих ограничений. Плагины могут делать все, что они хотят (в том числе нерестовые долгоживущие фоновые потоки), но их вызывают только tool.

Простейшее решение, которое не сработает для меня, - это «объединить» оба плагина вместе. (Предположим, что приведенный выше сценарий является приведенным выше. У меня очень упрощенные вещи.)

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

Мой вопрос: есть ли безболезненная библиотека связи между классами для JVM? Ему просто нужно поддерживать передаваемые строки и собственные типы (массивы, ...), но, самое главное, он должен быть инициализирован с использованием только строк. Тогда было бы возможно, чтобы я упаковал его для tool и позволял другим плагинам общаться через него. Предположим, что я могу добавлять произвольные зависимости к плагинам, но не к tool.

+0

Мне пришло в голову, что мой сценарий будет похож на то, чтобы два веб-приложения разговаривали друг с другом на сервере приложений (но без поддержки со стороны сервера). – larsrh

+1

не является ответом, а главным образом основанным на мнениях, но osgi - это способ создания такого приложения. проще, просто поделитесь некоторыми классами между загрузчиками классов. –

+0

@ JérémieB И даже если вы решите не использовать OSGI (зачем вы это делаете?), принцип всех разумных решений одинаковый: полагайтесь на классы, загруженные общим загрузчиком классов, если push нажимает, вы даже можете передавать сообщения JSON в 'String'. – biziclop

ответ

1

Основная идея состоит в том, чтобы сделать часть «уровня связи» частью фреймворка (то есть в базовом загрузчике классов).

Если у вас есть достаточно специфическая потребность, может быть довольно легко сделать относительно специфический api. один плагин регистрируется как поставщик, а другие плагины могут быть потребителями.

Если ваши потребности шире, то вам может понадобиться реализовать (или найти) какую-то инфраструктуру типа «автобус сообщений». что обеспечивает легкий механизм для передачи «сообщений» динамически. каждый плагин может использовать определенные имена в качестве адресатов сообщений, а затем другие плагины могут отправлять им сообщения (и, предположительно, получать ответы).

еще одна возможность, которая встроена в каждый jdk, - это JMX (часто забытая, но мощная технология). вы можете предоставить строго типизированный apis, используя основные типы, и любой код, запущенный на jvm, может взаимодействовать с этими apis (двойной бонус - это то, что вы можете взаимодействовать с ними вне jvm, а также).

+0

К сожалению, я не могу изменить 'tool'.Можете ли вы дать мне несколько указателей на JMX для передачи сообщений/сообщений? – larsrh

+0

@larsrh - есть много обучающих программ jmx онлайн. я бы сосредоточился на MXBeans, например. https://docs.oracle.com/javase/tutorial/jmx/mbeans/mxbeans.html. как побочная заметка, jmx позволяет вам использовать истинные API, а не строгое взаимодействие стиля передачи сообщений. – jtahlborn

+0

@larsrh - также сам javadoc довольно обширен: http://docs.oracle.com/javase/7/docs/api/javax/management/package-summary.html#package_description и http://docs.oracle. com/javase/7/docs/api/javax/management/MXBean.html – jtahlborn