我正在使用Spring Boot v1.5.8.RELEASE。
我已经定义了WebSocketHandler
,其中我保留了会话列表。
在另一个@Component
我已经自动装配此处理程序以到达其会话。但它总是零大小(虽然原来不是)。难道我不能自动装配相同的单一物体吗?为什么?默认情况下不是@Component
单身?
以下是代码:
WebSocketHandler.java
@Component
public class WebSocketHandler extends TextWebSocketHandler {
public CopyOnWriteArrayList<WebSocketSession> sessions = new CopyOnWriteArrayList<WebSocketSession>();
@Override
public void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
}
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
sessions.remove(session);
}
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
sessions.add(session);
System.out.println("SIZE: "+ sessions.size()); // -> This grows as clients connected
}
public CopyOnWriteArrayList<WebSocketSession> getSessions() {
return sessions;
}
}
MyComponent.java
@Component
public class MyComponent {
@Autowired
WebSocketHandler wshandler;
@Scheduled(fixedRate=20000)
public void mytask() {
System.out.println(wshandler.sessions.size()); // THIS IS ALWAYS ZERO
// wshandler.getSessions().size() -> no difference
}
}
答案 0 :(得分:0)
这是一个假的错误。 在我直接从一个例子中复制的WebSocketHandler的配置中,我已经在创建一个处理程序。
package database.config
import javax.inject.{Inject, Singleton}
import play.api.db.slick.DatabaseConfigProvider
import play.db.NamedDatabase
import slick.jdbc.{JdbcProfile, PostgresProfile}
@Singleton
final class DatabaseProvider @Inject()(@NamedDatabase("postgres") configProvider: DatabaseConfigProvider) {
val dbConfig = configProvider.get[PostgresProfile]
}
所以,修复很简单:
@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(new WebSocketHandler(), "/mywebsocket").setAllowedOrigins("*");
}
}
感谢Dovmo,我还将类的名称更改为MyWebSocketHandler,因为Spring已经有了WebSocketHandler。