Bahar

2015-01-31 31 views
14

kullanarak Websocket üzerinden istemciye mesaj gönderme Websocket ile Spring kullanmayı deneyin. Araştırmamı this tutorial ile başlattım. O inşaat büyükBahar

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); 
     }); 
    }); 
} 

, benim denetleyicisi şu sınıfta benim sürecini yapabiliyorum: Benim yan istemcisi olarak

Ben sunucusuna bağlantıyı başlatmak için böyle bir şey var

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

    @MessageMapping("/form") 
    @SendTo("/topic/greetings") 
    public Greeting validate(AddPhotosForm addPhotosForm) { 
     return new Greeting("Hello world !"); 
    } 
} 

Şimdi yapmak istediğim, istemciye "/ topic/greeting" mesajını dinleyen bir ileti gönderen bir iş parçacığı içeriyor. Bu gibi benim Runnable sınıf yazdı:

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(); 
      } 
     } 
    } 
} 

Ve böyle benim denetleyici tamamladı: istediğim ama hiçbir şey istemci tarafında olduğu gibi yöntem PhotoController.fireGreeting denir

@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"); 
    } 
} 

. Herhangi bir öneriniz var mı? Teşekkür ederim.

+9

okuyunuz [21.4.5 gönderme Mesajlar] (http://docs.spring.io/spring/docs/current/spring-framework-reference/html/: Doğru çözüm böyle bir şey yapmaktır Spring Websocket öğreticisinden websocket.html # websocket-stomp-handle-send). Bu kesinlikle böyle değil. Ayrıca ham iş parçacıklarını kullanmaktan ziyade, Spring [programlama mekanizması] (http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/scheduling/annotation/EnableScheduling.html) hakkında okuma yapmayı da düşünün (yanlış) . –

+0

Bağlantı için teşekkürler, tam olarak yapmak istediğim şey bu. Kullandığım iş parçacığı hakkında, kesinlikle uygulamamın son durumunda kullanmayacağım. Sunucu tarafında, hangi adımların zaten yapıldığını bilmesi için müşteriye bilgi gönderecek uzun bir sürecim var. – cheb1k4

cevap

30

Sorunumuzu @Boris the Spider sayesinde çözebildim.

@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

Teşekkürler, sen bana günümü saldın. –

+0

Özür dilerim, bu yaklaşım iplik güvenliği midir? – LeafiWan