Servlet direcionando para um WebService em outra aplicação

5 respostas
A

Pessoal,

Estamos versionando um sistema existente, no qual utilizamos o JBOSS como servidor web.
Dai foi solicitado que fosse criado uma Servlet (AppRouter.ear) para receber uma requisição e dependendo da versão ativa, direcionará para outro contexto(arquivo-v1.ear).

Tentei utilizar o RequestDispatcher.forward() para direcionar, mas pelo que li não é possível realizar o direcionamento para outra aplicação.

Dai utilizei também o Response.sendRedirect(), consegui direcionar, porém como se trata de um Webservice SOAP, estou tendo dificuldades com relação aos dados do request/response para consumir este Webservice.

Alguém tem alguma sugestão para esta solução?

Abraço!

5 Respostas

jmag

Bom a um tempo atrás precisei criar um client para consumir serviços SOAP do JBoss AS 6, a classe é meio amarrada, mas funcionou para o meu Objetivo.

import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;

public class ClientFactory<T> {
	

	Class<T> klass;
	
	public ClientFactory(Class<T> klass){
		this.klass = klass;
	}
	
	@SuppressWarnings("unchecked")
	public T createFactory(String urlService){
		
		JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
    	factory.getInInterceptors().add(new LoggingInInterceptor());
    	factory.getOutInterceptors().add(new LoggingOutInterceptor());
    	factory.setServiceClass(klass);
    	factory.setAddress(urlService);
		T client = (T) factory.create();
    	
		return client;
	}
}
Vê ai se te ajuda, o Bean é passado como parâmetro.
public ControllerBlaBla(){
		this.clientFactory = new ClientFactory<BlaBlaBean>(BlaBlaService.class);
	}

E o WSDL é passado como parametro tambem..

urlService = blabla.?wsdl

blaService = clientFactory.createFactory(urlService);

hehe lendo melhor nao era isso que vc tava perguntando rsrs,mas fica ai se servir pra alguma coisa..
abraço!

A

Então, não me serve bem isso pois nesta aplicação eu não terei as classes dos serviços.

A idéia é assim: O cara vai acessar um link http://localhost:8180/SistemaRouter/Servlet?service=Corretor

Dai na servlet eu devo direcionar esse request para um serviço localizado em outra aplicação

http://localhost:8180/SistemaServico/Corretor
public class TesteServlet extends HttpServlet {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		if (request.getParameter("service").equalsIgnoreCase("Corretor"))
			response.sendRedirect("http://localhost:8180/SistemaServico/Corretor");
		else
			response.sendRedirect("http://localhost:8180/SistemaServico/?wsdl");	
	}
	
}

É possível fazer isso? Há alguma forma melhor?

jmag

E ai cara… bom nunca precisei fazer isso, mas acredito que sim hein, e faria do mesmo jeito que está fazendo rsrs…
Agora se nao deu certo assim, realmente nao sei o que fazer e precisaria dar um pesquisada…
abraço!

danieldestro

Acho que usar um ESB (Enterprise service Bus) resolve seu caso.
Mas se não quiser usar de tal recurso, que não é simples, constroi um Servlet que atua como proxy entre a requisição e seu webservice.

A

Fiz uma explicação melhor para deixar mais claro o problema…

  1. A idéia original era a de criar uma Servlet para receber as requisições de um browser/cliente, verificar qual serviço deve ser chamado e de qual versão e encaminhar o cliente para a URL do Webservice conforme EAR da versão correta utilizando o método forward() da classe RequestDispatcher. Este método simplesmente direciona no servidor a requisição para outra Servlet/Webservice sem que o cliente/browser saiba que houve o redirecionamento, e o segundo componente é o responsável de retornar para a o cliente a resposta da requisição inicial.
  • Fizemos o PoC (Prova de Conceito) utilizando na Servlet o método citado, porém constatamos que não há possibilidade de utilizar este método quando direcionamos para Componentes de diferentes aplicações, tanto utilizando endereço relativo ("…/AutoModular/v1001v") como endereços absolutos (“http://server/AutoModular/v1001/”).
  1. Após o insucesso da idéia original, foi testado o uso do método sendRedirect() da classe HttpServletResponse para realizar o mesmo processo do item 1.
  • Fizemos o PoC (Prova de Conceito) utilizando na Servlet o método citado passando o endereço absoluto (“http://server/AutoModular/v1001/”), o direcionamento começou a funcionar, porém constatamos que neste direcionamento a Servlet retorna a requisição para o cliente/brower no Header apenas o novo endereço e o browser/cliente é quem é o responsável por realizar uma nova requisição. Desta forma os dados que foram encaminhados inicialmente pelo cliente são perdidos, e na segunda requisição feita não ocorre o envio destes dados. Outro ponto negativo aqui é que existem 2 requisições por parte do cliente o que derruba a performance.
Criado 23 de agosto de 2011
Ultima resposta 24 de ago. de 2011
Respostas 5
Participantes 3