blob: a1ff4da47e29a24a1db8708027d525b69d45086e [file] [log] [blame]
/*
* 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.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.Server;
import com.alibaba.dubbo.remoting.p2p.Group;
import com.alibaba.dubbo.remoting.p2p.Peer;
import com.alibaba.dubbo.remoting.transport.ServerDelegate;
/**
* ServerPeer
*
* @author william.liangf
*/
public class ServerPeer extends ServerDelegate implements Peer {
private static final Logger logger = LoggerFactory.getLogger(ServerPeer.class);
private final Map<URL, Client> clients;
private final Group group;
public ServerPeer(Server server, Map<URL, Client> clients, Group 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);
}
}
@Override
public Collection<Channel> getChannels() {
Collection<Channel> channels = super.getChannels();
if (clients.size() > 0) {
channels = channels == null ? new ArrayList<Channel>() : new ArrayList<Channel>(channels);
channels.addAll(clients.values());
}
return channels;
}
@Override
public Channel getChannel(InetSocketAddress remoteAddress) {
String host = remoteAddress.getAddress() != null ? remoteAddress.getAddress().getHostAddress() : remoteAddress.getHostName();
int port = remoteAddress.getPort();
Channel channel = super.getChannel(remoteAddress);
if (channel == null) {
for (Map.Entry<URL, Client> 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);
}
}
}
}