Example usage for org.springframework.data.redis.connection.util ByteArrayWrapper ByteArrayWrapper

List of usage examples for org.springframework.data.redis.connection.util ByteArrayWrapper ByteArrayWrapper

Introduction

In this page you can find the example usage for org.springframework.data.redis.connection.util ByteArrayWrapper ByteArrayWrapper.

Prototype

public ByteArrayWrapper(byte[] array) 

Source Link

Usage

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()][]));
    }
}