Quais são os melhores padrões / designs para desenvolvimento de API com preservação de estado?

5

Estou prestes a implementar uma API para o meu servidor TCP / IP escrito em Java. Agora eu tenho um método temporário que leva uma String, executa um comando baseado na String e retorna uma String basicamente como a seguinte.

public void communicate(BufferedReader in, PrintWriter out) {
    while(true) {
        out.println(handleCommand(in.readLine()));
    }
}

private String handleCommand(String command) {
    if (command.equals("command1") {
        // do stuff
        return "Command 1 executed";
    } else if (command.equals("command2") {
        // do some other stuff
        return "Command 2 executed";
    }
}

Eu realmente quero fazer algo mais extensível, mais inteligente e com mais estado, para que eu possa lidar com comandos mais complexos e com estado e sem que o método / classe fique inchado.

Como você começaria?

Sugestões, ideias ou links para leitura adicional são muito bem-vindos.

    
por Svante 22.02.2011 / 14:11
fonte

2 respostas

2

Sugiro usar uma interface, como:

interface Command {
   public boolean doCommand();
}

enum CommandNames {
   COMMAND1("COMMAND1"),
   COMMAND2("COMMAND2");

   // other enum stuff

   // Gets a command based on a name
   public static CommandNames getCommand(String name);
}

Uso:

Map<CommandNames, Command> commands;

private String handleCommand(String command) {
   Command command = commands.get(CommandNames.getCommand(command));

   command.handleCommand();
}

Primeiro rascunho, mas deve pelo menos lhe dar algumas idéias.

    
por 22.02.2011 / 14:59
fonte
2

O mais fácil é o encadeamento por conexão. Com fluxo como:

while (true) {
    accept a connection ;
    create a thread to deal with the client ;
end while

Isso é bom o suficiente para o tráfego relativamente alto.

Para um desempenho extremo com tráfego muito alto, você precisaria de um servidor assíncrono e orientado a eventos. Estes tendem a ser mais complicados, então nesse caso eu recomendo que você baseie sua solução em um existente, como o JBoss ' Netty ou Apache MINA . Só que você tem idéia do desempenho aqui, servidores orientados a eventos que foram projetados para combater o problema C10K (10.000 conexões de cliente simultâneas).

    
por 22.02.2011 / 15:03
fonte