2016-07-08 9 views
2

У нас есть веб-сервис (jaxws), который вызывает другой веб-сервис (aslo jaxws). Конфигурация клиента JAXWS выглядит следующим образом -Связь между cxf-перехватчиками, слушателями и webservice (jaxws)

<jaxws:client id="helloClient" 
       serviceClass="demo.spring.HelloWorld" 
       address="http://localhost:9002/HelloWorld" > 
     <jaxws:outInterceptors> 
      <bean class="com.company.MyOutInterceptor"/> 
     </jaxws:outInterceptors> 
     <jaxws:inFaultInterceptors> 
      <bean class="com.company.MyInFaultInterceptor"/> 
     </jaxws:inFaultInterceptors> 
     <cxf:properties> 
      <entry key="org.apache.cxf.logging.FaultListener"> 
       <bean class="com.company.MyFaultListener"/> 
      </entry> 
     </cxf:properties> 
</jaxws:client> 

Как вы можете видеть, у нас есть два перехватчиков и один слушатель ошибки. Мы хотим общаться между этими перехватчиками, прослушивателями ошибок и кодом веб-службы. Как указано в SO THREAD, мы использовали объект cxf Exchange для связи между веб-службой и перехватчиком.

Наш inFaultInterceptor код выглядеть следующим образом -

public class MyInFaultInterceptor extends AbstractPhaseInterceptor<Message>  { 
     public MyInFaultInterceptor() { 
      super(Phase.RECEIVE); 
     } 

     public void handleMessage(Message message) { 
      message.getExchange().put("key", "value"); 
     } 

}

Out веб-сервис код выглядеть следующим образом -

public String addNumbers(int a, int b){ 
    try{ 
      myService.add(a,b); 
    }catch(MyServiceException e){ 
      //Logging 
    } 
    Object value = PhaseInterceptorChain.getCurrentMessage().getExchange().get("key"); 
} 

Но, внутр код веб-службы мы получаем null для данного «ключа», значит «ключ» отсутствует.

Есть ли способ, которым мы можем общаться между перехватчиками и веб-службами?

P.S: Мы можем общаться в пределах перехватчиков и слушателей с помощью вышеуказанного метода. То есть, мы можем получить доступ к набору ключей в outInterceptor in inFaultInterceptor, но ключи, установленные в любом перехватчике , или прослушиватель недоступен в веб-службе.

+0

'PhaseInterceptorChain' использует' ThreadLocal' для хранения сообщение. Вероятно, Exchange Messsage расходуется и очищается после завершения цепочки перехватчиков, и вы не можете его восстановить с помощью 'PhaseInterceptorChain.getCurrentMessage()' – pedrofb

ответ

1

Не уверен, что если есть какие-либо CxF во встроенном механизме, я использую ThreadLocal для передачи информации между методом WebService и перехватчик,

public final class KPContextHolder { 

    private static ThreadLocal<String> myKey = new ThreadLocal<>(); 

    private KPContextHolder() { 

    } 

    public static String getMyKey() { 
     return myKey.get(); 
    } 

    public static void setMyKey(final String input) { 
     myKey.set(input); 
    } 

    /** 
    * Clear all the fields saved in the thread context 
    */ 
    public static void clear() { 
     myKey.remove(); 

    } 

} 

перехватчик класса

public class MyInFaultInterceptor extends AbstractPhaseInterceptor<Message>  { 
      public MyInFaultInterceptor() { 
       super(Phase.RECEIVE); 
      } 

      public void handleMessage(Message message) { 
       KPContextHolder.setMyKey("value"); 
      } 
} 

и способ WebService.

public String addNumbers(int a, int b){ 
    try{ 
      myService.add(a,b); 
    }catch(MyServiceException e){ 
      //Logging 
    } 
    String value = KPContextHolder.getMyKey(); 
} 

Примечание:

  1. После использования вы должны явно очистить контекст потока иначе вы бы в конечном итоге утечки памяти

 Смежные вопросы

  • Нет связанных вопросов^_^