@Override
 public void send(Message<?> message) {
   SimpMessageHeaderAccessor headers = SimpMessageHeaderAccessor.wrap(message);
   String destination = headers.getDestination();
   destination = (destination != null) ? destination : getRequiredDefaultDestination();
   doSend(destination, message);
 }
 @Override
 public SimpMessageTypeMessageCondition getMatchingCondition(Message<?> message) {
   Object actualMessageType = SimpMessageHeaderAccessor.getMessageType(message.getHeaders());
   if (actualMessageType == null) {
     return null;
   }
   return this;
 }
  @Override
  protected void doSend(String destination, Message<?> message) {
    Assert.notNull(destination, "Destination must not be null");

    SimpMessageHeaderAccessor headers = SimpMessageHeaderAccessor.wrap(message);
    headers.setDestination(destination);
    headers.setMessageTypeIfNotSet(SimpMessageType.MESSAGE);
    message = MessageBuilder.withPayload(message.getPayload()).setHeaders(headers).build();

    long timeout = this.sendTimeout;
    boolean sent =
        (timeout >= 0)
            ? this.messageChannel.send(message, timeout)
            : this.messageChannel.send(message);

    if (!sent) {
      throw new MessageDeliveryException(
          message,
          "failed to send message to destination '" + destination + "' within timeout: " + timeout);
    }
  }
 @Override
 public int compareTo(SimpMessageTypeMessageCondition other, Message<?> message) {
   Object actualMessageType = SimpMessageHeaderAccessor.getMessageType(message.getHeaders());
   if (actualMessageType != null) {
     if (actualMessageType.equals(this.getMessageType())
         && actualMessageType.equals(other.getMessageType())) {
       return 0;
     } else if (actualMessageType.equals(this.getMessageType())) {
       return -1;
     } else if (actualMessageType.equals(other.getMessageType())) {
       return 1;
     }
   }
   return 0;
 }