Поддерживают ли классы в библиотеке JRE наблюдаемые и / или асинхронные чтения из внешних / не JRE сборок?

12

Как я могу реализовать свою кроссплатформенную библиотеку (например, на JRE), чтобы работать в поточно-ориентированном режиме с объектными ссылками, чтобы нативные внешние интерфейсы на других платформах могли наблюдать объект и использовать преимущества шаблонов Observable?

Немного предыстории - концепция связывания данных используется в большинстве интерфейсных сред. В C # и Java это связано с признаком Observable, который дает классу возможность инициировать события, когда происходят изменения, на которые могут подписаться несколько элементов управления или «наблюдателей». Таким образом, наблюдатели не должны продолжать опрашивать / читать ресурс, сравнивая обновления.

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

Способ, которым это обрабатывается в более старых движках CLI Unix-стиля, заключается в использовании stdin / stdout / stderr и регулярном обновлении движка. Это требует стандартных накладных расходов и разбора текста, которых я бы предпочел избежать, если это возможно.

Брэндон Арнольд
источник
2
Как правило, лучше сделать основной вопрос немного более узким, чем «Возможно ли X?», Поскольку правильный ответ на этот вопрос почти всегда «Да, если вы стараетесь изо всех сил». Похоже, вы действительно хотите спросить: «Как я могу сделать X без накладных расходов на stdin / stdout?» В таком случае, почему бы просто не использовать статически или динамически связанную библиотеку? Нужно ли вам, чтобы эта библиотека была отдельной программой от пользовательского интерфейса по какой-то причине?
Иксрек
Спасибо, Иксрек. Как вы думаете, я сформулировал это так, как вы предлагаете в моем названии? Причина, по которой я хотел бы, чтобы библиотека была переносимой, а интерфейс - родным, заключается в том, что я думаю, что собственные структуры пользовательского интерфейса в целом работают лучше (с учетом мнения!), Но я не хочу писать логику движка дважды ,
Брэндон Арнольд
Почему статически или динамически связанная библиотека не может быть переносимой? Re: заголовок, это пример из «слишком широкого» вопроса из учебника; Я не сосредоточился на этом, потому что в остальной части вашего вопроса, казалось, были более конкретные вопросы.
Иксрек
@Ixrec Может. Вопрос предполагает, что это библиотека, которая включает в себя эти возможности. Я просто хотел бы убедиться, что любые приложения, которые используют эту библиотеку, смогут наблюдать ссылки на объекты, которые передаются ей асинхронно, пока они работают.
Брэндон Арнольд
1
@Ixrec Я обновил название, чтобы оно стало менее широким
Брэндон Арнольд

Ответы:

1

Вы можете создать уровень интеграции по модели вашей библиотеки, используя (например) интегрированную инфраструктуру Apache Camel. Компонент Netty, вероятно, может соответствовать вашим потребностям. С наблюдаемым шаблоном ваш уровень интеграции должен преобразовывать полученные изменения вашей модели и уведомлять их внешним абонентам. Другой аналогичный способ интерпретации вашего требования - подумать об архитектуре, управляемой событиями, в которой при изменении вашей модели прослушиватели-наблюдатели на вашем уровне интеграции публикуют сообщение в теме JMS, так что подключенные подписчики во внешних интерфейсах получат их.

AlexCG
источник
0

Я написал совершенно другой ответ, предполагая, что ваш издатель записывает обновления в очередь или канал - но затем я перечитал вопрос.

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

Это невероятно широк, потому что есть сотни способов взаимодействия внешнего интерфейса с библиотечным кодом, выполняющимся в JRE - JNI, EJB RPC, интерфейсы HTTP в стиле RPC, запрос-ответ через очереди сообщений и т. Д.

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

Однако подумайте, хотите ли вы следовать этой модели. Возможно, будет удобнее перейти к модели «не спрашивай, я расскажу тебе», в которой ваша библиотека помещает обновления в интерфейс, содержащие достаточную информацию, которая не требуется для запроса объектов.

стройное
источник
Дополнительный комментарий - вы рассматривали возможность использования Redis (или аналогичного) в качестве посредника между вашими передними и задними группами?
худенький