2016-05-18 9 views
25

私は春のブートと一般的な春にちょっと新しいです。私はプロジェクトに投げ込まれ、私の足を濡らすための最初の "運動"は、フロントエンドでwebsocketプッシュ通知によって自動的に更新される簡単なニュースフィード機能を作成することです。関与Springbootでスケジュールされたwebsocketプッシュ

技術は、次のとおり一般的なフロントエンド・アプリケーションのための

  • 角度メッセージ・ブローカ
  • Springboot WebSocketを
  • をからのメッセージを受信するためのWebSocket通信webosocket上
  • ストンプを作成するため
  • SockJS
  • Stomp Message Broker(Java関連のフレームワーク)

私は、フロントエンドに達成したいことは次のとおりです。

  1. ビューが
  2. は私のクライアントは、それに加入していることのWebSocketを使用してのストンプ・プロバイダーを作成しますロードされているのWebSocket接続を作成します
  3. キャッチサーバは、メッセージをプッシュし、角度ビュー

限り、サーバ側コードとして更新:

  1. 設定のWebSocketのものと接続
  2. を管理するには、(エグゼキュータまたは@Scheduled経由?)サーバープッシュメッセージの時間のすべてのX量を持っています。

これまでのところ、サーバーサイドコードの最後の部分を除いてすべてを達成したと思います。次の例では、全二重モードでwebsocketを使用し、クライアントが何かを送信すると、サーバーはすぐにメッセージキューに応答し、すべてのサブスクライブされたクライアントが更新されます。しかし、私が望むのは、クライアントがリクエストを待つことなくサーバ自体がStomp以上のものを送ることです。

最初に私は春@Controllerを作成し、それに@SendTo("/my/subscribed/path")アノテーションを付けてメソッドを追加しました。しかし、私はどのようにそれを引き起こすのか分かりません。また、私は@Scheduledを追加しようとしましたが、この注釈はvoidの戻り値の型(およびNewsMessageオブジェクトを返しています)のメソッドでのみ機能します。

私が必要とするのは、クライアントがWebSocket接続を初期化してから、サーバーが一定の間隔でメッセージをプッシュした後です(またはイベントがトリガされたときには今は問題ありません)。また、新しいクライアントはすべて同じメッセージキューをリッスンし、同じメッセージを受信する必要があります。

+0

あなたはGithubで多分孤独ですか? –

+0

Spring Framework :: [WebSocketを使ってインタラクティブなWebアプリケーションを構築する](http://spring.io/guides/gs/messaging-stomp-websocket/) – Dun0523

答えて

28

ファーストを参照してください。

  <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-websocket</artifactId> 
      <version>${org.springframework-version}</version> 
     </dependency> 

次に、設定を適切に行う必要があります。私はシンプルなブローカーから始めることをお勧めします。

@Configuration 
@EnableWebSocketMessageBroker 
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { 

    @Override 
    public void registerStompEndpoints(StompEndpointRegistry registry) { 
     registry.addEndpoint("/portfolio").withSockJS(); 
    } 

    @Override 
    public void configureMessageBroker(MessageBrokerRegistry config) { 
     config.setApplicationDestinationPrefixes("/app"); 
     config.enableSimpleBroker("/topic", "/queue"); 
    } 

} 

コントローラは次のようになります。 AngularJsアプリが「/ portfolio」の接続を開き、このチャンネルへの登録を/topic/greeetingに送信すると、これがコントローラで受信され、すべての購読ユーザーに応答します。

あなたのスケジューラの質問について
@Controller 
public class GreetingController { 

    @MessageMapping("/greeting") 
    public String handle(String greeting) { 
     return "[" + getTimestamp() + ": " + greeting; 
    } 
} 

、あなたが設定を経由して、それを有効にする必要があります

@Configuration 
@EnableScheduling 
public class SchedulerConfig{} 

し、それをスケジュール:

@Component 
public class ScheduledUpdatesOnTopic{ 

    @Autowired 
    private SimpMessagingTemplate template; 

    @Scheduler(fixedDelay=300) 
    public void publishUpdates(String text){ 
     template.convertAndSend("/topic/greetings", text); 
    } 
} 

はこの何とか明確な概念と手順が取られる必要があるホープ物事をあなたのために働かせる。

+0

は/ topic/greetingをこのパートで述べるべきではありません。 "このチャンネル/トピック/ギグにサブスクリプションを送信すると、コントローラでこれを受信し、購読したすべてのユーザーに応答します"というのは/ app/greetingでしょうか? – HopeKing

+0

一般的には、誰かがリクエストした後、定期的に全員に「挨拶」を送信し、一方のユーザには「挨拶」で応答するつもりでした。 – RMachnik

6

まず、サブスクリプションなしでクライアントにメッセージを送信(プッシュ)することはできません。

第2に、すべてのサブスクライバにメッセージを送信するには、topic抽象化サイドを参照する必要があります。

これはSTOMPの基本です。

@Scheduledであれば問題ありませんが、後でプッシュするためにSTOMPブローカにメッセージを送信するには、SimpMessagingTemplateを注入するだけで済みます。

また、あなたがカントーあなたwebsocketはあなたがたとえば、あなたのpom.xml

で依存関係が最も重要なものに従っていることを確認してください前に、春には有効になっている必要があるすべてのSpring WebSockets XML configuration not providing brokerMessagingTemplate

+2

この簡単なセクションから始めてもいいですが、私のプロジェクトでは、質問を投稿した後に使用したと思っていた「ログアウト」メッセージを送信するためのSimpMessagingTemplateをすでに使用していました)他の人にもっと役立つかもしれないので、 – Konstantine

関連する問題