2

我在客户端应用程序上下文 xml 中添加了以下配置:

<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>

当客户端超时时,我想将请求放入消息队列中,我正在通过 CustomTimeoutConfigInterceptor 类进行尝试。但是该handleMessage方法永远不会被调用。下面是代码。

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);
                }
            }
        }
    }
}
4

1 回答 1

0

这是否适用于访问某个外部端点的 JAX-RS 客户端?如果是这样,我可以说几件事:

  1. 连接超时或客户端超时发生在通信堆栈的“out”部分,因此您可能希望将其设置outFaultInterceptors

  2. 从上一点可以看出,拦截器构造函数上设置的阶段也需要更新,我尝试将其设置为Phase.POST_STREAM并且似乎正在工作。

于 2017-07-27T20:01:42.033 回答