मैंने एक ही समस्या देखी, अर्थात् सदस्यता लेने के बाद सदस्यता लेने वाला थ्रेड ब्लॉक हो जाता है। इसे संबोधित करने के लिए, मैंने नेट्टी का उपयोग करके एक अनुकूलित पब/उप क्लाइंट को कार्यान्वित किया और इसे यहां जेडिस फोर्क में शामिल किया। यह एक व्यापक समाधान नहीं है और मेरे पास इसे वास्तव में समाप्त करने का समय नहीं है, लेकिन यह बुनियादी चैनल और पैटर्न सदस्यता के लिए काम करता है। मूल बातें हैं:
इसका उपयोग करके एक पबसुब इंस्टेंस प्राप्त करें:
public static OptimizedPubSub getInstance(String host, int port, String auth, long timeout)
पैटर्न सदस्यता जारी/रद्द करें:
public ChannelFuture psubscribe(String... patterns)
public ChannelFuture punsubscribe(String... patterns)
आप दिए गए ChannelFuture को तब तक अनदेखा कर सकते हैं जब तक कि आप 100% सुनिश्चित नहीं करना चाहते कि आपका अनुरोध पूरा हो गया है (यह async है)।
चैनल सदस्यता जारी/रद्द करें:
public ChannelFuture subscribe(String... channels)
public ChannelFuture unsubscribe(String... channels)
फिर सबलिस्टर इंस्टेंस को लागू करें:
public interface SubListener {
/**
* Callback when a message is published on a subscribed channel
* @param channel The channel the message was received on
* @param message The received message
*/
public void onChannelMessage(String channel, String message);
/**
* Callback when a message is published on a subscribed channel matching a subscribed pattern
* @param pattern The pattern that the channel matched
* @param channel The channel the message was received on
* @param message The received message
*/
public void onPatternMessage(String pattern, String channel, String message);
}
और इसका उपयोग करके श्रोताओं को पंजीकृत/अपंजीकृत करें:
public void registerListener(SubListener listener)
public void unregisterListener(SubListener listener)
ऑप्टिमाइज़्डपबसब कभी भी ब्लॉक नहीं करता है और पंजीकृत सबलिस्टर्स को एसिंक्रोनस रूप से ईवेंट वितरित किए जाते हैं।
कांटा अब थोड़ा पुराना है, इसलिए यह आपके वर्तमान स्वरूप में आपके लिए उपयोगी नहीं हो सकता है, लेकिन आप आसानी से उस पैकेज में स्रोत खींच सकते हैं और इसे अकेले बना सकते हैं। निर्भरता जेडिस और नेट्टी हैं।
क्षमा करें, मेरे पास अधिक व्यापक समाधान नहीं था।