在Spring组件之间共享信息

时间:2017-02-17 15:13:01

标签: java spring spring-boot

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

提出简化案例:

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

  1. 这是正确的设计模式吗?
  2. 如果是这样,我如何使用尽可能多的Spring框架来实现它?
  3. 我想我需要做以下事情:

    我将使用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;
        }
    }
    

1 个答案:

答案 0 :(得分:1)

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

@Autowired
private DataCache datacache

在你的EndPoints中。

如果启用了Spring autoConfiguration,请使用@Service注释DataCache类,告诉Spring创建一个DataCache Bean。

您应该在https://docs.spring.io/spring/docs/current/spring-framework-reference/html/beans.html

中详细了解