/* | |
* Copyright 1999-2011 Alibaba Group. | |
* | |
* 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 com.alibaba.dubbo.remoting.p2p.exchange.support; | |
import java.net.InetSocketAddress; | |
import java.util.ArrayList; | |
import java.util.Collection; | |
import java.util.Map; | |
import com.alibaba.dubbo.common.Constants; | |
import com.alibaba.dubbo.common.URL; | |
import com.alibaba.dubbo.common.logger.Logger; | |
import com.alibaba.dubbo.common.logger.LoggerFactory; | |
import com.alibaba.dubbo.remoting.Channel; | |
import com.alibaba.dubbo.remoting.Client; | |
import com.alibaba.dubbo.remoting.RemotingException; | |
import com.alibaba.dubbo.remoting.exchange.ExchangeChannel; | |
import com.alibaba.dubbo.remoting.exchange.ExchangeClient; | |
import com.alibaba.dubbo.remoting.exchange.ExchangeServer; | |
import com.alibaba.dubbo.remoting.exchange.support.ExchangeServerDelegate; | |
import com.alibaba.dubbo.remoting.p2p.exchange.ExchangeGroup; | |
import com.alibaba.dubbo.remoting.p2p.exchange.ExchangePeer; | |
/** | |
* ServerPeer | |
* | |
* @author william.liangf | |
*/ | |
public class ExchangeServerPeer extends ExchangeServerDelegate implements ExchangePeer { | |
private static final Logger logger = LoggerFactory.getLogger(ExchangeServerPeer.class); | |
private final Map<URL, ExchangeClient> clients; | |
private final ExchangeGroup group; | |
public ExchangeServerPeer(ExchangeServer server, Map<URL, ExchangeClient> clients, ExchangeGroup group){ | |
super(server); | |
this.clients = clients; | |
this.group = group; | |
} | |
public void leave() throws RemotingException { | |
group.leave(getUrl()); | |
} | |
@Override | |
public void close() { | |
try { | |
leave(); | |
} catch (RemotingException e) { | |
logger.error(e.getMessage(), e); | |
} | |
} | |
@SuppressWarnings({ "unchecked", "rawtypes" }) | |
@Override | |
public Collection<Channel> getChannels() { | |
return (Collection) getExchangeChannels(); | |
} | |
@Override | |
public Channel getChannel(InetSocketAddress remoteAddress) { | |
return getExchangeChannel(remoteAddress); | |
} | |
@Override | |
public Collection<ExchangeChannel> getExchangeChannels() { | |
Collection<ExchangeChannel> channels = super.getExchangeChannels(); | |
if (clients.size() > 0) { | |
channels = channels == null ? new ArrayList<ExchangeChannel>() : new ArrayList<ExchangeChannel>(channels); | |
channels.addAll(clients.values()); | |
} | |
return channels; | |
} | |
@Override | |
public ExchangeChannel getExchangeChannel(InetSocketAddress remoteAddress) { | |
String host = remoteAddress.getAddress() != null ? remoteAddress.getAddress().getHostAddress() : remoteAddress.getHostName(); | |
int port = remoteAddress.getPort(); | |
ExchangeChannel channel = super.getExchangeChannel(remoteAddress); | |
if (channel == null) { | |
for (Map.Entry<URL, ExchangeClient> entry : clients.entrySet()) { | |
URL url = entry.getKey(); | |
if (url.getIp().equals(host) && url.getPort() == port) { | |
return entry.getValue(); | |
} | |
} | |
} | |
return channel; | |
} | |
@Override | |
public void send(Object message) throws RemotingException { | |
send(message, getUrl().getParameter(Constants.SENT_KEY, false)); | |
} | |
@Override | |
public void send(Object message, boolean sent) throws RemotingException { | |
Throwable last = null; | |
try { | |
super.send(message, sent); | |
} catch (Throwable t) { | |
last = t; | |
} | |
for (Client client : clients.values()) { | |
try { | |
client.send(message, sent); | |
} catch (Throwable t) { | |
last = t; | |
} | |
} | |
if (last != null) { | |
if (last instanceof RemotingException) { | |
throw (RemotingException) last; | |
} else if (last instanceof RuntimeException) { | |
throw (RuntimeException) last; | |
} else { | |
throw new RuntimeException(last.getMessage(), last); | |
} | |
} | |
} | |
} |