Pergunta

Eu tenho uma chamada RMI definido como:

public void remoteGetCustomerNameNumbers(ArrayList<String> customerNumberList, ArrayList<String> customerNameList) throws java.rmi.RemoteException;

A função faz uma pesquisa de banco de dados e preenche os dois ArrayLists. A função de chamada não ganha nada. Eu acredito que isso funciona com tipos Vector.

Eu preciso usar o vetor, ou se existe uma maneira de chegar a este trabalho sem fazer duas chamadas. Eu tenho algumas outras idéias que eu provavelmente iria usar, como retornar um par chave / valor, mas eu gostaria de saber se eu posso chegar a este trabalho.

Update:
Eu iria aceitar todas as respostas dadas até agora, se pudesse. Eu não sabia o custo de rede, por isso faz sentido para refazer a função para retornar um LinkedHashMap em vez dos dois ArrayLists.

Foi útil?

Solução

Como Tom menciona, você pode passar objetos remotos. Você teria que criar uma classe para manter sua lista que implementa remoto. Toda vez que você passar algo que implementa remoto como um argumento, sempre que os usos secundários de recebê-lo, ele se vira e faz uma chamada remota volta para o chamador para trabalhar com esse objeto.

Outras dicas

Os argumentos a RMI chama de serializado. Deserialisation no servidor cria uma cópia das listas. Se as listas permaneceu no lado do cliente, então o número de chamadas de rede seria bastante elevado. Você pode passar objetos remotos, mas cuidado com as implicações de desempenho.

Você perde suas referências quando você faz a chamada remota. Você precisará retornar as listas, em vez de esperar que eles sejam preenchidos pela chamada remota.

Como outros já mencionado, ao passar objetos como parâmetros para um método RMI, o objeto vai ser serializado, então desserializado na outra extremidade dentro do objeto-alvo que contém o método RMI. Isso quebra a referência dos objetos originais passaram em, como agora você tem dois objetos distintos: Um. No código do cliente chamando o método, e um no lado remoto

Neste exemplo específico, uma abordagem melhor seria para quebrar suas chamadas de método (desde que você parece estar a fazer duas coisas em um método: obter nomes de clientes e obter números de clientes) e, em vez ter seus resultados retornado para o chamador em vez do que passar em uma coleção ... como isto:

public ArrayList<String> getCustomerNames() throws java.rmi.RemoteException;

public ArrayList<String> getCustomerNumbers() throws java.rmi.RemoteException;

Uma vez que tanto ArrayList e Cordas implementar Serializable, os resultados na coleção será serializado e enviado através do fio para o código do cliente chamando o método, em que ponto você pode trabalhar com os dados, contudo, você precisa. Se em vez disso você precisa usar um objeto personalizado na coleção, desde que seus implementos classe a interface java.io.Serializable, e segue a especificação para essa interface que você não deve ter problemas.

Isso resultaria em duas chamadas separadas sobre o fio, mas é um muito mais limpo e interação mais simples, e evita a referência quebrando problema em seu exemplo original.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top