Fast Infoset не работает для JAXWS Glassfish Metro

Мы создаем высокопроизводительную серверную систему, которая будет отправлять и извлекать байт различного размера [], службу кэширования. Привязки имеют решающее значение для этого проекта, поэтому мы тестировали SOAP, REST и Fast Infoset и использовали клиент Memcached в качестве базового уровня.

Наши тесты не выявили разницы между временем прохождения туда-обратно клиентов SOAP и FastInfoset. Мои сообщения не содержат информацию заголовка, указывающую на приложение /fastinfoset. Из того, что я вижу, Fast Infoset не включается, потому что клиент не отправляет правильную информацию, потому что методика в руководстве Metro неверна или я что-то упустил.

Я делаю что-то неправильно? Есть ли лучшее решение?

На этом сайте есть решение для той же проблемы на CXF, но я не могу его использовать, я использую Metro. Пожалуйста, не ссылайтесь на это решение для меня.

Вот руководство по метро о том, как это должно работать:

  • Glassfish 3.1.2
  • JDK 1,7
  • Метро 2.2

Два клиента в моем тесте одинаково принимают одну строку кода.

((javax.xml.ws.BindingProvider) _port).getRequestContext().put(JAXWSProperties.CONTENT_NEGOTIATION_PROPERTY, "pessimistic");

Код клиента для клиента быстрого информационного набора выглядит следующим образом. (Просто вычтите вышеприведенную строку, и вы узнаете, как выглядит наш мыльный клиент.) Приведенное выше руководство указывает, что вышеуказанная строка - это все, что нам нужно, чтобы наш клиент JAXWS мог использовать FastInfoset.

 public EpCacheFiClient(long period) {      
     try {          
          _service = new EpCacheService(new URL(WSDL_URL_KEY), QNAME);
          _port = _service.getEpCachePort();            
          ((javax.xml.ws.BindingProvider) _port).getRequestContext().put(JAXWSProperties.CONTENT_NEGOTIATION_PROPERTY, "pessimistic");          
          if (_port != null) {              
               System.out.println("Found service port!");           
          } else {              
                 System.exit(128);          
          }     
     } catch (MalformedURLException e) {            
          e.printStackTrace();      
     }
}

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

POST /AlertPort HTTP/1.1
Content-Type: application/fastsoap; action="urn:alert"
Accepts: application/fastsoap, application/text+xml
Content-Length: ....
... sequence of octets …"

Учебное пособие с 2005 года, мы знаем, что поле HTTP-заголовка Content-Type изменилось, оно должно быть application/fastinfoset в соответствии с приведенной выше ссылкой на руководство по метро. Это свидетельствует о том, что я не испытываю ошибку, а скорее есть проблема с документацией. Надеюсь, я узнаю от добрых экспертов на этом форуме.

Вот как выглядят мои сообщения. Я отрубил бинарный файл. Обратите внимание на отсутствие каких-либо указаний службе о том, что для продолжения связи с этим клиентом следует использовать FastInfoset. Используя Wireshark, я могу однозначно сказать, что ни одно из сообщений, отправленных на мой сервер, не содержало информации заголовка, указывающей на FastInfoset.

POST /epcache/EpCacheService HTTP/1.1
Accept: text/xml, multipart/related
Content-Type: text/xml;charset=utf-8
SOAPAction: "urn:ProcessEpCacheSet"
User-Agent: JAX-WS RI 2.2.4-b01
Host: linux-xxxxx:8080
Connection: keep-alive

Я также хотел отметить, что я могу поместить все, что я хочу, в контекст запроса BindingProvider, и он будет отображаться в заголовке при каждом запросе, поэтому в моем тесте нет проблем с созданием _port.

1 ответ

В конце концов я обнаружил, что происходит, это были библиотеки. Рекомендуемые команды и техника сработали бы, если бы я использовал правильную строку. К сожалению, документация не различает внутренние и внешние библиотеки и использует устаревшее перечисление.

Короче говоря, если вы используете jax-ws, встроенные в JDK, используйте это свойство [1]; в противном случае попробуйте [2].

[1] com.sun.xml.internal.ws.client.ContentNegotiation [2] com.sun.xml.ws.client.ContentNegotiation

Все, что нужно, это знать магическое заклинание.

Пожалуйста, прочитайте следующее решение на форуме Glassfish, где я также разместил этот вопрос. http://home.java.net/forum/topic/glassfish/glassfish/fast-infoset-comparison-soap-not-faster

Другие вопросы по тегам