cxf 와 Spring 결합 게시 서버 와 클 라 이언 트 및 차단기 설정 및 사용

9831 단어 spring
머리말
사실 인터넷 에는 CXF 가 Spring 과 어떻게 결합 하여 서 비 스 를 발표 하 는 지, 테스트 클 라 이언 트 를 어떻게 구축 하 는 지 에 대한 이야기 가 많다.그러나 종이 에 있 는 것 은 결국 얕 은 것 이다. 이번 프로젝트 가 만 났 고 스스로 실천 을 했 으 니 기록 을 하 자.기록 은 최고의 성장 이다.그리고 그 중 에 어 처 구 니 없 는 이상 한 사건 을 만 났 다.
 
사고
정상 적 인 자바 인터페이스 및 구현 클래스 를 실현 합 니 다.업무 실현 논 리 는 잠시 표시 하지 않 는 다. 이것 은 이 문장의 내용 이 아니다.
다음 과 같다.
com.***.fax.facade.tomi.CallBackNotifyFacade
com.***.fax.facade.tomi.CallBackNotifyFacadeImpl
CallBack Notify Facade 에 다음 과 같은 주 해 를 추가 합 니 다: @ WebService
CallBack Notify FacadeImpl 에 다음 과 같은 주 해 를 추가 합 니 다.
@WebService(endpointInterface = "com.qunar.fax.facade.tomi.CallBackNotifyFacade")
@Service("callBackNotifyFacadeImpl")
 
xml 설정 은 다음 과 같 습 니 다:
 
  <import resource="classpath:META-INF/cxf/cxf.xml"/>
    <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml"/>
    <import resource="classpath:META-INF/cxf/cxf-servlet.xml"/>

    <!-- http://localhost:8081/callBackNotifyFacade/callBackNotifyFacade?wsdl -->
    <jaxws:endpoint
            id="callBackNotifyFacade"
            implementor="com.***.fax.facade.tomi.CallBackNotifyFacadeImpl"
            address="/callBackNotifyFacade" >
      <jaxws:inInterceptors>
         <bean class="com.***.fax.facade.interceptor.CxfLoggingInInterceptor"/>
      </jaxws:inInterceptors>
      <jaxws:outInterceptors>
         <bean class="com.***.fax.facade.interceptor.CxfLoggingOutInterceptor" />
       </jaxws:outInterceptors>
    </jaxws:endpoint>

 그 중에서 CxfLoggingInInterceptor 와 CxfLoggingOutInterceptor 는 각각 입구 와 출구 차단기 이다.코드 는 다음 과 같 습 니 다:
 
 
 
public class CxfLoggingInInterceptor extends AbstractLoggingInterceptor {

    private static final Logger LOG = LogUtils.getLogger(LoggingInInterceptor.class);

    public CxfLoggingInInterceptor() {
        super(Phase.RECEIVE);
    }

    @Override
    protected Logger getLogger() {
        return LOG;
    }

    @Override
    public void handleMessage(Message message) throws Fault {
        //         
        long startTime = SystemTimer.currentTimeMillis();
        NDC.push(startTime + "_" + Thread.currentThread().getId());
    }
}

 
 
   
public class CxfLoggingOutInterceptor extends AbstractLoggingInterceptor {

    private static final Logger LOG = LogUtils.getLogger(CxfLoggingOutInterceptor.class);

    public CxfLoggingOutInterceptor() {
        super(Phase.PRE_STREAM);
    }

    @Override
    protected Logger getLogger() {
        return LOG;
    }

    @Override
    public void handleMessage(Message message) throws Fault {
        //     ,    
        NDC.pop();
        NDC.remove();
        NDC.clear();
    }
}

 
    pom. xml 설정 정보
   
<!-- cxf -->
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf</artifactId>
            <version>${cxf.version}</version>
            <type>pom</type>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-frontend-jaxws</artifactId>
            <version>${cxf.version}</version>
            <exclusions>
                <exclusion>
                    <artifactId>geronimo-javamail_1.4_spec</artifactId>
                    <groupId>org.apache.geronimo.specs</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-transports-http</artifactId>
            <version>${cxf.version}</version>
        </dependency>

  cxf. version 2.7.0
 
 
 
    서버 코드 는 여기까지 입 니 다.
 
3. 클 라 이언 트 테스트 코드
 
 /**
     *           
     */
    @Test
    public void testSendFaxCallBack(){

        try{
            //       
            String wsdlUrl="fax/test/callback.wsdl";
            JaxWsDynamicClientFactory dynamicClient = JaxWsDynamicClientFactory.newInstance();
            Client client = dynamicClient.createClient(wsdlUrl);

            //      
            HTTPConduit http = (HTTPConduit) client.getConduit();
            HTTPClientPolicy httpClientPolicy =  new  HTTPClientPolicy();
            httpClientPolicy.setConnectionTimeout( 36000 );
            httpClientPolicy.setAllowChunking( false );
            httpClientPolicy.setReceiveTimeout( 32000 );
            http.setClient(httpClientPolicy);

            //    
            String xml="。。。。。";

            //  ,     
            Object[] res = client.invoke("sendCallBack", xml);
            System.out.println("response: " + res[0]);
        }catch (Exception e){
            logger.warn("",e);
        }
    }

 
 
4. 개발 과정 에 나타 난 이상
1. 이상 정 보 는 다음 과 같다.
 
HTTP

 Status 500 - Servlet.init() for servlet CXFServlet threw exception

type Exception report
message Servlet.init() for servlet CXFServlet threw exception
description The server encountered an internal error that prevented it from fulfilling this request.
exception
javax.servlet.ServletException: Servlet.init() for servlet CXFServlet threw exception
	org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
	org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
	org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:861)
	org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:606)
	org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	java.lang.Thread.run(Thread.java:662)
root cause
org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'cxf' is defined
	org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:568)
	org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1099)
	org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:278)
	org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:198)
	org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1121)
	org.apache.cxf.transport.servlet.CXFServlet.loadBus(CXFServlet.java:77)
	org.apache.cxf.transport.servlet.CXFNonSpringServlet.init(CXFNonSpringServlet.java:71)
	org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
	org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
	org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:861)
	org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:606)
	org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)

 
 
   원인, 아래 설정 정보 가 도입 되 지 않 았 습 니 다.   
   
    <import resource="classpath:META-INF/cxf/cxf.xml"/>
    <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml"/>
    <import resource="classpath:META-INF/cxf/cxf-servlet.xml"/>

 
 
2. 이상 정 보 는 다음 과 같다.
Caused by: org.apache.cxf.binding.soap.SoapFault: Error reading XMLStreamReader.
at org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInInterceptor.java:70)
at org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessage(Soap11FaultInInterceptor.java:35)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:221)
at org.apache.cxf.interceptor.AbstractFaultChainInitiatorObserver.onMessage(AbstractFaultChainInitiatorObserver.java:96)
at org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:65)
at org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage(CheckFaultInterceptor.java:34)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:221)
at org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:429)

    원인: 이 오 류 는 나 로 하여 금 가장 두서 가 없 게 하 는 것 이다. 모든 설정 이 정상 적 이 고 로 컬 테스트 도 정상 적 이지 만 서버 에 오 르 기만 하면 오 류 를 보고 하기 때문이다.
    많은 이 유 를 찾 아 보 았 습 니 다. 많은 버 전 을 바 꾸 었 는데 모두 무효 입 니 다. 마지막 으로 우연히 발 표 된 스 크 립 트 job 에 checkurl 이 있 는 것 을 발 견 했 습 니 다. 최종 발표 가 성 공 했 는 지 확인 하기 위해 서 저 는 wdl 이 발표 한 url 로 썼 습 니 다. 그 결과 ws 서비스 가 완전히 일어나 지 않 았 을 때 이 url 은 계속 재 시도 되 었 습 니 다.이상 을 초래 하 다.
 
 

좋은 웹페이지 즐겨찾기