31 Mayıs 2018 Perşembe

SpringStomp @MessageMapping Anotasyonu - Stomp İstemcisi Tarafından Gönderilen JSON Mesajını Okur

Giriş
Şu satırı dahil ederiz
import org.springframework.messaging.handler.annotation.MessageMapping;
Örnek
Şöyle yaparız.
@MessageMapping("${my.topic}")
public void receiveCommand(Message content) {
    log.info("Received command: " + content);
}
Örnek  - @SendTo
Şöyle yaparız
@Controller
public class ChatController {

  @MessageMapping("/chat.register")
  @SendTo("/topic/public")
  public ChatMessage register(@Payload ChatMessage chatMessage,
SimpMessageHeaderAccessor headerAccessor) {
    headerAccessor.getSessionAttributes().put("username", chatMessage.getSender());
    return chatMessage;
  }

  @MessageMapping("/chat.send")
  @SendTo("/topic/public")
  public ChatMessage sendMessage(@Payload ChatMessage chatMessage) {
    return chatMessage;
  }
}
Örnek - @SendTo
Şu satırı dahil ederiz
import org.springframework.messaging.handler.annotation.SendTo;
1. Broker açılırken enableSimpleBroker() metodunda tüm kullanıcılara göndermek için "/topic", bazı kullanıcılara göndermek için "/queue" şeklinde ayarlanmalıdır. Açıklaması şöyle
... there are two destination prefixes defined: topic and queue. They follow the convention that destinations for messages to be carried on to all subscribed clients via the pub-sub model should be prefixed with topic. On the other hand, destinations for private messages are typically prefixed by queue.
2. Broker açılırken setApplicationDestinationPrefixes() metoduna "/app" değeri geçilir. Bu parametrenin açıklaması şöyle. Tarayıcı mesajı "/app/hello" adresine gönderir.
Defines the prefix app that is used to filter destinations handled by methods annotated with @MessageMapping which you will implement in a controller. The controller, after processing the message, will send it to the broker.
Broker yaratmak için AbstractWebSocketMessageBrokerConfigurer yazısına bakabilirsiniz

3. @SendTo("/topic/greetings") şeklinde olmalıdır. Tarayıcıların "/topic/greetings" adresini dinliyor olması gerekir

Şöyle yaparız. Burada @SendTo ile metod sonucunda döndürülen Greeting nesnesi tüm kullanıcılara gönderiliyor. Tarayıcıların "/topic/greetings" adresini dinliyor olması gerekir. Ayrıca HelloMessage ve Greeting sınıflarının JSON'a dönüştürülebiliyor olması gerekir.
@Controller
public class GreetingController {

  @MessageMapping("/hello")
  @SendTo("/topic/greetings")
  public Greeting greeting(HelloMessage message) throws InterruptedException {
    return new Greeting("Hello, " + message.getName() + "!");
  }
}
Broker şöyle yaratılır. Tarayıcı mesajı "/app/hello" adresine gönderir.
@Configuration
@EnableWebSocketMessageBroker
public class HelloWebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {

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

  public void registerStompEndpoints(StompEndpointRegistry registry) {
    registry.addEndpoint("/hello").withSockJS();
  }
}
Eğer @SendTo kullanmak istemiyorsak şu satırı dahil ederiz
import org.springframework.messaging.simp.SimpMessagingTemplate;
Şöyle yaparız
@Autowired
private SimpMessagingTemplate template;

template.convertAndSend("/topic/greetings", "...");
Örnek - @SendToUser
Açıklaması şöyle. Yani istemcinin önce login olması gerekir.
Spring makes sending private messages a lot easier. We only need to annotate a Controller’s method with @SendToUser. Then, this destination will be handled by UserDestinationMessageHandler, which relies on a session identifier. On the client-side, when a client subscribes to a destination prefixed with /user, this destination is transformed into a destination unique for this user. On the server-side, a user destination is resolved based on a user’s Principal.
Şöyle yaparız. Tarayıcının "/user/queue/greetings" adresini dinliyor olması gerekir.
@MessageMapping("/greetings")
@SendToUser("/queue/greetings")
public String reply(@Payload String message, Principal user) {
 return  "Hello " + message;
}

Hiç yorum yok:

Yorum Gönder