문제

GWT에서 JSON Objects 스트림으로 "구독"하고 한 번에 가져 오려고 시도하지 않고도 계속 연결되는 이벤트를 듣는 방법이 있습니까? 나는이 기술에 대한 Buthword-Du-Jour가 "혜성"이라고 생각합니다.

http 서비스가 있다고 가정 해 보겠습니다.

{"symbol": "AAPL", "bid": "88.84", "ask":"88.86"}
{"symbol": "AAPL", "bid": "88.85", "ask":"88.87"}
{"symbol": "IBM", "bid": "87.48", "ask":"87.49"}
{"symbol": "GOOG", "bid": "305.64", "ask":"305.67"}
...

이 이벤트를 듣고 GWT 구성 요소 (테이블, 레이블)를 실시간으로 업데이트해야합니다. 어떻게하는지 아이디어가 있습니까?

도움이 되었습니까?

해결책

Streamhub에 대한 GWT 혜성 모듈이 있습니다.

http://code.google.com/p/gwt-comet-streamhub/

스트림 hub 무료 커뮤니티 에디션이있는 혜성 서버입니다. 행동하는 예가 있습니다 여기.

Streamhub Comet Server를 다운로드하고 새 SubscriptionListener를 작성하고 Stockdemo 예제를 시작점으로 사용한 다음 새 JSONPAYLOAD를 작성하여 데이터를 스트리밍해야합니다.

Payload payload = new JsonPayload("AAPL");
payload.addField("bid", "88.84");
payload.addField("ask", "88.86");
server.publish("AAPL", payload);
...

Google 코드 사이트에서 JAR을 다운로드하여 GWT Projects ClassPath에 추가하고 포함 포함 GWT 모듈에 추가하십시오.

<inherits name="com.google.gwt.json.JSON" />
<inherits name="com.streamhub.StreamHubGWTAdapter" />

GWT 코드를 연결하고 구독하십시오.

StreamHubGWTAdapter streamhub = new StreamHubGWTAdapter();
streamhub.connect("http://localhost:7979/");
StreamHubGWTUpdateListener listener = new StockListener();
streamhub.subscribe("AAPL", listener);
streamhub.subscribe("IBM", listener);
streamhub.subscribe("GOOG", listener);
...

그런 다음 업데이트 리스너 (GWT 코드에서도)에서 마음에 드는 업데이트를 처리합니다.

public class StockListener implements StreamHubGWTUpdateListener {
      public void onUpdate(String topic, JSONObject update) {
          String bid = ((JSONString)update.get("bid")).stringValue();
          String ask = ((JSONString)update.get("ask")).stringValue();
          String symbol = topic;
          ...
      }
}

GWT 프로젝트 메인 HTML 페이지에 StreamHub-Min.js를 포함시키는 것을 잊지 마십시오.

다른 팁

나는이 기술을 몇 가지 프로젝트에서 사용했지만 문제가 있습니다. 나는 GWT-RPC를 통해서만 특별히 수행했지만 데이터를 처리하는 데 사용하는 메커니즘에 대해 원리는 동일합니다. 정확히 무엇을하고 있는지에 따라, 복잡한 일을 과도하게 필요로하지 않을 수 있습니다.

우선, 클라이언트 측에서 GWT가 모든 종류의 스트리밍 데이터를 올바르게 지원할 수 있다고 생각하지 않습니다. 클라이언트가 실제로 데이터를 처리하기 전에 연결이 닫혀 있어야합니다. 이것이 서버 푸시 관점에서 의미하는 바는 클라이언트가 서버에 연결하고 데이터를 사용할 수있을 때까지 블록이 반환 될 때까지 의미합니다. 완성 된 연결에서 실행되는 모든 코드는 서버와 새로운 연결을 즉시 다시 열어 더 많은 데이터를 기다려야합니다.

사물의 서버 측에서 새로운 데이터를 사용할 수있을 때까지 대기주기 (Java Concurrent 패키지는 특히 블록 및 타임 아웃에 편리합니다). 이 시점에서 서버는 데이터 패키지를 클라이언트로 반환하여 그에 따라 업데이트 할 수 있습니다. 데이터 흐름의 모습에 따라 많은 고려 사항이 있지만 다음은 다음과 같이 생각할 몇 가지가 있습니다.

  • 클라이언트가 모든 단일 업데이트를 중요하게 생각합니까? 그렇다면 서버는 클라이언트가 일부 데이터를 가져온 다음 다시 연결하는 시간간에 잠재적 이벤트를 캐시해야합니다.
  • 업데이트가 될까요? 이 경우 클라이언트가 한 번에 하나의 업데이트를받지 않고 여러 초마다 한 번에 한 번에 한 번에 덩어리를 푸시하는 것이 더 현명 할 수 있습니다.
  • 서버는 클라이언트가 해당 클라이언트를 위해 엄청난 양의 캐시 패키지를 쌓지 않기 위해 클라이언트가 사라 졌는지 감지하는 방법이 필요할 것입니다.

서버 푸시 접근 방식에 두 가지 문제가 있음을 알았습니다. 많은 클라이언트가 있으면 웹 서버에서 많은 개방형 연결을 의미합니다. 문제의 웹 서버에 따라 많은 스레드가 생성되고 열려 있음을 의미 할 수 있습니다. 두 번째는 도메인 당 일반적인 브라우저의 2 개의 요청 제한과 관련이 있습니다. 이미지, CSS 및 기타 정적 컨텐츠를 제 2 레벨 영역에서 제공 할 수 있다면이 문제를 완화 할 수 있습니다.

실제로 GWT를위한 Cometd와 같은 도서관이 있습니다. http://code.google.com/p/gwteventservice/

그러나 나는 개인적으로 그것을 사용하지 않았으므로, 그것이 좋은지 아닌지에 대해 보증 할 수는 없지만, doco는 꽤 좋아 보인다. 시도해 볼 가치가 있습니다.

내가 본 몇 가지 다른 것들이 있습니다. GWT-Rocket의 COMETD 도서관.

GWT를위한 혜성 구현에 대한 예비 아이디어를 찾을 수 있습니다. 여기... 더 성숙한 것이 있는지 궁금합니다.

또한 GWT/Comet Integration에 대한 통찰력이 있습니다. 거기, 더 많은 절단 및 블로딩 엣지 기술 사용 : "Jetty Continuations". 살펴볼 가치가 있습니다.

여기 IBM WebSphere Application Server에 대한 방법에 대한 설명 (일부 소스 샘플 포함)을 찾을 수 있습니다. 부두 나 다른 혜성 지원 J2EE 서버와 너무 다르지 않아야합니다. 간략하게, 아이디어는 다음과 같습니다. Java 객체를 GWT RPC를 통해 JSON 문자열로 인코딩 한 다음 COCETD를 사용하여 DOJO가 수신 한 COMETD를 사용하여 jsni 코드를 트리거하여 위젯 메소드를 호출하는 객체를 요구합니다. 다시 GWT RPC를 사용합니다. 짜잔! :)

이 설정에 대한 나의 경험은 긍정적이며, 보안 문제를 제외하고는 문제가 없었습니다. 이 경우 혜성에 대한 보안을 구현하는 방법은 확실하지 않습니다 ... 혜성 업데이트 서블릿에는 다른 URL이 있어야하고 J2EE 보안을 적용 할 수 있습니다.

Jboss Errai 프로젝트에는 COCETD에 대한 좋은 대안을 제공하는 양방향 메시징을 제공하는 메시지 버스가 있습니다.

우리는 분위기 Framewrok을 사용하고 있습니다.http://async-io.org/) GWT asplication에서 ServerPush/Comet의 경우.

클라이언트 측 프레임 워크에는 GWT 통합이 매우 간단합니다. 서버 측면에서는 일반 서블릿을 사용합니다.

우리는 현재 클러스터 환경에서 1000 개 이상의 동의 사용자와 함께 생산에 사용하고 있습니다. 우리는 분위기 소스를 수정하여 해결해야 할 몇 가지 문제가있었습니다. 또한 문서가 정말 얇습니다.

프레임 워크는 무료로 사용할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top