2016-08-30 9 views
7

हम WebSockets कनेक्शन है कि हम एक CONNECT फ्रेम गुजर रहे हैं पर एक स्प्रिंग है:स्प्रिंग STOMP WebSockets से अधिक का समय निर्धारण नहीं दिल की धड़कन

CONNECT\naccept-version:1.2\nheart-beat:10000,10000\n\n\u0000 

कौन सा हैंडलर को स्वीकार करता है, कोई नया सत्र आरंभ, और रिटर्न की तुलना में:

CONNECTED 
version:1.2 
heart-beat:0,0 

हालांकि, हम दिल की धड़कन चाहते हैं ताकि हम वेबस्केट को खोल सकें। हम SockJS का उपयोग कर नहीं हैं।

मैं वसंत संदेश हैंडलर के माध्यम से कदम रखा:

StompHeaderAccessor [headers={simpMessageType=CONNECT, stompCommand=CONNECT, nativeHeaders={accept-version=[1.2], heart-beat=[5000,0]}, simpSessionAttributes={}, simpHeartbeat=[[email protected], simpSessionId=46e855c9}] 

के बाद यह heart-beat (देशी हेडर) हो जाता है, यह तय करता है क्या, एक स्मृति पता simpHeartbeat=[[email protected], simpSessionId=46e855c9}]

ध्यान दें

तरह लग रहा है के बाद दलाल प्रमाणित करता है:

Processing CONNECT session=46e855c9 (सत्र आईडी यहाँ simpSessionId से अलग है)?

पहले TRACE डीबगिंग चलते समय मैंने एक नोटिस "दिल की धड़कन निर्धारित करना ..." या उस प्रभाव के लिए कुछ देखा ... हालांकि मैं इसे अब नहीं देख रहा हूं?

कोई विचार क्या चल रहा है? SockJS कार्य अनुसूचक जो दिल की धड़कन को भेजने के लिए प्रयोग किया जाता है की थ्रेड पूल से

SockJS कार्य शेड्यूलर आंकड़े:

धन्यवाद

मैं documentation में स्पष्टीकरण मिल गया है। ध्यान दें कि जब दिल की धड़कन STOMP स्तर पर बातचीत की जाती है तो सॉकजेएस दिल की धड़कन अक्षम होती है।

क्या सॉकजेएस दिल की धड़कन स्टॉपप दिल की धड़कन से अलग हैं?

उत्तर

5

हाँ सॉकजेएस दिल की धड़कन अलग हैं। मूल रूप से वही बात है लेकिन सॉकजेएस प्रोटोकॉल में उनका उद्देश्य यह सुनिश्चित करना है कि कनेक्शन "मृत" जैसा नहीं दिखता है, इस मामले में प्रॉक्सी इसे सक्रिय रूप से सक्रिय कर सकती है। आम तौर पर एक दिल की धड़कन प्रत्येक पक्ष को कनेक्टिविटी मुद्दों को सक्रिय रूप से सक्रिय करने और संसाधनों को साफ करने की अनुमति देती है।

परिवहन परत पर STOMP और SockJS का उपयोग करते समय, एसओएमपी दिल की धड़कन उपयोग में आने पर सोकजेएस दिल की धड़कन बंद होने की आवश्यकता नहीं है। हालांकि आप यहां सॉकजेएस का उपयोग नहीं कर रहे हैं।

आप कोई कॉन्फ़िगरेशन नहीं दिखा रहे हैं लेकिन मेरा अनुमान है कि आप अंतर्निहित सरल ब्रोकर का उपयोग कर रहे हैं जो स्वचालित रूप से दिल की धड़कन नहीं भेजता है। इसे कॉन्फ़िगर करते समय आपको दिल की धड़कन को सक्षम करने के लिए एक विकल्प दिखाई देगा और आपको कार्य शेड्यूलर सेट करने की भी आवश्यकता होगी।

@Configuration 
@EnableWebSocketMessageBroker 
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { 

    @Override 
    public void registerStompEndpoints(StompEndpointRegistry registry) { 
     // ... 
    } 

    @Override 
    public void configureMessageBroker(MessageBrokerRegistry registry) { 
     registry.enableStompBrokerRelay(...) 
       .setTaskScheduler(...) 
       .setHeartbeat(...); 
    } 

} 
+4

क्या आपने इरादा किया था, @Rossen, '.enableStompBrokerRelay (...) 'लिखने के लिए, भले ही आपका" अनुमान है कि आप अंतर्निहित सरल ब्रोकर का उपयोग कर रहे हैं "? ऐसा लगता है कि यह '.enableSimpleBroker (...)' होना चाहिए, है ना? –

4

वसंत 4 शुरू करना।2 आप, सर्वर साइड से पूरा नियंत्रण हो सकता है, के साथ SockJS पर stomp का उपयोग कर दिल की धड़कन बातचीत परिणाम की निर्मित SimpleBroker:

public class WebSocketConfigurer extends AbstractWebSocketMessageBrokerConfigurer { 

    @Override 
    public void configureMessageBroker(MessageBrokerRegistry config) { 
     ThreadPoolTaskScheduler te = new ThreadPoolTaskScheduler(); 
     te.setPoolSize(1); 
     te.setThreadNamePrefix("wss-heartbeat-thread-"); 
     te.initialize(); 

     config.enableSimpleBroker("/") 
       /** 
       * Configure the value for the heartbeat settings. The first number 
       * represents how often the server will write or send a heartbeat. 
       * The second is how often the client should write. 0 means no heartbeats. 
       * <p>By default this is set to "0, 0" unless the {@link #setTaskScheduler 
       * taskScheduler} in which case the default becomes "10000,10000" 
       * (in milliseconds). 
       * @since 4.2 
       */ 
       .setHeartbeatValue(new long[]{heartbeatServer, heartbeatClient}) 
       .setTaskScheduler(te); 
    } 

    @Override 
    public void registerStompEndpoints(StompEndpointRegistry registry) { 
     registry.addEndpoint(.....) 
       .setAllowedOrigins(....) 
       .withSockJS(); 
    } 
} 
+0

बहुत बढ़िया, यह कुछ सार तत्व है जिसे मैं कहीं और नहीं ढूंढ सका! धन्यवाद दोस्त! – thorinkor

+0

खुशी है कि यह आपकी मदद की! – artemisian

5

हम स्प्रिंग, WebRTC, STOMP और स्प्रिंग सत्रों के साथ एक ही समस्या मिला - कोई दिल की धड़कन और वसंत सत्र समाप्त हो सकता है जबकि websocket सर्वर पक्ष पर संदेश प्राप्त नहीं करता है। हमने प्रत्येक 20000ms ब्राउज़र से STOMP दिल की धड़कन को सक्षम करने के साथ समाप्त किया और सिम्प मैसेज टाइप टाइप करें। हार्टबेट वसंत सत्र रिपोजिटरीइंटरसेप्टर स्प्रिंग सत्र रखने के लिए मैचों के बिना STOMP दिल की धड़कन पर अंतिम पहुंच समय को अपडेट करने के लिए मैच। हमें सार सत्र वेबसॉकेट मैसेज ब्रोकर कॉन्फ़िगरर का निर्माण करना था ताकि स्प्रिंग सत्र और वेबस्केट सत्र बाध्यकारी में सक्षम हो सके। Spring manual, दूसरा उदाहरण। आधिकारिक उदाहरण में स्प्रिंग सत्र इनबाउंड वेबस्केट कनेक्ट/संदेश/सदस्यता/UNSUBSCRIBE संदेशों पर अपडेट किया गया है, लेकिन दिल की धड़कन नहीं है, इसलिए हमें 2 चीजों को फिर से कॉन्फ़िगर करने की आवश्यकता है - कम से कम इनबाउंड दिल की धड़कन सक्षम करें और वेबसाईट दिल की धड़कन पर प्रतिक्रिया करने के लिए वसंत सत्र समायोजित करें

public class WebSocketConfig extends AbstractSessionWebSocketMessageBrokerConfigurer<ExpiringSession> { 

    @Autowired 
    SessionRepositoryMessageInterceptor sessionRepositoryInterceptor; 

    @Override 
    public void configureMessageBroker(MessageBrokerRegistry config) { 
     sessionRepositoryInterceptor.setMatchingMessageTypes(EnumSet.of(SimpMessageType.CONNECT, 
       SimpMessageType.MESSAGE, SimpMessageType.SUBSCRIBE, 
       SimpMessageType.UNSUBSCRIBE, SimpMessageType.HEARTBEAT)); 

     config.setApplicationDestinationPrefixes(...); 
     config.enableSimpleBroker(...) 
      .setTaskScheduler(new DefaultManagedTaskScheduler()) 
      .setHeartbeatValue(new long[]{0,20000}); 
    } 
} 

एक और तरीका है कि हम करने की कोशिश की कुछ फिर से लागू करने SessionRepositoryMessageInterceptor कीआउटबाउंड WebSocket संदेशों पर वसंत सत्र अद्यतन पिछले उपयोग समय के साथ साथ बनाए रखने के श्रोताओं के माध्यम से WebSocket सत्र-> वसंत सत्र नक्शा करने के लिए कार्यक्षमता है, लेकिन कोड ऊपर किया चाल।

संबंधित मुद्दे