RabbitMQ, Spring, STOMP, Как отправить сообщение пользователю и себе, чтобы сделать приватный разговор - PullRequest
0 голосов
/ 14 января 2020

Я новичок в RabbitMQ и Spring, и я разрабатываю чат, в котором пользователи могут публиковать сообщения как в темах, на которые они подписаны, так и в личных сообщениях для определенных c пользователей. Я использую протокол Stomp. Выбор пользователя, которому вы хотите отправить сообщение, зависит от выбора имени и отправки этого имени в теле сообщения. Метод do аннотирует @MessageMapping. Метод Given затем вызывает rabbitTemplate.convertAndSend с ключом маршрутизации параметров в качестве имени пользователя с обменом по умолчанию. согласно документации:

Для фреймов SEND общая очередь создается при первой SEND на это место назначения в этом сеансе, но не впоследствии. Сообщение отправляется на обмен по умолчанию с ключом маршрутизации.

stompClient.subscribe('/queue/'+ author, function (greeting) {
                var divId = "#privateinfo"; 
                console.log("SENDING TO TOPIC/GREETING")
                showGreeting(divId, JSON.parse(greeting.body).person,
                JSON.parse(greeting.body).message);
                }, {id: author});

function sendPrivate(receiver) {    
    //console.log("This is thread from private: " + receiver);
    stompClient.send("/app/private", {}, JSON.stringify({ 
        'person': author,
        'to': receiver,
        'message': $("#message").val() }));
}

Где «автор» - это имя пользователя, с которым я соединяюсь в чате, и «получатель» - человек, выбранный кнопкой. Я отправляю сообщения следующим образом:

@MessageMapping("/private")
  public MessageTemplate send2(MessageTemplate messageTemp) throws Exception {
      MessageTemplate privateMessage = new MessageTemplate(messageTemp.getPerson(),
              messageTemp.getMessage(), 
              messageTemp.getTo());
      rabbitTemplate.convertAndSend("", 
              messageTemp.getTo() , privateMessage);

      rabbitTemplate.convertAndSend("", 
              messageTemp.getPerson() , privateMessage);

      return privateMessage;
  }
public class MessageTemplate {

    private String person;
    private String message;
    private String to;

    public String getPerson() {
        return person;
    }
    public String getMessage() {
        return message;
    }
    public String getTo() {
        return to;
    }


    public MessageTemplate(@JsonProperty("person") String person,
            @JsonProperty("message") String message,
            @JsonProperty("to") String to) {
        this.person = person;
        this.message = message;
        this.to = to;
    }

}

Чего я хотел бы добиться, так это отправить личное сообщение в новом окне и получить то же самое сообщение для двунаправленного разговора в окне. К настоящему времени я могу сделать это только дважды, вызывая метод convertAndSend, просто меняя ключ маршрутизации. Есть ли более удобный способ для достижения этой цели?

...