Ir para conteúdo
  • 0

[Duvida] Completable Future


Skizz

Pergunta

Estou tentando fazer um mini sistema para levar os players para outro servidor.

 

Codigo:

if(server.contains("-"))return;
		for(ServerInfo sv : Main.pl.getProxy().getServers().values()){
			if(sv.getName().split("-")[0].equalsIgnoreCase(server)){
				sv.ping(new Callback<ServerPing>() {

					@Override
					public void done(ServerPing ping, Throwable error) {
						if(error != null){
							if(ping.getPlayers().getOnline() < ping.getPlayers().getMax()){
								//O que chegar aqui vai ser o servidor que o player vai conectar
							}
						}
					}
				});
			}
		}

Alguma coisas como os splits são como o meu servidor vai ficar organizado.

Eu apenas queria que alguem pudesse me ajudar a pegar o servidor que chegar primeiro na ultima verificação, olhando pela internet parece que tenho que usar CompletableFuture, so que não entendi a logica dele.

 

OBS: Sou muito ruim para explicar as coisas.

Link para o comentário
Compartilhar em outros sites

6 respostass a esta questão

Posts Recomendados

 

Tentei fazer isso, mas não consegui

 

Erro:

19:21:25 [GRAVE] mai 07, 2017 7:21:25 PM io.netty.util.concurrent.DefaultPromise notifyListener0ADVERT?NCIA: An exception was thrown by net.md_5.bungee.BungeeServerInfo$1.operationComplete()java.lang.NullPointerException    at Bungee.Utils.Connect$2.done(Connect.java:54)    at Bungee.Utils.Connect$2.done(Connect.java:1)    at net.md_5.bungee.BungeeServerInfo$1.operationComplete(BungeeServerInfo.java:139)    at net.md_5.bungee.BungeeServerInfo$1.operationComplete(BungeeServerInfo.java:130)    at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:507)    at io.netty.util.concurrent.DefaultPromise.notifyListeners0(DefaultPromise.java:500)    at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:479)    at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:420)    at io.netty.util.concurrent.DefaultPromise.tryFailure(DefaultPromise.java:122)    at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.fulfillConnectPromise(AbstractNioChannel.java:327)    at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.finishConnect(AbstractNioChannel.java:343)    at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:612)    at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:559)    at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:476)    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:438)    at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:858)    at java.lang.Thread.run(Unknown Source)

Codigo:

public void connect(String server){		AtomicBoolean ab = new AtomicBoolean(false);		Iterator<ServerInfo> i = Main.pl.getProxy().getServers().values().iterator();		while (i.hasNext() && !ab.get()){			ServerInfo sv = i.next();			sv.ping(new Callback<ServerPing>() {				@Override				public void done(ServerPing ping, Throwable error) {					if(error != null){						if(ping.getPlayers().getOnline() < ping.getPlayers().getMax()){							p.connect(sv);							ab.set(true);						}					}				}			});		}

 

Não é assim, não mudou quase nada...

 

Era +- assim que tava falando...

Iterator<ServerInfo> servers = servers.iterator();static void recursivelyPing(final Iterator<ServerInfo> svs) {  if (svs.hasNext()) {    ServerInfo next = svs.next();    sv.ping(new Callback<ServerPing>() {      @Override      public void done(ServerPing ping, Throwable error) {        if(error != null){          if(ping.getPlayers().getOnline() < ping.getPlayers().getMax()){            p.connect(sv);          } else {            recursivelyPing(svs);          }        }      }    });  } else {    // nao tem mais servidores, pode kikar    System.out.println("nao tem sv");  }}
Link para o comentário
Compartilhar em outros sites

Você roda isso pra cada jogador?

 

Por que você não usa um AtomicBoolean ?

AtomicBoolean found  = new AtomicBoolean();
if(error != null){
  if(ping.getPlayers().getOnline() < ping.getPlayers().getMax() && !found.get()){
    // faz o que tem pra fazer
    fount.set(true);// só vai ser executado 1 vez.
  }
}
Link para o comentário
Compartilhar em outros sites

 

Você roda isso pra cada jogador?

 

Por que você não usa um AtomicBoolean ?

AtomicBoolean found  = new AtomicBoolean();
if(error != null){
  if(ping.getPlayers().getOnline() < ping.getPlayers().getMax() && !found.get()){
    // faz o que tem pra fazer
    fount.set(true);// só vai ser executado 1 vez.
  }
}

Toda vez que o jogar entrar no servidor e fizer o login vai ser executado isso.

Mas a principal questão é quando ele não acha um servidor para conectar o player, enche o console de erros. Eu queria kickar o jogar com uma mensagem, mas o for continua rolando e o primeiro callback não terminou.

Link para o comentário
Compartilhar em outros sites

Toda vez que o jogar entrar no servidor e fizer o login vai ser executado isso.

Mas a principal questão é quando ele não acha um servidor para conectar o player, enche o console de erros. Eu queria kickar o jogar com uma mensagem, mas o for continua rolando e o primeiro callback não terminou.

 

Você pode usar um Iterator, quando um retornar você verifica se está disponível, se tiver você manda o jogador senão você pega o próximo do Iterator e faz o ping novamente e assim por diante, se chegar no final do Iterator e não tiver achado nenhum servidor é só kickar....

Link para o comentário
Compartilhar em outros sites

Você pode usar um Iterator, quando um retornar você verifica se está disponível, se tiver você manda o jogador senão você pega o próximo do Iterator e faz o ping novamente e assim por diante, se chegar no final do Iterator e não tiver achado nenhum servidor é só kickar....

Tentei fazer isso, mas não consegui

 

Erro:

19:21:25 [GRAVE] mai 07, 2017 7:21:25 PM io.netty.util.concurrent.DefaultPromise notifyListener0
ADVERT?NCIA: An exception was thrown by net.md_5.bungee.BungeeServerInfo$1.operationComplete()
java.lang.NullPointerException
    at Bungee.Utils.Connect$2.done(Connect.java:54)
    at Bungee.Utils.Connect$2.done(Connect.java:1)
    at net.md_5.bungee.BungeeServerInfo$1.operationComplete(BungeeServerInfo.java:139)
    at net.md_5.bungee.BungeeServerInfo$1.operationComplete(BungeeServerInfo.java:130)
    at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:507)
    at io.netty.util.concurrent.DefaultPromise.notifyListeners0(DefaultPromise.java:500)
    at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:479)
    at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:420)
    at io.netty.util.concurrent.DefaultPromise.tryFailure(DefaultPromise.java:122)
    at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.fulfillConnectPromise(AbstractNioChannel.java:327)
    at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.finishConnect(AbstractNioChannel.java:343)
    at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:612)
    at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:559)
    at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:476)
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:438)
    at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:858)
    at java.lang.Thread.run(Unknown Source)

Codigo:

public void connect(String server){
		AtomicBoolean ab = new AtomicBoolean(false);
		Iterator<ServerInfo> i = Main.pl.getProxy().getServers().values().iterator();
		while (i.hasNext() && !ab.get()){
			ServerInfo sv = i.next();
			sv.ping(new Callback<ServerPing>() {

				@Override
				public void done(ServerPing ping, Throwable error) {
					if(error != null){
						if(ping.getPlayers().getOnline() < ping.getPlayers().getMax()){
							p.connect(sv);
							ab.set(true);
						}
					}
				}
			});
		}
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.
×
×
  • Criar Novo...