JRE 라이브러리의 클래스가 외부 / JRE 이외의 어셈블리에서 관찰 가능 및 / 또는 비동기 읽기를 지원합니까?


12

다른 플랫폼의 네이티브 프론트 엔드가 객체를 관찰하고 Observable 패턴을 활용할 수 있도록 객체 플랫폼에서 스레드 안전 방식으로 작동하도록 크로스 플랫폼 라이브러리 (예 : JRE)를 어떻게 구현할 수 있습니까?

약간의 배경 지식-대부분의 프론트 엔드 프레임 워크에 사용되는 데이터 바인딩 개념이 있습니다. C # 및 Java에서 이는 여러 컨트롤 또는 "관찰자"가 구독 할 수있는 변경이 발생할 때 이벤트를 발생시키는 클래스 기능을 클래스에 제공하는 Observable 특성과 관련됩니다. 이런 식으로 관찰자는 업데이트를 비교하면서 리소스를 계속 폴링 / 읽지 않아도됩니다.

시간이 지남에 따라 데이터 목록을 변경하는 분석 엔진에서 작업하고 싶습니다. 분석이 실행되는 동안 프런트 엔드가 이러한 목록을 관찰 할 수있게하는 것이 좋습니다. 이것은 프론트 엔드가 객체를 분석 엔진에 전달하고, 플랫폼 간 라이브러리에 작성되어 해당 객체를 스레드로부터 안전하게 읽을 수 있어야한다고 생각합니다. 그렇지 않으면 라이브러리가 관찰 가능성 계약을 충족 시키도록하십시오.

이전 Unix 스타일 CLI 엔진에서이를 처리하는 방법은 stdin / stdout / stderr을 사용하고 정기적 간격으로 엔진을 업데이트하는 것입니다. 이것은 가능하면 피하기 위해 표준 오버 헤드 및 텍스트 구문 분석이 필요합니다.


2
핵심 질문은 "X는 가능합니까?"보다 약간 좁게 만드는 것이 가장 좋습니다. 정답은 거의 항상 "그렇습니다. 충분히 노력하면"입니다. "stdin / stdout의 오버 헤드없이 X를 어떻게 할 수 있습니까?"라고 물어보고 싶은 것 같습니다. 그렇다면 정적 또는 동적으로 연결된 라이브러리를 사용하는 것이 어떻습니까? 어떤 이유로이 라이브러리가 UI와 별도의 프로그램이어야합니까?
Ixrec

고마워, Ixrec. 내 제목에서 제안한 방식으로 내가 말한 것 같아? 라이브러리를 이식 ​​가능하고 프론트 엔드를 네이티브로 만들고 싶은 이유는 네이티브 UI 프레임 워크가 일반적으로 더 잘 작동한다고 생각하기 때문입니다 (의견 경고!).하지만 엔진의 논리를 두 번 쓰고 싶지 않습니다. .
Brandon Arnold

정적으로 또는 동적으로 연결된 라이브러리를 이식성이없는 이유는 무엇입니까? Re : 제목은 "너무 광범위한"질문의 교과서 예입니다. 나머지 질문에는 더 구체적인 질문이있는 것처럼 보였으므로 집중하지 않았습니다.
Ixrec

@Ixrec 가능합니다. 질문은 그것이 가능성을 포함하는 라이브러리라고 가정합니다. 이 라이브러리를 사용하는 모든 응용 프로그램이 작동하는 동안 비동기 적으로 전달되는 객체에 대한 참조를 관찰 할 수 있는지 확인하고 싶습니다.
Brandon Arnold

1
내가 제목을 업데이트 한 @Ixrec 덜 광범위한 할 수
브랜든 아놀드

답변:


1

예를 들어 아파치 낙타 통합 프레임 워크를 사용하여 라이브러리 모델에 통합 티어를 작성할 수 있습니다. Netty 구성 요소는 아마도 귀하의 요구에 맞을 수 있습니다. 관찰 가능한 패턴으로 통합 계층은 모델의 수신 된 변경 사항을 변환하고이를 프런트 엔드 가입자에게 알려야합니다. 요구 사항을 해석하는 다른 유사한 방법은 모델이 변경 될 때 통합 계층의 관찰자 리스너가 JMS 주제에 메시지를 게시하여 프런트 엔드의 연결된 첨자가 메시지를 수신하는 이벤트 중심 아키텍처를 생각하는 것입니다.


0

게시자가 대기열 또는 파이프에 업데이트를 작성한다고 제안하는 완전히 다른 답변을 작성했지만 질문을 다시 읽습니다.

올바르게 이해한다면 일반적인 프론트 엔드가 스레드 안전 방식으로 Java 객체의 상태를 쿼리 할 수있는 JRE에서 실행할 라이브러리를 작성하고 싶다는 것이 일반적인 질문입니다.

프론트 엔드가 JRE에서 실행되는 라이브러리 코드 (JNI, EJB RPC, RPC 스타일 HTTP 인터페이스, 메시지 큐에 대한 요청-응답 등)와 상호 작용할 수있는 수백 가지 방법이 있기 때문에 이는 엄청나게 광범위합니다.

어느 쪽을 선택하든 체인의 어느 시점에서 Java 메소드 호출이 있어야하며 스레드 안전을 제어해야합니다. 거기에, 당신은 당신의 처분에 스레드 안전 도구의 전체 무기고가 있습니다. 동기화, 방어 복사본 반환, 캐시 된 데이터 작업 등을 수행 할 수 있습니다.

그러나이 모델이 따르려는 모델인지 고려하십시오. 라이브러리가 개체를 쿼리 할 필요가없는 충분한 정보가 포함 된 업데이트를 프런트 엔드로 푸시하는 "묻지 말고 말해 줄 것"모델로 이동하는 것이 더 깨끗할 수 있습니다.


추가 의견-프론트 엔드와 백 엔드 사이의 중개자로 Redis (또는 유사한)를 사용하는 것을 고려 했습니까?
날씬한
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.