2013-07-15 1 views
5

SOAP 서비스와 REST 서비스가 응용 프로그램 서버 외부에서 Jersey (Grizzly)를 사용하여 동일한 포트를 공유 할 수 있도록 구성하는 방법을 아는 사람이 있습니까?같은 포트에서 SOAP 서비스와 REST 서비스를 호스팅하는 방법은 무엇입니까?

  • 내 비누 서비스는
  • 가이 서비스는 같은
  • 내 나머지 서비스는 www.someurl.com:port/crm

에 있습니다을 공유 www.someurl.com:port/soap/crm에있다 동일한 기본 URL이 아니기 때문에 해당 포트에서 나란히 실행할 수 있어야합니다. 그러나 포트 바인드 오류가 있습니다.

이 모든 것은 맞춤 서비스 응용 프로그램에 있으며 web.xml 등은 없습니다.

REST 서비스는 Jersey를 사용하고 Soap 서비스는 엔드 포인트에 게시 된 클래스 'ReceptionService'입니다.

URI soapUri = URI.create("192.168.0.0:1234\soap\Crm") 
URI restUri = URI.create("192.168.0.0:1234\crm") 

// START SOAP SERVICE 
Object reception = getObjectResource(ReceptionService.class); 
Endpoint e = Endpoint.publish(soapUri, reception); 

// START REST SERVICE  
ResourceConfig rc = new ResourceConfig().packages("company.rest"); 
HttpServer server = GrizzlyHttpServerFactory.createHttpServer(restUri, rc); 

나는이 시도

는 그리즐리는 'java.net.BindException을 : 주소를 이미 사용 : 바인드'뱉어

내 비누 서비스 수신이 같은 설정입니다 :

@WebService(targetNamespace = "company.crm") 
    @SOAPBinding(style = SOAPBinding.Style.DOCUMENT, use = SOAPBinding.Use.LITERAL,  parameterStyle = SOAPBinding.ParameterStyle.WRAPPED) 
    public class Reception implements ReceptionService { 
    ... methods 
    } 

내 나머지 서비스 클래스는

@Path("hello/{username}") 
public class Hello { ... } 

내가 이것을에서 초보자의 비트입니다 ... 같은 평소와 같이 주석된다 어떤 포인터라도 감사 할 것입니다. 그리고 제발, 내가 응용 프로그램 서버를 실행하라는 제안을하지 마십시오. 여기서 문제가되지 않습니다. 문제는 다른 웹 서비스 프레임 워크로 이동하지 않고 포트 바인딩 문제를 해결하려면 어떻게해야합니까?

주 RE 현상금 :. 나도 같은 엔드 포인트에 함께 REST와 (JAX-WS 주석) 자바 SOAP 서비스에 대한 저지를 사용하는 방법을 보여줍니다 본 ENOUGH

"현상금 수상자를 반복 할 수없는 대답 것이다 Rest 및 Soap 어노테이션 클래스를 변경하지 않아도되지만 HTTP 서버 코드 변경 또는 작동하도록 구성 변경이 허용됩니다. Jetty 또는 다른 애플리케이션 서버로의 전환은 허용되지 않습니다. 솔루션은 100 % 임베디드되어 있어야하며 Java SE 및 Java 웹 서비스 라이브러리. "

+0

조금 더 많은 정보가 도움이 될 것입니다. 어떤 유형의 웹 서버/응용 프로그램 서버를 사용합니까? 'web.xml'은 어떻게 생겼습니까? –

+0

해결책을 찾았습니까? 나는 같은 문제에 직면하고있다. –

+0

아니. 나는 여전히 그들에게 별도의 항구를 지키고있다. 나는 많은 코드를 수정해야하고 시간이나 인내심이 없다. 희망은 미래에 구성 가능합니다. –

답변

1

웹 서비스에 tomcat과 같은 공통 컨테이너를 사용하는 경우 동일한 포트에 도착하는 두 서비스에 대한 요청을받을 수 있습니다. 응용 프로그램의 일부로 REST 및 SOAP 기반 서비스를 모두 배포 할 수 있습니다. 컨테이너는 들어오는 요청을 받아들이고 응용 프로그램 컨텍스트에 따라 응용 프로그램으로 전달합니다. 응용 프로그램 web.xml에서 요청 URL 매핑에 따라 요청을 보낼 위치를 구성 할 수 있습니다.

+0

감사합니다. 고객 서버 응용 프로그램에서 Jersey (Glassfish 외부)를 사용하고 있습니다. 위의 정보를 더 게시하고 누군가가 해결책을 제시 할 것입니다. –

2

당신이 말하는 것은 서비스를 제공하기위한 두 가지 다른 인터페이스 일 뿐이지요. 그렇습니다. 단일 포트에서 호스팅 할 수 있습니다. 동일한 컨테이너에 배치하기 만하면 인터페이스가 작동하고 실행됩니다.

위의 질문에서 언급 한 URL에서 발생하지 않는 컨텍스트 경로 충돌이 없는지 확인하십시오.

예컨대 나머지 인터페이스를 다음과 같이 배치하십시오.

www.someurl.com : port2/crm이므로 soap은 동일한 URL (www.someurl.com:port1/soap/crm)에 배포하면 안됩니다. 괜찮습니다.

또한 인터페이스를 배포하는 방법을 별도의 war 파일이나 단일 war 파일로 설명해야합니다.

+0

감사합니다. 하지만 동일한 URL 포트를 공유해야합니다. 위와 같이 코딩 된 응용 프로그램 서버가 없으며 전쟁 파일이 없습니다. 그것은 별도의 포트에서 잘 작동하지만 같은 포트를 공유 할 때 바인드 예외가 발생합니다. (끝 점이 실제로 다르지만) –

+0

여기에서 문제는 Endpoint.publish가 시작되고 HTTP 서버와 Grizzly 파트가 HTTP를 시작한다는 것입니다. 서버 때문에 포트 충돌이 발생했습니다. –

+0

그리즐리에게 비누 서비스도 제공하려면 어떻게해야합니까? IE. 리셉션 서비스를 적절하게 나란히 게시 하시겠습니까? Microsoft Server와 Apache CMX도 동일한 동작을 허용하므로 방법이 있어야합니다. –

1

동일한 포트에서 둘 이상의 서비스를 시작할 수 없습니다.

동일한 포트를 통해 앱에 액세스 할 수있게하려면 애플리케이션 서버를 사용해야합니다.

서버의 Apps에 서로 다른 URL (web.xml)로 액세스 할 수 있어야합니다.

동일한 응용 프로그램 서버의 모든 응용 프로그램이 이제 동일한 포트에서 액세스 할 수 있습니다.

+0

응용 프로그램 서버에서 수행 할 수있는 경우 프로그램 서버없이 프로그램을 통해 수행 할 수 있습니다. 그렇다면 글래스 피시는 같은 포트에서 저지 (grizzly http)를 나머지 서버로 사용하고 비누 서비스를 제공합니다 ... 백만 달러의 질문입니다 :) –

4

부두의 오버레이 기능을 사용하면 서로 다른 경로를 가진 두 개의 다른 웹 응용 프로그램을 동일한 Jetty 인스턴스/포트에 배포 할 수 있습니다.

Jersey 서블릿 (REST 용)에는 하나의 web.xml이 있고 SOAP 서블릿에는 다른 web.xml이 있습니다.

http://www.eclipse.org/jetty/documentation/current/overlay-deployer.html

+0

OK. 내가 전부를 부두로 옮기면 그건 효과가있을거야. 그리고 저는 이제 Jetty를 Restful 측면으로 사용하고 있기 때문에 Guice와 손쉽게 구성 할 수있는 방식을 좋아하기 때문에 Soap도 그렇게 할 수 있습니다. –

+0

그렇다면 web.xml 파일을 포함하지 않는 솔루션이어야합니다.Jetty 및 XML 파일없이이 작업을 수행하는 방법을 보여줄 수 있다면 적절한 대답이라고 생각합니다. –

0

이 구성한 내가 완전히 (분명히 그리 즐 사용) 내 응용 프로그램에 포함 된 단일 포트 (2 개 개의 다른 컨텍스트 경로)에 모두 휴식과 비누 서비스를 호스트하는 데 사용하는 코드, 봄의 대부분이다. ..

package com.mycompany.structure.web.grizzly; 

import java.io.IOException; 
import java.lang.reflect.Constructor; 
import java.net.BindException; 
import java.util.EnumSet; 
import java.util.LinkedList; 
import javax.servlet.DispatcherType; 
import javax.servlet.Servlet; 
import com.mycompany.structure.web.jersey.jackson.JsonResourceConfig; 
import com.mycompany.structure.web.jersey.spring.ExposedApplicationContext; 
import org.glassfish.grizzly.http.server.HttpHandler; 
import org.glassfish.grizzly.http.server.HttpServer; 
import org.glassfish.grizzly.http.server.NetworkListener; 
import org.glassfish.grizzly.jaxws.JaxwsHandler; 
import org.glassfish.grizzly.servlet.WebappContext; 
import org.glassfish.jersey.servlet.ServletContainer; 
import org.smallmind.nutsnbolts.lang.web.PerApplicationContextFilter; 
import org.springframework.beans.BeansException; 
import org.springframework.beans.factory.DisposableBean; 
import org.springframework.beans.factory.config.BeanPostProcessor; 
import org.springframework.context.ApplicationContext; 
import org.springframework.context.ApplicationContextAware; 
import org.springframework.context.ApplicationEvent; 
import org.springframework.context.ApplicationListener; 
import org.springframework.context.event.ContextRefreshedEvent; 

public class GrizzlyInitializingBean implements DisposableBean, ApplicationContextAware, ApplicationListener, BeanPostProcessor { 

    private static final Class[] NO_ARG_SIGNATURE = new Class[0]; 
    private HttpServer httpServer; 
    private LinkedList<WebService> serviceList = new LinkedList<>(); 
    private ServletInstaller[] servletInstallers; 
    private String host; 
    private String contextPath; 
    private String restPath; 
    private String soapPath; 
    private int port; 
    private boolean debug = false; 

    public void setHost (String host) { 

    this.host = host; 
    } 

    public void setPort (int port) { 

    this.port = port; 
    } 

    public void setContextPath (String contextPath) { 

    this.contextPath = contextPath; 
    } 

    public void setRestPath (String restPath) { 

    this.restPath = restPath; 
    } 

    public void setSoapPath (String soapPath) { 

    this.soapPath = soapPath; 
    } 

    public void setServletInstallers (ServletInstaller[] servletInstallers) { 

    this.servletInstallers = servletInstallers; 
    } 

    public void setDebug (boolean debug) { 

    this.debug = debug; 
    } 

    @Override 
    public synchronized void onApplicationEvent (ApplicationEvent event) { 

    if (event instanceof ContextRefreshedEvent) { 

     if (debug) { 
     System.setProperty("com.sun.xml.ws.transport.http.HttpAdapter.dump", "true"); 
     } 
     httpServer = new HttpServer(); 
     httpServer.addListener(new NetworkListener("grizzly2", host, port)); 

     WebappContext webappContext = new WebappContext("Grizzly Application Context"); 
     webappContext.addServlet("JAX-RS Application", new ServletContainer(new JsonResourceConfig(ExposedApplicationContext.getApplicationContext()))).addMapping(restPath + "/*"); 
     webappContext.addFilter("per-application-data", new PerApplicationContextFilter()).addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), restPath + "/*"); 
     webappContext.addListener("org.springframework.web.context.request.RequestContextListener"); 

     for (ServletInstaller servletInstaller : servletInstallers) { 
     try { 

      Constructor<? extends Servlet> servletConstructor; 
      Servlet servlet; 
      String urlPattern; 

      servletConstructor = servletInstaller.getServletClass().getConstructor(NO_ARG_SIGNATURE); 
      servlet = servletConstructor.newInstance(); 

      webappContext.addServlet(servletInstaller.getDisplayName(), servlet).addMapping((urlPattern = servletInstaller.getUrlPattern()) == null ? "/" : urlPattern); 
     } 
     catch (Exception exception) { 
      throw new GrizzlyInitializationException(exception); 
     } 
     } 

     webappContext.deploy(httpServer); 

     for (WebService webService : serviceList) { 

     HttpHandler httpHandler = new JaxwsHandler(webService.getService(), false); 

     httpServer.getServerConfiguration().addHttpHandler(httpHandler, soapPath + webService.getPath()); 
     } 

     try { 
     httpServer.start(); 
     } 
     catch (IOException ioException) { 
     if (!(ioException instanceof BindException)) { 
      throw new GrizzlyInitializationException(ioException); 
     } 
     } 
    } 
    } 

    @Override 
    public void setApplicationContext (ApplicationContext applicationContext) { 

    ExposedApplicationContext.register(applicationContext); 
    } 

    @Override 
    public Object postProcessBeforeInitialization (Object bean, String beanName) throws BeansException { 

    return bean; 
    } 

    @Override 
    public Object postProcessAfterInitialization (Object bean, String beanName) throws BeansException { 

    ServicePath servicePath; 

    if ((servicePath = bean.getClass().getAnnotation(ServicePath.class)) != null) { 
     serviceList.add(new WebService(servicePath.value(), bean)); 
    } 

    return bean; 
    } 

    @Override 
    public synchronized void destroy() { 

    if (httpServer != null) { 
     httpServer.shutdown(); 
    } 
    } 
} 
+0

굉장합니다. 나는 그것을 살펴볼 것이다. –