Издатель и подписчик ActiveMQ на нескольких языках (C ++ Java)

Я хочу использовать ActiveMQ в качестве брокера сообщений, обменивающегося данными между компонентом C ++ и компонентом Java в двух процессах. Например. Компонент C ++ является издателем, а компонент Java - подписчиком (может быть несколько подписчиков). Я смотрю на сайт ActiveMQ, и там упоминаются инструменты OpenWire и ActiveMQ-CPP. Однако все примеры на веб-сайтах используют один и тот же язык как для производителя, так и для потребителя.

Мои вопросы:

1.Может ли ActiveMQ работать для производителя / потребителя на разных языках?

2. В разных процессах? Как?


person Lily    schedule 22.01.2010    source источник


Ответы (2)


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

«Начиная с версии 2.0, ActiveMQ-CPP поддерживает протокол OpenWire v2, за некоторыми исключениями. ObjectMessage - мы не можем реконструировать объект (ы), содержащиеся в ObjectMessage на C ++, поэтому, если ваше приложение подписано на очередь или тему, отправленное ему ObjectMessage, вы получите сообщение, но не сможете извлечь из него объект ".

Поэтому, если вы хотите отправлять данные между процессами, вы пишете свои компоненты C ++ и Java для использования API (убедитесь, что не используете типы ObjectMessage, если вы используете ActiveMQ-CPP). Затем запустите сервер ActiveMQ ... скажите своим программам подключиться к нему, и он должен работать.

Но если вы на самом деле просто пытаетесь установить межпроцессное взаимодействие, когда вы контролируете обоих клиентов, это может быть немного неуклюже. Возможно, вас заинтересуют ответы на Что такое лучший подход для IPC между Java и C ++? и Хорошая альтернатива IPC с общей памятью для приложений Java / C ++ в Linux

person HostileFork says dont trust SE    schedule 22.01.2010
comment
почему ActiveMQ деспотичен? - person Lily; 22.01.2010
comment
Насколько я понимаю, вам нужно запустить процесс ActiveMQ, поэтому теперь у вас работает всего три процесса (вместе со всеми заботами, связанными с запуском и настройкой посреднического сервера). Если вы используете разделяемую память, ваши процессы могут общаться напрямую, а если вы используете сокеты, вы получаете возможность запускать свои программы на разных машинах, если хотите. Каждый уровень абстракции дает вам что-то, и вам это может понадобиться, а может и нет для вашего приложения. - person HostileFork says dont trust SE; 22.01.2010
comment
Спасибо за ответ. Я действительно хочу запускать разные модули на разных машинах. На самом деле, в моем случае это шаблон издатель / подписчик (несколько издателей / несколько подписчиков). Я не уверен, что лучше: сокет или ActiveMQ? - person Lily; 24.01.2010
comment
Я не использовал ActiveMQ ... но в этом не было необходимости для ответа на ваш исходный вопрос. Что лучше вопросов, я не в своей тарелке. :) Но если вы управляете кодом C ++ и Java, то, похоже, нет веской причины, почему бы они просто не использовали один и тот же формат для чего-то вроде буферов протокола Google, и вам не понадобился бы брокер сообщений. Но, возможно, ActiveMQ отлично подходит для функций публикации / подписки в любом случае. Возможно, задайте новый вопрос, что лучше для сетевых служб публикации / подписки, ActiveMQ или Bonjour или ... и кто-нибудь, кто знает больше меня, сможет ответить на него. - person HostileFork says dont trust SE; 25.01.2010

Непосредственно с главной страницы ActiveMQ:

Supports a variety of Cross Language Clients and Protocols from Java, C, C++, C#, Ruby, Perl, Python, PHP

* OpenWire for high performance clients in Java, C, C++, C#
* Stomp support so that clients can be written easily in C, Ruby, Perl,
  Python, PHP, ActionScript/Flash, Smalltalk to talk to ActiveMQ as well 
  as any other popular Message Broker

Мы протестировали его с помощью PHP (с использованием Stomp) и Java (с использованием OpenWire).

Что касается процессов: разные производители и потребители, конечно, могут быть в совершенно разных процессах, обмениваясь данными, например, через TCP или SSL.

person Pascal Sartoretti    schedule 29.01.2010