Avoid unnecessary String concatenation in StompSubProtocolHandler
Issue: SPR-14624
This commit is contained in:
parent
bbc85ea466
commit
56b197bce1
|
@ -43,7 +43,6 @@ import org.springframework.messaging.simp.stomp.StompCommand;
|
||||||
import org.springframework.messaging.simp.stomp.StompDecoder;
|
import org.springframework.messaging.simp.stomp.StompDecoder;
|
||||||
import org.springframework.messaging.simp.stomp.StompEncoder;
|
import org.springframework.messaging.simp.stomp.StompEncoder;
|
||||||
import org.springframework.messaging.simp.stomp.StompHeaderAccessor;
|
import org.springframework.messaging.simp.stomp.StompHeaderAccessor;
|
||||||
import org.springframework.messaging.simp.user.DestinationUserNameProvider;
|
|
||||||
import org.springframework.messaging.support.AbstractMessageChannel;
|
import org.springframework.messaging.support.AbstractMessageChannel;
|
||||||
import org.springframework.messaging.support.ChannelInterceptor;
|
import org.springframework.messaging.support.ChannelInterceptor;
|
||||||
import org.springframework.messaging.support.ImmutableMessageChannelInterceptor;
|
import org.springframework.messaging.support.ImmutableMessageChannelInterceptor;
|
||||||
|
@ -272,8 +271,10 @@ public class StompSubProtocolHandler implements SubProtocolHandler, ApplicationE
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Throwable ex) {
|
catch (Throwable ex) {
|
||||||
logger.error("Failed to send client message to application via MessageChannel" +
|
if (logger.isErrorEnabled()) {
|
||||||
" in session " + session.getId() + ". Sending STOMP ERROR to client.", ex);
|
logger.error("Failed to send client message to application via MessageChannel" +
|
||||||
|
" in session " + session.getId() + ". Sending STOMP ERROR to client.", ex);
|
||||||
|
}
|
||||||
handleError(session, ex, message);
|
handleError(session, ex, message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -291,7 +292,7 @@ public class StompSubProtocolHandler implements SubProtocolHandler, ApplicationE
|
||||||
}
|
}
|
||||||
|
|
||||||
StompHeaderAccessor accessor = MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor.class);
|
StompHeaderAccessor accessor = MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor.class);
|
||||||
Assert.notNull(accessor, "Expected STOMP headers");
|
Assert.state(accessor != null, "Expected STOMP headers");
|
||||||
sendToClient(session, accessor, message.getPayload());
|
sendToClient(session, accessor, message.getPayload());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -336,7 +337,9 @@ public class StompSubProtocolHandler implements SubProtocolHandler, ApplicationE
|
||||||
this.eventPublisher.publishEvent(event);
|
this.eventPublisher.publishEvent(event);
|
||||||
}
|
}
|
||||||
catch (Throwable ex) {
|
catch (Throwable ex) {
|
||||||
logger.error("Error publishing " + event, ex);
|
if (logger.isErrorEnabled()) {
|
||||||
|
logger.error("Error publishing " + event, ex);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -347,27 +350,29 @@ public class StompSubProtocolHandler implements SubProtocolHandler, ApplicationE
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
public void handleMessageToClient(WebSocketSession session, Message<?> message) {
|
public void handleMessageToClient(WebSocketSession session, Message<?> message) {
|
||||||
if (!(message.getPayload() instanceof byte[])) {
|
if (!(message.getPayload() instanceof byte[])) {
|
||||||
logger.error("Expected byte[] payload. Ignoring " + message + ".");
|
if (logger.isErrorEnabled()) {
|
||||||
|
logger.error("Expected byte[] payload. Ignoring " + message + ".");
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
StompHeaderAccessor stompAccessor = getStompHeaderAccessor(message);
|
StompHeaderAccessor accessor = getStompHeaderAccessor(message);
|
||||||
StompCommand command = stompAccessor.getCommand();
|
StompCommand command = accessor.getCommand();
|
||||||
|
|
||||||
if (StompCommand.MESSAGE.equals(command)) {
|
if (StompCommand.MESSAGE.equals(command)) {
|
||||||
if (stompAccessor.getSubscriptionId() == null) {
|
if (accessor.getSubscriptionId() == null && logger.isWarnEnabled()) {
|
||||||
logger.warn("No STOMP \"subscription\" header in " + message);
|
logger.warn("No STOMP \"subscription\" header in " + message);
|
||||||
}
|
}
|
||||||
String origDestination = stompAccessor.getFirstNativeHeader(SimpMessageHeaderAccessor.ORIGINAL_DESTINATION);
|
String origDestination = accessor.getFirstNativeHeader(SimpMessageHeaderAccessor.ORIGINAL_DESTINATION);
|
||||||
if (origDestination != null) {
|
if (origDestination != null) {
|
||||||
stompAccessor = toMutableAccessor(stompAccessor, message);
|
accessor = toMutableAccessor(accessor, message);
|
||||||
stompAccessor.removeNativeHeader(SimpMessageHeaderAccessor.ORIGINAL_DESTINATION);
|
accessor.removeNativeHeader(SimpMessageHeaderAccessor.ORIGINAL_DESTINATION);
|
||||||
stompAccessor.setDestination(origDestination);
|
accessor.setDestination(origDestination);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (StompCommand.CONNECTED.equals(command)) {
|
else if (StompCommand.CONNECTED.equals(command)) {
|
||||||
this.stats.incrementConnectedCount();
|
this.stats.incrementConnectedCount();
|
||||||
stompAccessor = afterStompSessionConnected(message, stompAccessor, session);
|
accessor = afterStompSessionConnected(message, accessor, session);
|
||||||
if (this.eventPublisher != null && StompCommand.CONNECTED.equals(command)) {
|
if (this.eventPublisher != null && StompCommand.CONNECTED.equals(command)) {
|
||||||
try {
|
try {
|
||||||
SimpAttributes simpAttributes = new SimpAttributes(session.getId(), session.getAttributes());
|
SimpAttributes simpAttributes = new SimpAttributes(session.getId(), session.getAttributes());
|
||||||
|
@ -382,25 +387,21 @@ public class StompSubProtocolHandler implements SubProtocolHandler, ApplicationE
|
||||||
}
|
}
|
||||||
|
|
||||||
byte[] payload = (byte[]) message.getPayload();
|
byte[] payload = (byte[]) message.getPayload();
|
||||||
|
|
||||||
if (StompCommand.ERROR.equals(command) && getErrorHandler() != null) {
|
if (StompCommand.ERROR.equals(command) && getErrorHandler() != null) {
|
||||||
Message<byte[]> errorMessage = getErrorHandler().handleErrorMessageToClient((Message<byte[]>) message);
|
Message<byte[]> errorMessage = getErrorHandler().handleErrorMessageToClient((Message<byte[]>) message);
|
||||||
stompAccessor = MessageHeaderAccessor.getAccessor(errorMessage, StompHeaderAccessor.class);
|
accessor = MessageHeaderAccessor.getAccessor(errorMessage, StompHeaderAccessor.class);
|
||||||
Assert.notNull(stompAccessor, "Expected STOMP headers");
|
Assert.state(accessor != null, "Expected STOMP headers");
|
||||||
payload = errorMessage.getPayload();
|
payload = errorMessage.getPayload();
|
||||||
}
|
}
|
||||||
|
sendToClient(session, accessor, payload);
|
||||||
sendToClient(session, stompAccessor, payload);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void sendToClient(WebSocketSession session, StompHeaderAccessor stompAccessor, byte[] payload) {
|
private void sendToClient(WebSocketSession session, StompHeaderAccessor stompAccessor, byte[] payload) {
|
||||||
StompCommand command = stompAccessor.getCommand();
|
StompCommand command = stompAccessor.getCommand();
|
||||||
try {
|
try {
|
||||||
byte[] bytes = this.stompEncoder.encode(stompAccessor.getMessageHeaders(), payload);
|
byte[] bytes = this.stompEncoder.encode(stompAccessor.getMessageHeaders(), payload);
|
||||||
|
|
||||||
boolean useBinary = (payload.length > 0 && !(session instanceof SockJsSession) &&
|
boolean useBinary = (payload.length > 0 && !(session instanceof SockJsSession) &&
|
||||||
MimeTypeUtils.APPLICATION_OCTET_STREAM.isCompatibleWith(stompAccessor.getContentType()));
|
MimeTypeUtils.APPLICATION_OCTET_STREAM.isCompatibleWith(stompAccessor.getContentType()));
|
||||||
|
|
||||||
if (useBinary) {
|
if (useBinary) {
|
||||||
session.sendMessage(new BinaryMessage(bytes));
|
session.sendMessage(new BinaryMessage(bytes));
|
||||||
}
|
}
|
||||||
|
@ -414,7 +415,9 @@ public class StompSubProtocolHandler implements SubProtocolHandler, ApplicationE
|
||||||
}
|
}
|
||||||
catch (Throwable ex) {
|
catch (Throwable ex) {
|
||||||
// Could be part of normal workflow (e.g. browser tab closed)
|
// Could be part of normal workflow (e.g. browser tab closed)
|
||||||
logger.debug("Failed to send WebSocket message to client in session " + session.getId(), ex);
|
if (logger.isDebugEnabled()) {
|
||||||
|
logger.debug("Failed to send WebSocket message to client in session " + session.getId(), ex);
|
||||||
|
}
|
||||||
command = StompCommand.ERROR;
|
command = StompCommand.ERROR;
|
||||||
}
|
}
|
||||||
finally {
|
finally {
|
||||||
|
@ -471,9 +474,13 @@ public class StompSubProtocolHandler implements SubProtocolHandler, ApplicationE
|
||||||
private StompHeaderAccessor convertConnectAcktoStompConnected(StompHeaderAccessor connectAckHeaders) {
|
private StompHeaderAccessor convertConnectAcktoStompConnected(StompHeaderAccessor connectAckHeaders) {
|
||||||
String name = StompHeaderAccessor.CONNECT_MESSAGE_HEADER;
|
String name = StompHeaderAccessor.CONNECT_MESSAGE_HEADER;
|
||||||
Message<?> message = (Message<?>) connectAckHeaders.getHeader(name);
|
Message<?> message = (Message<?>) connectAckHeaders.getHeader(name);
|
||||||
Assert.notNull(message, "Original STOMP CONNECT not found in " + connectAckHeaders);
|
if (message == null) {
|
||||||
|
throw new IllegalStateException("Original STOMP CONNECT not found in " + connectAckHeaders);
|
||||||
|
}
|
||||||
|
|
||||||
StompHeaderAccessor connectHeaders = MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor.class);
|
StompHeaderAccessor connectHeaders = MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor.class);
|
||||||
StompHeaderAccessor connectedHeaders = StompHeaderAccessor.create(StompCommand.CONNECTED);
|
StompHeaderAccessor connectedHeaders = StompHeaderAccessor.create(StompCommand.CONNECTED);
|
||||||
|
|
||||||
Set<String> acceptVersions = connectHeaders.getAcceptVersion();
|
Set<String> acceptVersions = connectHeaders.getAcceptVersion();
|
||||||
if (acceptVersions.contains("1.2")) {
|
if (acceptVersions.contains("1.2")) {
|
||||||
connectedHeaders.setVersion("1.2");
|
connectedHeaders.setVersion("1.2");
|
||||||
|
@ -484,6 +491,7 @@ public class StompSubProtocolHandler implements SubProtocolHandler, ApplicationE
|
||||||
else if (!acceptVersions.isEmpty()) {
|
else if (!acceptVersions.isEmpty()) {
|
||||||
throw new IllegalArgumentException("Unsupported STOMP version '" + acceptVersions + "'");
|
throw new IllegalArgumentException("Unsupported STOMP version '" + acceptVersions + "'");
|
||||||
}
|
}
|
||||||
|
|
||||||
long[] heartbeat = (long[]) connectAckHeaders.getHeader(SimpMessageHeaderAccessor.HEART_BEAT_HEADER);
|
long[] heartbeat = (long[]) connectAckHeaders.getHeader(SimpMessageHeaderAccessor.HEART_BEAT_HEADER);
|
||||||
if (heartbeat != null) {
|
if (heartbeat != null) {
|
||||||
connectedHeaders.setHeartbeat(heartbeat[0], heartbeat[1]);
|
connectedHeaders.setHeartbeat(heartbeat[0], heartbeat[1]);
|
||||||
|
@ -491,6 +499,7 @@ public class StompSubProtocolHandler implements SubProtocolHandler, ApplicationE
|
||||||
else {
|
else {
|
||||||
connectedHeaders.setHeartbeat(0, 0);
|
connectedHeaders.setHeartbeat(0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
return connectedHeaders;
|
return connectedHeaders;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue