अद्यतन:
कैसे आप Guice का उपयोग ठीक है। चूंकि MessageInbound का केवल एक विशेष उपयोग है AbstractGuiceWebSocketServlet की तरह किसी भी चीनी अनावश्यक है। प्रदाता ChatLogHdlr और फिर मैन्युअल निर्माण कर रहा है ठीक है। लेकिन आप एओपी समर्थन खो देते हैं। यदि इसकी आवश्यकता है तो आप सहायक इंजेक्ट करना चाहेंगे। लेकिन अभी के लिए यह ठीक है।
एक तरफ नोट पर, सेटर इंजेक्शन के बजाय निर्माण इंजेक्शन का उपयोग करें।
मैंने तुरंत देखा कि समस्या क्या है। यह गुइस नहीं है बल्कि आप गुइस-पर्सिस्ट का उपयोग कैसे करते हैं। मैंने जीपी का बहुत उपयोग नहीं किया और अभी भी आदरणीय वार्प-पर्सिस्ट का उपयोग करें। आप PersistService सुई शुरू करने के लिए Guice-जारी रहती है की जरूरत है
: लेकिन मैं अपने कोड में कैसे आप का उपयोग Guice-जारी रहती है के साथ 2 समस्याओं को देखते हैं। यह WIKI उदा।
public class PocWebApp extends GuiceServletContextListener {
@Inject
PersistService ps;
@Override
protected Injector getInjector() {
Injector injector = Guice.createInjector(new ServletModule() {
@Override
protected void configureServlets() {
install(new JpaPersistModule("DesktopPU"));
serve("/socket/main/").with(MainSocket.class);
}
});
injector.injectMembers(this);
return injector;
}
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
super.contextInitialized(servletContextEvent);
ps.start();
}
}
PersistFilter बेकार के रूप में केवल पहली बार WebSocket गर्त फिल्टर जाना होगा लेकिन बाद के सभी संचार फिल्टर गर्त जाना नहीं होगा। टीट्रॉन का उपयोग केवल @ ट्रान्सैक्शनल (सत्र-प्रति-लेनदेन) के आसपास जाने का तरीका है।
विषय से संबंधित नहीं:
कितने उपयोगकर्ताओं आप का समर्थन करना चाहते हैं? यदि यह कट्टर चैट सर्वर होने जा रहा है तो मैं इसके बजाय नेटटी का उपयोग करूंगा लेकिन यह कुछ और शामिल है। इस पाया Googling:
http://comoyo.github.com/blog/2012/07/30/integrating-websockets-in-netty/
मूल जवाब:
तो इस शैली के बारे में एक सवाल है?
वेबसाकेट्स! = सर्वलेट्स। अगर उन्हें थोड़ा अलग शैली की आवश्यकता होती है तो कुछ भी गलत नहीं है। मैं भी याद दिलाना पसंद करूंगा कि मैं वेनिला सर्वलेट से निपट नहीं रहा हूं।
कुछ टिप्पणियों:
WebSocketServlet कुछ खास नहीं है। आप आसानी से गुइस-सर्वलेट के साथ इसका उपयोग कर सकते हैं। उदा .:
@Singleton
public class FooGuiceWebSocketServlet extends WebSocketServlet {...}
और फिर के रूप में
serve("/foo").with(FooGuiceWebSocketServlet.class);
अब, MessageInbound खास है कि के रूप में सभी बिलाव द्वारा नियंत्रित किया जाता के रूप में आप विस्तार से बताया यह refernce। MessageInbound वेबसाकेट scoped है। अब गुइस को इस दायरे के बारे में कोई जानकारी नहीं है और इसे इस तरह से छोड़ने का अर्थ हो सकता है।
स्टार्टर्स के लिए मैं सुनिश्चित करता हूं कि संदेश इनबाउंड गुइस द्वारा बनाया गया है। इस तर्ज पर कुछ:
@Singleton
public class ExampleWebSocketServlet extends AbstractGuiceWebSocketServlet {
@Override
public Class<? extends StreamInbound> serveWith() {
return Foo.class;
}
public static class Foo extends MessageInbound {
@Inject GuiceCreatedAndInjected bar;
@Override
protected void onBinaryMessage(ByteBuffer byteBuffer) throws IOException {
// do nothing
}
@Override
protected void onTextMessage(CharBuffer charBuffer) throws IOException {
// this getSwOutbonds() is not very friendly to testing
getWsOutbound().writeTextMessage(bar.echo(charBuffer));
}
}
}
कहाँ
public abstract class AbstractGuiceWebSocketServlet extends WebSocketServlet {
@Inject Injector injector;
@Override
protected StreamInbound createWebSocketInbound(String subProtocol, HttpServletRequest request) {
return injector.getInstance(serveWith());
}
public abstract Class<? extends StreamInbound> serveWith();
}
आप जरूरत के मुताबिक यहां से उच्च कपोल-कल्पना और/या scopings पर जा सकते हैं। मुझे विशेष रूप से #getWsOutbound() पसंद नहीं है क्योंकि यह परीक्षण में बाधा डालता है।
बस संतुष्ट होने तक शैली में सुधार करना जारी रखें। कहें कि आपको और मदद चाहिए (उत्तर संशोधित करेगा)।
यदि मैं आपको समझता हूं, तो आप WebSocketServlet # createWebSocketInbound ओवरराइड करते हैं जहां आप MessageInbound का एक नया उदाहरण बनाते हैं? यदि यह सत्य है, तो बस गिसिस को आपके लिए संदेशइनबाउंड बनाने दें (यदि आवश्यक हो तो इंजेक्ट की गई सहायता करें)। एकमात्र समस्या जो मैं देखता हूं वह http अनुरोध/प्रतिक्रियाओं के दायरे के साथ है क्योंकि चूहे फ़िल्टर ट्रैक रखने के लिए थ्रेड स्थानीय का उपयोग करता है। लेकिन इसे मुआवजा दिया जा सकता है। क्या मैंने सही तरीके से आपका अनुसरण किया? –
आपकी टिप्पणी के लिए धन्यवाद, लेकिन मुझे इस भाग को समझ में नहीं आया: "तो बस गिसिस को आपके लिए संदेशइनबाउंड बनाने दें (यदि आवश्यक हो तो इंजेक्ट की गई सहायता करें)" –