gpt4 book ai didi

java - Spring 组件之间共享信息

转载 作者:行者123 更新时间:2023-11-30 06:53:21 25 4
gpt4 key购买 nike

我正在尝试构建一个应用程序,在其中实现一个相当简单的模式:我有一个 websocket 服务器,它从多个客户端接收流数据。然后存储该数据,以便可以通过 RESTful API 提供服务。我想要某种接口(interface),WS 服务器和 REST API 都可以访问该接口(interface)来存储和请求最新数据。

展示一个简化的案例:

我有 10 个连接的小工具,它们通过 Websocket 连接传输消息。它们中的每一个都流式传输到/ingest/{ID}。然后,我有一个 REST API,它返回/latest/{ID} 上的最新消息。

  1. 这是正确的设计模式吗?
  2. 如果是这样,我如何尽可能多地使用 Spring 框架来实现它?

我想我需要执行以下操作:

我将有一个带有 main(String args[]) 方法的类。然后它会自行运行,Spring 框架将获取不同的组件 - WebSocket 端点、REST 端点和 DataCache 类。

如何将 DataCache 类的正确实例提供给 WebSocket 和 REST 端点?

        @SpringBootApplication
@EnableWebSocket
@ComponentScan(basePackages={"com.acme.server.wsendpoint","com.acme.server.restendpoint","com.acme.server.datacache"})
public class PredixWebsocketServerApplication{
private static Logger log = LoggerFactory.getLogger(WebsocketServerApplication.class);

/**
* @param args -
*/
@SuppressWarnings("nls")
public static void main(String[] args) {
SpringApplication app = new SpringApplication(WebsocketServerApplication.class);
}
}

然后,我将在每个组件类中包含以下代码:

    public class WSEndpoint {

private static Logger logger = LoggerFactory.getLogger(WSEndpoint.class);
private DataCache dataCache;

public WSEndpoint(DataCache cache) {
dataCache = cache;
//do init stuff
}

/**
* @param ID - machine ID
* @param session - session object
* @param ec -
*/
@OnOpen
public void onOpen(@PathParam(value = "mID") String ID, @PathParam(value = "direction") String DirectionID, final Session session, EndpointConfig ec) {
logger.info("Server: opened... for Direction: " + DirectionID + " Node Id : " + ID + " : " + session.getId());
}

/**
* @param ID -
* @param message -
* @param session -
*/
@OnMessage
public void onMessage(@PathParam(value = "modelID") String modelID, @PathParam(value = "direction") String DirectionID, String message, Session session) {
try {
for(Session s : session.getOpenSessions()){
if ("ingest".equals(s.getPathParameters().get("direction"))){
DataCache.store(message);
}
}
} catch (Exception e){
logger.error("Error handling websocket message: " + e.getLocalizedMessage());
}
}

/**
* @param session - session object
* @param closeReason - The reason of close of session
*/
@OnClose
public void onClose(Session session, CloseReason closeReason) {
logger.info("Server: Session " + session.getId() + " closed because of " + closeReason.toString());
}

/**
* @param session - current session object
* @param t - Throwable instance containing error info
*/
@OnError
public void onError(Session session, Throwable t) {
logger.error("Server: Session " + session.getId() + " closed because of " + t.getMessage());
}


}

然后,其余端点将如下所示:

@Controller
public class RestEndpoint {

private DataCache dataCache;
private static Logger log = LoggerFactory.getLogger(restEndpoint.class);

public void setGreeting(DataCache cache){
dataCache = cache;
}

@CrossOrigin(origins = "http://localhost:5000")
@RequestMapping(value="/latest/{ID}")
@ResponseBody
public String latest() {
log.info("Sending message: " + DataCache.getLatest(ID));
return latest;
}
}

最佳答案

使用 Spring IoC 容器将 DataCache 注入(inject)到两个 Bean 中,这就是 Spring 的确切目的。

尝试

@Autowired
private DataCache datacache

在您的两个端点中。

如果启用了 Spring 自动配置,请使用 @Service 注释您的 DataCache 类,以告诉 Spring 创建一个 DataCache Bean。

您应该在 https://docs.spring.io/spring/docs/current/spring-framework-reference/html/beans.html 中阅读更多内容

关于java - Spring 组件之间共享信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42301307/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com