As classes em uma biblioteca JRE suportam leituras observáveis ​​e / ou assíncronas de montagens externas / não JRE?


12

Como posso implementar minha biblioteca de plataforma cruzada (por exemplo, no JRE) para operar de maneira segura em threads em referências a objetos, para que front-ends nativos em outras plataformas possam observar o objeto e tirar proveito dos padrões Observáveis?

Um pouco de experiência - existe um conceito de ligação de dados usado na maioria das estruturas de front-end. Em C # e Java, isso está relacionado à característica Observable, que dá a uma classe a capacidade de acionar eventos quando ocorrem mudanças, nas quais vários controles ou "observadores" podem se inscrever. Dessa forma, os observadores não precisam continuar pesquisando / lendo o recurso, comparando para obter atualizações.

Quero trabalhar em um mecanismo de análise que faça alterações nas listas de dados ao longo do tempo. Seria bom que o front-end pudesse observar essas listas enquanto a análise está sendo executada. Parece-me que isso exigiria que o front-end pudesse passar um objeto para o mecanismo de análise, escrito em uma biblioteca que, esperançosamente, é multiplataforma e capaz de fazer leituras seguras de threads para esse objeto. Ou então, peça à biblioteca que cumpra contratos de observabilidade.

A maneira como isso é tratado nos mecanismos CLI mais antigos do estilo Unix é usar stdin / stdout / stderr, e fazer com que o mecanismo publique atualizações em intervalos regulares. Isso requer uma sobrecarga padrão e uma análise de texto que eu preferiria evitar, se possível.


2
Geralmente, é melhor tornar a pergunta principal um pouco mais restrita que "É possível X?", Já que a resposta correta é quase sempre "Sim, se você se esforçar o suficiente". Parece que você realmente quer perguntar "Como posso fazer o X sem a sobrecarga do stdin / stdout?" Nesse caso, por que não usar simplesmente uma biblioteca vinculada estaticamente ou dinamicamente? Você precisa que esta biblioteca seja um programa separado da interface do usuário por algum motivo?
— Ixrec 25/08/2015

Obrigado, Ixrec. Você acha que eu o expressei da maneira que você sugere no meu título? O motivo pelo qual eu gostaria que a biblioteca fosse portátil e o front-end fosse nativo é porque acho que as estruturas de UI nativas geralmente funcionam melhor (alerta de opinião!), Mas não quero escrever a lógica do mecanismo duas vezes .
— Brandon Arnold

Por que uma biblioteca vinculada estaticamente ou dinamicamente não pode ser portátil? Re: O título, que é um exemplo de livro didático de uma pergunta "muito ampla"; Não foquei nisso porque parecia haver perguntas mais específicas no restante da sua pergunta.
— Ixrec

@Ixrec It can. A pergunta assume que é uma biblioteca, que inclui essas possibilidades. Gostaria apenas de garantir que todos os aplicativos que consomem essa biblioteca possam observar referências a objetos que são passados ​​para ela de forma assíncrona, enquanto estão sendo operados.
— Brandon Arnold

1
@Ixrec Atualizei o título para ser menos amplo #
— Brandon Arnold

Respostas:


1

Você pode criar uma camada de integração sobre o modelo da sua biblioteca usando (por exemplo) a estrutura de integração do apache camel. O componente Netty provavelmente pode atender às suas necessidades. Com um padrão observável, sua camada de integração deve transformar as alterações recebidas do modelo e notificá-las aos assinantes front-end. Outra maneira semelhante de interpretar seus requisitos é pensar em uma arquitetura orientada a eventos em que, quando seu modelo for alterado, os ouvintes observadores em sua camada de integração publiquem uma mensagem em um Tópico JMS para que os subscritores conectados nos front-ends os recebam.


0

Eu escrevi uma resposta completamente diferente, sugerindo que seu editor grave atualizações em uma fila ou um cachimbo - mas, então, reli a pergunta.

Se bem entendi, sua pergunta geral é que você deseja escrever uma biblioteca para executar no JRE, na qual um front-end nativo pode consultar o estado dos objetos Java de uma maneira segura para threads.

Isso é incrivelmente amplo, pois existem centenas de maneiras pelas quais um front-end pode interagir com o código da biblioteca em execução em interfaces JRE - JNI, EJB RPC, HTTP no estilo RPC, resposta de solicitação sobre filas de mensagens etc.

Qualquer que seja a sua escolha, em algum momento da cadeia, deve haver uma chamada de método Java, e é aí que você assume o controle da segurança de threads. Lá, você tem todo o arsenal de ferramentas de segurança de linha à sua disposição. Você pode sincronizar, pode devolver cópias defensivas, trabalhar com dados em cache, etc.

No entanto, considere se este é o modelo que você deseja seguir. Pode ser mais fácil mudar para um modelo "não me pergunte, eu vou lhe dizer", no qual sua biblioteca envia atualizações para o front-end contendo informações suficientes para que não seja necessário consultar os objetos.


Comentário extra - você já pensou em usar o Redis (ou similar) como um intermediário entre o front e o back-end?
— slim
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.