18.4.2 为指定用户发送消息

除了 convertAndSend() 以外,SimpMessagingTemplate 还提供了 convertAndSendToUser() 方法。按照名字就可以判断出来,convertAndSendToUser() 方法能够让我们给特定用户发送消息。

为了阐述该功能,我们要在 Spittr 应用中添加一项特性,当其他用户提交的 Spittle 提到某个用户时,将会提醒该用户。例如,如果 Spittle 文本中包含 “@jbauer”,那么我们就应该发送一条消息给使用 “jbauer” 用户名登录的客户端。如下程序清单中的 broadcastSpittle() 方法使用了 convertAndSendToUser(),从而能够提醒所谈论到的用户。

程序清单 18.9 convertAndSendToUser() 能够发送消息给特定用户
package spittr;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.simp.SimpMessagingTemplate;
import org.springframework.stereotype.Service;

@Service
public class SpittleFeedServiceImpl implements SpittleFeedService {

  private SimpMessagingTemplate messaging;
  private Pattern pattern = Pattern.compile("\\@(\\S+)");
	
  @Autowired
  public SpittleFeedServiceImpl(SimpMessagingTemplate messaging) {
	this.messaging = messaging;
  }
	
  public void broadcastSpittle(Spittle spittle) {
	messaging.convertAndSend("/topic/spittlefeed", spittle);
		
	Matcher matcher = pattern.matcher(spittle.getMessage());
	if (matcher.find()) {
      String username = matcher.group(1);
	  messaging.convertAndSendToUser(username, 
	    "/queue/notifications",
	    new Notification("You just got mentioned!"));
	}
  }
}

在 broadcastSpittle() 中,如果给定 Spittle 对象的消息中包含了类似于用户名的内容(也就是以 “@” 开头的文本),那么一个新的 Notification 将会发送到名为 “/queue/notifications” 的目的地上。因此,如果 Spittle 中包含 “@jbauer” 的话,Notification 将会发送到 “/user/jbauer/queue/notifications” 目的地上。

Last updated