/* * Copyright 2017 Async-IO.org * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package org.atmosphere.plugin.redis.redisson; import org.atmosphere.cpr.AtmosphereConfig; import org.atmosphere.cpr.BroadcastFilter; import org.atmosphere.cpr.Broadcaster; import org.atmosphere.cpr.ClusterBroadcastFilter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.net.URI; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * Support for Redis * * @author Michael Gerlyand */ public class RedissonFilter implements ClusterBroadcastFilter { private static final Logger logger = LoggerFactory.getLogger(RedissonFilter.class); private Broadcaster bc; private final ExecutorService listener = Executors.newSingleThreadExecutor(); private final ConcurrentLinkedQueue<String> receivedMessages = new ConcurrentLinkedQueue<String>(); private URI uri; private RedissonUtil redisUtil; private AtmosphereConfig config; private final ConcurrentLinkedQueue<String> localMessages = new ConcurrentLinkedQueue<String>(); private String auth; public RedissonFilter() { this(URI.create("http://localhost:6379")); } public RedissonFilter(URI uri) { this.uri = uri; } /** * {@inheritDoc} */ @Override public void setUri(String address) { uri = URI.create(address); } /** * {@inheritDoc} */ @Override public void init(AtmosphereConfig config) { this.config = config; } /** * {@inheritDoc} */ @Override public void destroy() { listener.shutdownNow(); redisUtil.destroy(); } /** * {@inheritDoc} */ @Override public BroadcastFilter.BroadcastAction filter(String broadcasterId, Object originalMessage, Object o) { String contents = originalMessage.toString(); if (!localMessages.remove(contents)) { redisUtil.outgoingBroadcast(originalMessage.toString()); return new BroadcastFilter.BroadcastAction(BroadcastAction.ACTION.CONTINUE, o); } else { return new BroadcastFilter.BroadcastAction(BroadcastAction.ACTION.ABORT, o); } } /** * {@inheritDoc} */ @Override public Broadcaster getBroadcaster() { return bc; } /** * {@inheritDoc} */ @Override public void setBroadcaster(final Broadcaster bc) { this.bc = bc; this.redisUtil = new RedissonUtil(uri, config, new RedissonUtil.Callback() { @Override public String getID() { return bc.getID(); } @Override public void broadcastReceivedMessage(String message) { localMessages.offer(message); bc.broadcast(message); } }); redisUtil.configure(); listener.submit(new Runnable() { public void run() { redisUtil.incomingBroadcast(); } }); } }