Giriş
Şu satırı dahil ederiz
import org.springframework.messaging.handler.annotation.MessageMapping;
Örnek
Şöyle yaparız.
Örnek - @SendTo
@MessageMapping("${my.topic}")
public void receiveCommand(Message content) {
log.info("Received command: " + content);
}
Örnek - @SendTo
Şöyle yaparız
@Controllerpublic 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;}}
Ş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
Örnek - @SendToUser@Autowiredprivate SimpMessagingTemplate template;template.convertAndSend("/topic/greetings", "...");
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