Как получить размер ответа от удаленного вызова Spring 2.5 HTTP? - PullRequest
3 голосов
/ 22 марта 2010

В Spring 2.5 я копался в пакете org.springframework.remoting.httpinvoker, пытаясь найти способ получить представление о размере ответа, но я продолжаю ходить кругами.

Через другой вопрос, который я здесь увидел, я думаю, что я хочу получить дескриптор InputStream, представляющий ответ от сервера, и затем обернуть его Apache commons-io CountingInputStream. Каков наилучший способ сделать это?

На данный момент я был бы рад просто напечатать размер ответа на стандартный вывод, но в конечном итоге я хочу сохранить его в известном месте в моем приложении для дополнительного отображения.

Ответы [ 2 ]

2 голосов
/ 22 марта 2010

Вы думаете по правильному пути, это просто требует уточнения со спецификой. Готовьтесь, я ударю вас кучей длинных имен классов ...

Фабрика на стороне клиента, которая генерирует заглушку, которая обращается к удаленной службе, - HttpInvokerProxyFactoryBean. Суперкласс (HttpInvokerClientInterceptor) имеет свойство с именем httpInvokerRequestExecutor, по умолчанию используется экземпляр SimpleHttpInvokerRequestExecutor.

Это созрело для подклассов и расширений; в частности, у него есть метод decorateInputStream, который вы можете использовать:

public class CountingHttpInvokerRequestExecutor extends SimpleHttpInvokerRequestExecutor {
   @Override
   protected InputStream decorateInputStream(InputStream is) throws IOException {
      return new CountingInputStream(super.decorateInputStream(is));
   }
}

А затем введите это в прокси-фабрику:

<bean class="org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean">
    <property name="httpInvokerRequestExecutor">
        <bean class="com.mycompany.CountingHttpInvokerRequestExecutor"/>
    </property>
      <!-- Plus the various other properties required by HttpInvokerProxyFactoryBean  -->
      <!-- URL, proxy interface, etc -->
</bean>

Затем уловка заключается в том, чтобы заполучить эту информацию, что потребует некоторой творческой перестройки. Например, вы могли бы получить новые экземпляры CountingInputStream из другой фабрики, которая затем выставила бы количество байтов в вашем пользовательском интерфейсе.

1 голос
/ 18 мая 2010

Выше было большинство того, что мне нужно было сделать, чтобы подключить Input / OutputStreams. Последний шаг, чтобы фактически сообщить информацию, включающую переопределение метода close() commons-io CountingStreams, чтобы просто сообщить общее количество байтов, прочитанных / записанных во время этого сеанса. Я распечатываю это, используя журнал, и мы идем! Это имеет недостаток, заключающийся в невозможности сопоставить размер с конкретным вызовом службы, но, возможно, некоторое дополнительное переопределение SimpleHttpInvokerRequestExecutor может добавить некоторую дополнительную регистрацию, хотя для этого потребуется синхронная регистрация, что является сомнительным предположением.

...