2013-09-05 7 views
2

J'ai ajouté la configuration ci-dessous dans mon contexte d'application client xml:JAX-RS connexion client Délai d'attente Manipulation Interceptor

<bean id="customTimeoutConfigInterceptor" class="com.hs18.inventory.client.interceptor.CustomTimeoutConfigInterceptor" /> 
<jaxrs:client id="inventoryServiceEndPoint" 
       address="http://$INVENTORY_CLIENT{inventory.api.host}:$INVENTORY_CLIENT{inventory.api.port}/api/1" 
       serviceClass="com.inventory.common.InventoryService" 
       inheritHeaders="true"> 
    <jaxrs:providers> 
     <ref bean="hs18ResponseExceptionMapper" /> 
    </jaxrs:providers> 
    <jaxrs:inFaultInterceptors> 
     <ref bean="customTimeoutConfigInterceptor" /> 
    </jaxrs:inFaultInterceptors> 
</jaxrs:client> 

lorsque les client arrive à expiration je veux mettre la demande dans une file d'attente de messages, je suis essayer ceci à travers la classe CustomTimeoutConfigInterceptor. Mais la méthode handleMessage n'est jamais invoquée. Voici le code.

public class CustomTimeoutConfigInterceptor extends AbstractPhaseInterceptor<Message> { 

    @Resource 
    InventoryServiceAsync inventoryServiceAsync; 

    public CustomTimeoutConfigInterceptor() { 
     super(Phase.PREPARE_SEND_ENDING); 
    } 

    @Override 
    public void handleMessage(Message message) throws Fault { 
     Exception exception = message.getContent(Exception.class); 
     if(exception.getMessage().equals("Connection Refused")){ 
      if(message.getContent(List.class) != null && !message.getContent(List.class).isEmpty()){ 
       Object request = message.getContent(List.class).get(0); 
       if(request.getClass().getAnnotation(Command.class) != null){ 
        inventoryServiceAsync.sendCommand((ICommand)request); 
       } 
      } 
     } 
    } 
} 

Répondre

0

Est-ce que cela s'applique à un client JAX-RS qui atteint une extrémité externe? Si oui, je peux dire deux choses:

  1. Le délai d'attente de connexion ou d'un client arrive sur la partie « out » de la pile de communication, de sorte que vous pouvez le mettre sur la place outFaultInterceptors

  2. Du point précédent suit que la phase définie sur votre constructeur d'intercepteur doit également être mise à jour, j'ai essayé de le mettre à Phase.POST_STREAM et semble fonctionner.