Самый быстрый (с точки зрения производительности) способ обмена данными (не объектами) между .Net и Java - PullRequest
4 голосов
/ 22 января 2010

Мне известен хотя бы один пост с такими же словами, как этот. Но это не совсем то же самое, что и этот пост. Я пытаюсь найти способ обмена данными между приложениями .NET и Java. Я не беспокоюсь об объектах, но просто строки, если хотите.

У меня есть приложение .NET, собирающее данные в реальном времени, и приложение Java, которое может анализировать эти данные и работать с ними. Я ищу способы повторно использовать это же Java-приложение, не кодируя его полностью в .NET.

Моя проблема в том, что данные «довольно» реального времени (.NET), и поэтому должен быть анализ (Java). Я могу жить с микросекундными задержками, но я не могу позволить себе одну секунду задержки. WebServices, Queues (как в Messaging Queues), RDBMS - вот некоторые варианты, которые я могу придумать. Есть ли лучший способ?

Или у кого-нибудь есть реальные цифры производительности для упомянутых выше решений, чтобы выбрать одно из них? И только для начала: СУБД не подходят для одновременного (подключения) вставки / обновления / чтения, по крайней мере, с грубым способом работы с СУБД. (Тупики?)

Ответы [ 9 ]

7 голосов
/ 22 января 2010

Что такое «объекты», если не механизм описания «данных»? Но я отвлекся - подозреваю, что посмотрю на TCP-сокет между ними. Если данные очень базовые, то все в порядке - просто пишите прямо в поток; если есть какая-то сложность, возможно, используйте что-то вроде «буферов протокола», чтобы обеспечить простой способ чтения / записи плотных данных в поток без необходимости записывать каждый последний байт самостоятельно.

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

2 голосов
/ 22 января 2010

Для полноты:

Другой возможный вариант - использовать Именованные каналы , это должно быть довольно быстро, и я думаю (будучи парнем из Java, которого я только могу представить), что .NET имеет встроенную поддержку для них. Недостатком является то, что в Windows вам придется либо написать расширение JNI, либо использовать библиотеку типа JNA , чтобы поиграть в Win32 API из Java.

0 голосов
/ 23 января 2010

Существует ряд серверов JMS, которые поддерживают клиенты .NET и Java. Они могут выполнять сообщения менее чем за миллисекунду.

Однако вы можете попробовать решение RPC, такое как Hessian RPC или Protobuf RPC. Это может привести к снижению задержек и появлению прямых вызовов между платформами. Они также поддерживают .NET и Java.

0 голосов
/ 23 января 2010

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

0 голосов
/ 22 января 2010

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

Я знаю, что это немного, но не могли бы вы скомпилировать приложение Java в компиляторе J #, чтобы ваше приложение .NET имело к нему собственный доступ?

0 голосов
/ 22 января 2010

Ответы здесь замечательные. Одна идея, которая может представлять интерес, но, вероятно, требует больше хлопот, чем стоит - это загрузить обе виртуальные машины в одном процессе (и JVM, и CLR могут быть загружены в собственное приложение Windows) и предоставить им доступ к собственному коду , Java через JNI и .Net через функции отображения в собственный код, который они позволяют.

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

Хотя JNI-переходы являются дорогостоящими, они, вероятно, все равно будут быстрее, чем собственная реализация локального сокета.

0 голосов
/ 22 января 2010

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

Программирование сокетов в реальном мире

0 голосов
/ 22 января 2010

В зависимости от вашей программы вы можете получить некоторую прибыль от того, что @Cowan сообщает в ответ на « Любая концепция совместной памяти в java », его ответ: Любая концепция общей памяти в Java

В заключение: он говорит, что вы можете использовать файлы, отображенные в памяти, между двумя процессами на одном компьютере. Теоретически это может работать между .NET и Java при условии, что .NET имеет некоторую поддержку файлов с отображением памяти.

0 голосов
/ 22 января 2010

Похоже, что локальный сокет может сделать. Задержка должна быть в низком мс или меньше.

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