Как я могу реализовать свою кроссплатформенную библиотеку (например, на JRE), чтобы работать в поточно-ориентированном режиме с объектными ссылками, чтобы нативные внешние интерфейсы на других платформах могли наблюдать объект и использовать преимущества шаблонов Observable?
Немного предыстории - концепция связывания данных используется в большинстве интерфейсных сред. В C # и Java это связано с признаком Observable, который дает классу возможность инициировать события, когда происходят изменения, на которые могут подписаться несколько элементов управления или «наблюдателей». Таким образом, наблюдатели не должны продолжать опрашивать / читать ресурс, сравнивая обновления.
Я хочу работать над механизмом анализа, который со временем вносит изменения в списки данных. Было бы неплохо, чтобы клиентский интерфейс мог наблюдать за этими списками во время анализа. Мне кажется, что для этого потребуется, чтобы клиентский интерфейс мог передавать объект в механизм анализа, написанный в библиотеке, которая, мы надеемся, является кроссплатформенной, и иметь возможность выполнять потоковое чтение для этого объекта. Или же, чтобы библиотека удовлетворяла договорам о наблюдаемости.
Способ, которым это обрабатывается в более старых движках CLI Unix-стиля, заключается в использовании stdin / stdout / stderr и регулярном обновлении движка. Это требует стандартных накладных расходов и разбора текста, которых я бы предпочел избежать, если это возможно.
источник
Ответы:
Вы можете создать уровень интеграции по модели вашей библиотеки, используя (например) интегрированную инфраструктуру Apache Camel. Компонент Netty, вероятно, может соответствовать вашим потребностям. С наблюдаемым шаблоном ваш уровень интеграции должен преобразовывать полученные изменения вашей модели и уведомлять их внешним абонентам. Другой аналогичный способ интерпретации вашего требования - подумать об архитектуре, управляемой событиями, в которой при изменении вашей модели прослушиватели-наблюдатели на вашем уровне интеграции публикуют сообщение в теме JMS, так что подключенные подписчики во внешних интерфейсах получат их.
источник
Я написал совершенно другой ответ, предполагая, что ваш издатель записывает обновления в очередь или канал - но затем я перечитал вопрос.
Если я правильно понимаю, ваш общий вопрос заключается в том, что вы хотите написать библиотеку для запуска в JRE, в которой собственный интерфейс может запрашивать состояние объектов Java поточно-ориентированным способом.
Это невероятно широк, потому что есть сотни способов взаимодействия внешнего интерфейса с библиотечным кодом, выполняющимся в JRE - JNI, EJB RPC, интерфейсы HTTP в стиле RPC, запрос-ответ через очереди сообщений и т. Д.
Что бы вы ни выбрали, в какой-то момент в цепочке должен быть вызов метода Java, и именно здесь вы получите контроль над безопасностью потоков. Там в вашем распоряжении целый арсенал инструментов для обеспечения безопасности нитей. Вы можете синхронизировать, возвращать защитные копии, работать с кэшированными данными и т. Д.
Однако подумайте, хотите ли вы следовать этой модели. Возможно, будет удобнее перейти к модели «не спрашивай, я расскажу тебе», в которой ваша библиотека помещает обновления в интерфейс, содержащие достаточную информацию, которая не требуется для запроса объектов.
источник