WebSocketMessageBroker не работает должным образом после обновления до Spring Boot 3.3.5.JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 WebSocketMessageBroker не работает должным образом после обновления до Spring Boot 3.3.5.

Сообщение Anonymous »

У меня есть приложение, которое предоставляет конечную точку WebSocket со следующей конфигурацией

Код: Выделить всё

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

public static final String WS_ENDPOINT = "/notifications/v1";
public static final String EVENTS_CHANNEL = "/events";
public static final String ERRORS_CHANNEL = "/errors";

@Autowired
private StompMessageChannelInterceptor stompMessageChannelInterceptor;

@Override
public void registerStompEndpoints(final StompEndpointRegistry registry) {
registry.addEndpoint(WS_ENDPOINT)
.setAllowedOrigins("*")
.addInterceptors(new WebsocketHandshakeInterceptor())
.setHandshakeHandler(new WebsocketHandshakeInterceptor());
}

@Override
public void configureMessageBroker(final MessageBrokerRegistry registry) {
registry.enableSimpleBroker(EVENTS_CHANNEL, ERRORS_CHANNEL);
}

@Override
public void configureClientInboundChannel(final ChannelRegistration registration) {
registration.interceptors(stompMessageChannelInterceptor);
}

@Override
public void configureWebSocketTransport(final WebSocketTransportRegistration registration) {
registration.addDecoratorFactory(new WebSocketHandlerDecoratorFactory() {
@Override
public WebSocketHandler decorate(final WebSocketHandler webSocketHandler) {
return new WebSocketSessionCapturingHandlerDecorator(webSocketHandler);
}
});
}
}
Эта конфигурация отлично работала с Spring Boot 2.7.18. Но после перехода на Spring Boot 3.3.5 WebSocketMessagingAutoConfiguration устанавливает AsyncTaskExecutor. Автоматическая конфигурация (в WebSocketMessagingAutoConfiguration.WebSocketMessageConverterConfiguration) выбирает нашу собственную реализацию AsyncTaskExecutor, которая не подходит для конфигурации WebSocket (она добавляет дополнительную логику к выполняемой задаче). Ниже представлена ​​реализация AsyncTaskExecutor, подбираемая при автоматической настройке

Код: Выделить всё

public class ApiPoolExecutor extends ThreadPoolTaskExecutor {

private static final long serialVersionUID = 1L;

@Override
public Future submit(final Runnable task) {
return super.submit(new SomeLogicForRunnable(task));
}

@Override
public ListenableFuture submitListenable(final Runnable task) {
return super.submitListenable(new SomeLogicForRunnable(task));
}

@Override
public  ListenableFuture submitListenable(final Callable task) {
return super.submitListenable(new SomeLogicForRunnable(task));
}

@Override
public void execute(final Runnable task) {
super.execute(new SomeLogicForRunnable(task));
}
}
Я попытался создать другую реализацию AsyncTaskExecutor без какой-либо дополнительной логики вокруг выполняемой задачи, но автоконфигурация по-прежнему видит только реализацию ApiPoolExecutor. Я также попытался установить исполнителя непосредственно в ChannelRegistration в моем WebSocketConfig

Код: Выделить всё

  @Override
public void configureClientInboundChannel(final ChannelRegistration registration) {
registration.interceptors(stompMessageChannelInterceptor);
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setMaxPoolSize(100);
executor.setCorePoolSize(100);
executor.setBeanName("ws-pool-exec");
executor.initialize();
registration.executor(new WebSocketTaskPoolExecutor());
}
но позже автоматическая конфигурация переопределяет этот исполнитель с помощью ApiPoolExecutor. Как сделать так, чтобы автоконфигурация не переопределяла исполнителя ChannelRegistration? Или как его вообще отключить?


Подробнее здесь: https://stackoverflow.com/questions/791 ... ing-boot-3
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»