spring-projects / spring-projects/spring-integration
Application shuts down immediately after connecting to a websocket
@artembilan is already working on this.
Since Sep 19, 2024.
- Dominant language
- Java
- Stars
- 1.6k
- Forks
- 1.2k
- Avg merge
- 17h 48m
- Merged PRs (30d)
- 62
Description
I wrote a simple Spring Integration app that connects to a websocket, using spring-integration-websocket.
Expected Behavior
The app connects to the websocket and keeps listening for new messages.
Current Behavior
Once connected the application shuts down immediately, since there is no non-daemon thread running, as pointed out by @artembilan on stackoverflow (https://stackoverflow.com/questions/78961574/why-does-my-spring-integration-app-just-shutdown-without-listening/) and the canonical way to keep this from happening is to use the property spring.main.keep-alive=true.
Context
It seems like a strange convention to keep this as the default. I think it would make sense to make the default the inverse of the current behavior.
A working example:
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.integration.channel.PublishSubscribeChannel;
import org.springframework.integration.config.EnableIntegration;
import org.springframework.integration.dsl.IntegrationFlow;
import org.springframework.integration.handler.LoggingHandler;
import org.springframework.integration.websocket.ClientWebSocketContainer;
import org.springframework.integration.websocket.inbound.WebSocketInboundChannelAdapter;
import org.springframework.messaging.MessageChannel;
import org.springframework.web.socket.client.standard.StandardWebSocketClient;
@SpringBootApplication
@EnableIntegration
public class BinanceListenerApplication {
@Bean
MessageChannel rawAggTradeChannel(){
return new PublishSubscribeChannel();
}
@Bean
IntegrationFlow logging(){
return IntegrationFlow.from(rawAggTradeChannel()).handle(new LoggingHandler(LoggingHandler.Level.INFO)).get();
}
@Bean
IntegrationFlow binanceWebsocketAggTradeStream() {
var clientWebSocketContainer = new ClientWebSocketContainer(new StandardWebSocketClient(),
"wss://stream.binance.com:9443/ws/avaxusdt@aggTrade");
var websocketInboundChannelAdapter = new WebSocketInboundChannelAdapter(clientWebSocketContainer);
return IntegrationFlow
.from(websocketInboundChannelAdapter)
.channel(rawAggTradeChannel())
.get();
}
public static void main(String[] args) {
SpringApplication application = new SpringApplication(BinanceListenerApplication.class);
application.setWebApplicationType(WebApplicationType.NONE);
application.run(args);
}
}
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Assessment
This issue has not been assessed yet.