2015-01-31 5 views
14

Ich versuche, Feder mit Websocket zu verwenden. Ich begann meine Untersuchung mit this tutorial.So senden Sie eine Nachricht an den Client über Websocket mit Spring

In meiner Seite Client Ich habe so etwas wie, dass die Verbindung zum Server zu initialisieren:

function connect() { 
    var socket = new SockJS('/myphotos/form'); 
    stompClient = Stomp.over(socket); 
    stompClient.connect({}, function(frame) { 
     setConnected(true); 
     console.log('Connected: ' + frame); 
     stompClient.subscribe('/topic/greetings', function(greeting){ 
      showGreeting(JSON.parse(greeting.body).content); 
     }); 
    }); 
} 

Es funktioniert gut, in meinem Controller der Lage bin, ich meinen Prozess in der folgenden Klasse zu tun:

Jetzt was ich tun möchte, ist es ein Thread senden eine Nachricht an den Client hören auf "/ Thema/Gruß". Ich schrieb meine Runnable Klasse wie folgt:

public class FireGreeting implements Runnable { 

    private PhotoController listener; 

    public FireGreeting(PhotoController listener) { 
     this.listener = listener; 
    } 

    @Override 
    public void run() { 
     while (true) { 
      try { 
       Thread.sleep(2000); 
       listener.fireGreeting(); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

Und fertig mein Controller wie folgt aus:

@Controller 
@RequestMapping("/") 
public class PhotoController { 

    @MessageMapping("/form") 
    @SendTo("/topic/greetings") 
    public Greeting validate(AddPhotosForm addPhotosForm) { 

     // added this part 
     FireGreeting r = new FireGreeting(this); 
     new Thread(r).start(); 

     return new Greeting("Hello world !"); 
    } 

    // added this method 
    @SendTo("/topic/greetings") 
    public Greeting fireGreeting() { 
     System.out.println("Fire"); 
     return new Greeting("Fire"); 
    } 
} 

Verfahren PhotoController.fireGreeting genannt wird, wie ich will, aber es ist nichts passiert auf der Client-Seite. Irgendwelche Vorschläge? Vielen Dank.

+9

Bitte lesen Sie [21.4.5 Senden von Nachrichten] (http://docs.spring.io/spring/docs/current/spring-framework-reference/html/ websocket.html # websocket-stomp-handle-send) aus dem Spring Websocket-Tutorial. Dies ist sicherlich nicht wie Sie es tun. Lesen Sie auch über Spring [Scheduling-Mechanismus] (http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/scheduling/annotation/EnableScheduling.html) anstatt rohe Threads (nicht korrekt) zu lesen. . –

+0

Vielen Dank für den Link, es ist genau das, was ich tun möchte. Über den Thread, den ich benutze, benutze ich ihn natürlich nicht im Endzustand meiner Anwendung. Ich habe einen langen Prozess in der Server-Seite, die Informationen an den Client sendet, um ihn wissen zu lassen, welche Schritte bereits erledigt sind. – cheb1k4

Antwort

30

Ich konnte mein Problem dank @Boris der Spider lösen. Die richtige Lösung ist, so etwas zu tun:

@Controller 
@RequestMapping("/") 
public class PhotoController { 

    @Autowired 
    private SimpMessagingTemplate template; 

    @MessageMapping("/form") 
    @SendTo("/topic/greetings") 
    public Greeting validate(AddPhotosForm addPhotosForm) { 

     FireGreeting r = new FireGreeting(this); 
     new Thread(r).start(); 

     return new Greeting("Hello world !"); 
    } 

    public void fireGreeting() { 
     System.out.println("Fire"); 
     this.template.convertAndSend("/topic/greetings", new Greeting("Fire")); 
    } 
} 
+0

Danke, Sie salben mir den Tag. –

+0

Entschuldigen Sie, ist diese Vorgehensweise Thread-Sicherheit? – LeafiWan

Verwandte Themen