List of usage examples for org.springframework.data.redis.connection.util ByteArrayWrapper ByteArrayWrapper
public ByteArrayWrapper(byte[] array)
From source file:org.springframework.data.redis.listener.RedisMessageListenerContainer.java
private void addListener(MessageListener listener, Collection<? extends Topic> topics) { Assert.notNull(listener, "a valid listener is required"); Assert.notEmpty(topics, "at least one topic is required"); List<byte[]> channels = new ArrayList<byte[]>(topics.size()); List<byte[]> patterns = new ArrayList<byte[]>(topics.size()); boolean trace = logger.isTraceEnabled(); // add listener mapping Set<Topic> set = listenerTopics.get(listener); if (set == null) { set = new CopyOnWriteArraySet<Topic>(); listenerTopics.put(listener, set); }//from ww w .j a va 2s . com set.addAll(topics); for (Topic topic : topics) { ByteArrayWrapper holder = new ByteArrayWrapper(serializer.serialize(topic.getTopic())); if (topic instanceof ChannelTopic) { Collection<MessageListener> collection = channelMapping.get(holder); if (collection == null) { collection = new CopyOnWriteArraySet<MessageListener>(); channelMapping.put(holder, collection); } collection.add(listener); channels.add(holder.getArray()); if (trace) logger.trace("Adding listener '" + listener + "' on channel '" + topic.getTopic() + "'"); } else if (topic instanceof PatternTopic) { Collection<MessageListener> collection = patternMapping.get(holder); if (collection == null) { collection = new CopyOnWriteArraySet<MessageListener>(); patternMapping.put(holder, collection); } collection.add(listener); patterns.add(holder.getArray()); if (trace) logger.trace("Adding listener '" + listener + "' for pattern '" + topic.getTopic() + "'"); } else { throw new IllegalArgumentException("Unknown topic type '" + topic.getClass() + "'"); } } // check the current listening state if (listening) { subscriptionTask.subscribeChannel(channels.toArray(new byte[channels.size()][])); subscriptionTask.subscribePattern(patterns.toArray(new byte[patterns.size()][])); } }
From source file:org.springframework.data.redis.listener.RedisMessageListenerContainer.java
private void removeListener(MessageListener listener, Collection<? extends Topic> topics) { boolean trace = logger.isTraceEnabled(); // check stop listening case if (listener == null && CollectionUtils.isEmpty(topics)) { subscriptionTask.cancel();//from ww w .j av a2s . co m return; } List<byte[]> channelsToRemove = new ArrayList<byte[]>(); List<byte[]> patternsToRemove = new ArrayList<byte[]>(); // check unsubscribe all topics case if (CollectionUtils.isEmpty(topics)) { Set<Topic> set = listenerTopics.remove(listener); // listener not found, bail out if (set == null) { return; } topics = set; } for (Topic topic : topics) { ByteArrayWrapper holder = new ByteArrayWrapper(serializer.serialize(topic.getTopic())); if (topic instanceof ChannelTopic) { remove(listener, topic, holder, channelMapping, channelsToRemove); if (trace) { String msg = (listener != null ? "listener '" + listener + "'" : "all listeners"); logger.trace("Removing " + msg + " from channel '" + topic.getTopic() + "'"); } } else if (topic instanceof PatternTopic) { remove(listener, topic, holder, patternMapping, patternsToRemove); if (trace) { String msg = (listener != null ? "listener '" + listener + "'" : "all listeners"); logger.trace("Removing " + msg + " from pattern '" + topic.getTopic() + "'"); } } } // double check whether there are still subscriptions available otherwise cancel the connection // as most drivers forfeit the connection on unsubscribe if (listenerTopics.isEmpty()) { subscriptionTask.cancel(); } // check the current listening state else if (listening) { subscriptionTask.unsubscribeChannel(channelsToRemove.toArray(new byte[channelsToRemove.size()][])); subscriptionTask.unsubscribePattern(patternsToRemove.toArray(new byte[patternsToRemove.size()][])); } }