Верблюд-http4 сообщение не работает, я не получил ответа

Это моя первая верблюжья реализация HTTP4 и возникли проблемы. Я не получаю ответа, как будто маршрут к URI неправильный, и сообщение идет??? это не делает вызов HTTP4, это появляется?

используя верблюд-версию 2.17.0.redhat-630310, Java 8

мой пом имеет зависимость

    <dependency>
        <groupId>org.apache.camel</groupId>
        <artifactId>camel-http4</artifactId>
    </dependency>

мой маршрут

    <route 
        id="core.getToken.route"
        autoStartup="true" >
        <from id="getToken" ref="getToken" />
        <process ref="uAARequestTokenProcessor" />
        <log message="Message after uAARequestTokenProcessor:  ${body}" loggingLevel="INFO"/> 
         <setHeader headerName="CamelHttpMethod">
            <constant>POST</constant>
         </setHeader>
        <to uri="http4://dummyhost" />
        <log message="After HTTP4 POST: ${body}" loggingLevel="INFO"/> 
        <to uri="{{accessToken}}" />    
    </route>    

Я вызываю uAARequestTokenProcessor для обработки исходящего сообщения.

public class UAARequestTokenProcessor implements Processor {

    private static final Logger LOG = LoggerFactory.getLogger(UAARequestTokenProcessor.class);

    @Override
    public void process(Exchange exchange) throws Exception {

        LOG.info("Entering UAA Request Token Processor: start " );

            final String clientId = (String)exchange.getIn().getHeader("CLIENTID");
            final byte[] ClientId = clientId.getBytes("UTF-8");
            final String userName = (String)exchange.getIn().getHeader("USERNAME");
            final String password = (String)exchange.getIn().getHeader("PASSWORD");
            final String tokenUrl = (String)exchange.getIn().getHeader("TOKENURL");

            LOG.info("ClientId: " + new String(ClientId));
            LOG.info("userName: " + userName);
            LOG.info("password: " + password);
            LOG.info("tokenUrl: " + tokenUrl);
            LOG.info("Processing UAA token request for Client ID: " + clientId + " and User Name: " + userName);            

            LOG.info("Before Base64 encryption of Client ID: " + new String(ClientId));
            StringBuilder authHeader = new StringBuilder("Basic "); 
            authHeader.append(Base64.getEncoder().encodeToString(ClientId));

            LOG.info("after Base64 encryption of Client ID: " + authHeader.toString());

            String body = String.format("grant_type=password&username=%s&password=%s",
                      URLEncoder.encode(userName, "UTF-8"), //Translates a string into x-www-form-urlencoded format
                      URLEncoder.encode(password, "UTF-8"));
            LOG.info("HTTP BODY: " + body);
            exchange.getIn().setHeader(Exchange.HTTP_URI, tokenUrl);  
            exchange.getIn().setHeader(Exchange.CONTENT_TYPE, "MediaType.APPLICATION_FORM_URLENCODE");
            exchange.getIn().setHeader("Authorization", authHeader.toString());
            exchange.getIn().setBody(body);

            LOG.info("Exchange.HTTP_URI: " + exchange.getIn().getHeader("Exchange.HTTP_URI"));  
            LOG.info("Exchange.CONTENT_TYPE: " + exchange.getIn().getHeader("Exchange.CONTENT_TYPE"));
            LOG.info("Authorization: " + exchange.getIn().getHeader("Authorization"));

            LOG.info("Exiting UAA Request Token Processor: Finish " );
        }

}

мне кажется, что заголовки Exchange.HTTP_URI или HTTP не устанавливаются, если только заголовки для HTTP4 не отличаются? но я следую за документом HTTP4, https://github.com/apache/camel/blob/master/components/camel-http4/src/main/docs/http4-component.adoc

что происходит внутри процессора, я пытаюсь прочитать заголовки HTTP, и он показывает, что они нулевые, после установки.

Entering UAA Request Token Processor: start
ClientId: ingestor.57e72dd3-6f9e-4931-b4bc-cd04eaaff3e3.1f7dbe12-2372-439e-8104-06a5f4098ec9
userName: 5c0642fe-a495-44db-93f7-67056fa2c061_ingestor
password: 154f0252d166f27b5e21ef171b02a79f41a0daf3
tokenUrl: http4://d1e53858-2903-4c21-86c0-95edc7a5cef2.predix-uaa.run.aws-usw02-pr.ice.predix.io/oauth/token
Processing UAA token request for Client ID: ingestor.57e72dd3-6f9e-4931-b4bc-cd04eaaff3e3.1f7dbe12-2372-439e-8104-06a5f4098eff9 and User Name: 5c0232fe-a495-44db-94f7-67156fa2c061_ingestor
Before Base64 encryption of Client ID: ingestor.57e72dd3-6f9e-4931-b4bc-cd04eaaff3e3.1f7dbe12-2372-439e-8104-06a5f4098eff9
after Base64 encryption of Client ID: Basic aW5nZXN0b3IuNTdlNzJkZDMtNmY5ZS00OTMxLWI0YmMtY2QwNGVhYWZmM2UzLjFmN2RiZTEyLTIzNzItNDM5ZS04MTA0LTA2YTVmNDA5OGVjOQ==
HTTP BODY: grant_type=password&username=5c0232fe-a495-44db-94f7-67156fa2c061_ingestor&password=154f0252d166f27b5e21ef171b02beebop
Exchange.HTTP_URI: null
Exchange.CONTENT_TYPE: null
Authorization: Basic aW5nZXN0b3IuNTdlNzJkZDMtNmY5ZS00OTMxLWI0YmMtY2QwNGVhYWZmM2UzLjFmN2RiZTEyLTIzNzItNDM5ZS04MTA0LTA2YTVmNDA5OGVjOQ==
Exiting UAA Request Token Processor: Finish

Трассировка стека показывает заголовки, но не как EXCHANGE.HTTP_URI

    2018-04-23 13:17:29,203 | INFO  | ile://ge-ip/core | Tracer                           | 231 - org.apache.camel.camel-core - 2.17.0.redhat-630310 | ID-alphprdfuse2i-44477-1524503724804-3-52 >>> 
(core.getToken.route) setHeader[CamelHttpMethod, POST] --> http4://predhost <<< Pattern:InOnly, 
Headers:{Authorization=Basic aW5nZXN0b3IuNTdlNzJkZDMtNmY5ZS00OTMxLWI0YmMtY2QwNGVhYWZmM2UzLjFmN2RiZTEyLTIzNzItNDM5ZS04MTA0LTA2YTVmNDA5OGVjOQ==, 
breadcrumbId=ID-alphprdfuse2i-44477-1524503724804-3-50, 
CamelFileAbsolute=false, 
CamelFileAbsolutePath=/app/iprctest/jboss-fuse-6.3.0.redhat-310/ge-ip/core/Noble/nst_dge-1_2018-04-10_19-55-10.CSV, CamelFileLastModified=1524503800000, 
CamelFileLength=3706, CamelFileName=Noble/nst_dge-1_2018-04-10_19-55-10.CSV, CamelFileNameConsumed=Noble/nst_dge-1_2018-04-10_19-55-10.CSV, CamelFileNameOnly=nst_dge-1_2018-04-10_19-55-10.CSV, 
CamelFileNameProduced=ge-ip/upload/Noble/nst_dge-1_2018-04-10_19-55-10.CSV, CamelFileParent=ge-ip/core/Noble, 
CamelFilePath=ge-ip/core/Noble/nst_dge-1_2018-04-10_19-55-10.CSV, CamelFileRelativePath=Noble/nst_dge-1_2018-04-10_19-55-10.CSV, CamelHttpMethod=POST, 
CamelHttpUri=http4://d1e53858-2903-4c21-86c0-95edc7a5cef2.pred-uaa.run.aws-usw02-pr.ice.pred.io/oauth/token, 
CLIENTID=ingestor.57e72dd3-6f9e-4931-b4bc-cd04eaaff3e3.1f7dbe12-2372-439e-8104-06a5f4098ec9, 
Content-Type=MediaType.APPLICATION_FORM_URLENCODE, 
CUSTKEY=Noble, PASSWORD=154f0252d166f27b5e21a79f41a0daf3, 
TENANTUUID=c0642fe-a495-44db-93f7-67056fa2c061, 
TOKENURL=http4://d1e53858-2903-4c21-86c0-95edc7f2.pred-uaa.run.aws-usw02-pr.ice.pred.io/oauth/token, 
UPLOADURL=http4://apm-times-query-svc-prod.app-api.aws-usw02-pr.pred.io/v2/time_series/upload, 
USERNAME=5c0642fe-a495-44db-93f7-67056fa2c061_ingestor}, 
BodyType:String, Body:grant_type=password&username=5c0642fe-a495-44db-93f7-2c061_ingestor&password=154f0252d166f2ef171b02a79f41a0daf3

Http4://predhost является фиктивным URI в весеннем XML и должен быть переопределен exchange.getIn(). SetHeader(Exchange.HTTP_URI, tokenUrl);

Я никогда не достигаю конечной точки URL и никогда не достигаю сообщения журнала после перехода к HTTP4://

        <to uri="http4://predixhost" />
        <log message="After HTTP4 POST: ${body}" loggingLevel="INFO"/> 

Я пробовал следующее, но до сих пор не получил ответа, никаких исключений, ничего. установка заголовка CamelHttpUri для переопределения стандартного фиктивного uri и динамического toD,???

    <route 
        id="core.getToken.route"
        autoStartup="true" >
        <from id="getToken" ref="getToken" />
        <process ref="uAARequestTokenProcessor" />
<!--        <log message="Message after uAARequestTokenProcessor:  ${body}" loggingLevel="INFO"/>   -->
         <setHeader headerName="CamelHttpMethod">
            <constant>POST</constant>
         </setHeader>
<!--         <setHeader headerName="CamelHttpUri">
            <simple>${header.TOKENURL}</simple>
         </setHeader>  -->
        <toD uri="${header.TOKENURL}" />
        <log message="After HTTP4 POST: ${body}" loggingLevel="INFO"/> 
        <to uri="{{accessToken}}" />    
    </route> 

Я не знаю что не так? Я не могу получить ответ, исключение, похоже, я не могу отправить в конечную точку HTTP4. Я достигаю сейчас, проверил мои настройки прокси в среде, а также попытался в контексте верблюда, я не знаю, что происходит или что делать, у меня нет информации для входа, чтобы продолжить,...

<camelContext     
  id="com.passthru.coreCamelContext"
  trace="true"
  xmlns="http://camel.apache.org/schema/blueprint"
  allowUseOriginalMessage="false"
  streamCache="true"
  errorHandlerRef="deadLetterErrorHandler" >
 <properties>
       <property key="http.proxyHost" value="PITC-Zscaler-Americas-Cin.proxy.corporate.comp.com"/>
       <property key="http.proxyPort" value="80"/>
  </properties>

<streamCaching  id="CacheConfig" 
                spoolUsedHeapMemoryThreshold="70" 
                anySpoolRules="true"/>

Я пытался с CURL, и он работает из командной строки, я пытался с почтальоном, и это работает. Спасибо за вашу помощь.

Для этого просто отправьте сообщение в службу UAA(https) с текстом:

grant_type=password&username=myUserName&password=myPassword

и заголовки:

Content-Type=application/x-www-form-urlencoded
Authorization=Basic aW5nZXN0b3IuNTdlNzJkZDMt==

и сервер выдаст токен доступа.

как этот пример почтальона:

OkHttpClient client = new OkHttpClient();
MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded");
RequestBody body = RequestBody.create(mediaType, "username=93f7c061_ingestor&password=15a79f41a0daf3&grant_type=password");
Request request = new Request.Builder()
  .url("https://d1e53858-2903-4c21-86c0-95edc7a5cef2.uaa.run.aws-usw02-pr.ice.io/oauth/token")
  .post(body)
  .addHeader("Content-Type", "application/x-www-form-urlencoded")
  .addHeader("Authorization", "Basic aW5nZXN0b3IuNTdlNzJkZDMtNmY5ZS00OTMxLWI0YmMtY2QwNGVhYWZmM2UzLjFmN2RiZTEyLTIzNzItNDM5ZS04MTA0LTA2YTVmNDA5OGVjOTo=")
  .addHeader("Cache-Control", "no-cache")
  .addHeader("Postman-Token", "ad8ba9b0-6215-4c53-a6ef-b3a5bf7901f6")
  .build();

Response response = client.newCall(request).execute();

Здравствуйте, я надеюсь, что есть кто-то, кто может помочь, я застрял. Я подтвердил, я считаю, что конечная точка HTTP4 не работает. У меня очередь на рассылку

<bean id="deadLetterErrorHandler" class="org.apache.camel.builder.DeadLetterChannelBuilder">
    <property name="deadLetterUri" value="${deadLetterQueue}"/>
    <property name="redeliveryPolicy" ref="redeliveryPolicyConfig"/>
</bean>

<bean id="redeliveryPolicyConfig" class="org.apache.camel.processor.RedeliveryPolicy">
    <property name="maximumRedeliveries" value="3"/>
</bean>

и каждый обмен, отправленный на эту конечную точку, проверяется 3 раза, а затем отправляется в очередь рассылки сообщений. содержимое сообщения в очереди deadletter - это то, что должно быть отправлено на конечную точку HTTP4 и, следовательно, на службу UAA.

├── deadletterqueue
│   ├── ID-alphprdfuse2i-36326-1524606956414-3-65

grant_type=password&username=5c0642fe_ingestor&password=02a79f41a0daf3

заголовки сообщений, ведущие к этому, тоже выглядят хорошо.

core.getToken.route) log[HTTP4 POST body: ${body}] --> http4://d1e53858-2903-4c21-86c0-95edc7a5cef2.uaa.run.aws-usw02.io:443/oauth/token?throwExceptionOnFailure=false <<< Pattern:InOnly, Headers:{Authorization=Basic aW5nZXN0b3IuNTdlNzJkZDMtNmY5ZS00OTMxLWI0YmMtY2QwNGVhYWZmM2UzLjFmN2RiZTEyLTIzNzItNDM5ZS04MTA0LTA2YTVmNDA5OGVjOQ==, CamelHttpCharacterEncoding=UTF-8, CamelHttpMethod=POST, CamelHttpUri=http4://d1e53858-2903-4c21-86c0-95edc7a5cef2.uaa.run.aws.io:443/oauth/token, Content-Type=MediaType.APPLICATION_FORM_URLENCODE, TOKENURL=http4://d95edc7a5cef2.uaa.run.aws-usw02-pr.ice.io:443/oauth/token}, BodyType:String, Body:grant_type=password&username=5c06-a495-44db-93f7-67056fa2c061_ingestor&password=7b5e21ef171b02a79f41a0daf3

Я убежден, что с реализацией HTTP4 должно быть что-то не так. Мне не нужно выставлять веб-сервис, мне нужно только нажать на него. Я не могу заставить это работать. пожалуйста помоги.

1 ответ

Решение

Хорошо, это была многогранная проблема.

1-й мой настройки прокси был неправильным. Я обнаружил, что он должен быть установлен с IP-адресом или именем, кононическим именем без протокола http://.

У меня было это как:

<camelContext     
  id="com.ge.digital.passthru.coreCamelContext"
  trace="true"
  xmlns="http://camel.apache.org/schema/blueprint"
  allowUseOriginalMessage="false"
  streamCache="true"
  errorHandlerRef="deadLetterErrorHandler" >
  <properties>
       <property key="http.proxyHost" value="http://PITC-Zscaler-Americas.proxy.corporate.com"/>
       <property key="http.proxyPort" value="80"/>
  </properties>

но, как уже упоминалось, это, по-видимому, неправильно и не использовать протокол в def. лайк:

  <properties>
       <property key="http.proxyHost" value="PITC-Zscaler-Americas.proxy.corporate.com"/>
       <property key="http.proxyPort" value="80"/>
  </properties>

или же

  <properties>
       <property key="http.proxyHost" value="123.123.123.123"/>
       <property key="http.proxyPort" value="80"/>
  </properties>

это дало мне ответ, не тот, на который я надеялся, а тот, который дал мне надежду. это дало мне тайм-аут 504, ничего себе, я получил что-то обратно.:)

Во-вторых, конечная точка не работала...

m.setHeader(Exchange.HTTP_URI, tokenUrl);

с помощью

<toD uri="${header.TOKENURL}?throwExceptionOnFailure=false" />
<toD uri="${header.TOKENURL}" />

так что я просто попытался в пути

<to uri="http4://d1e53858-uaa.run.aws-usw02-pr.ice.io:443/oauth/token?throwExceptionOnFailure=false" />

с переездом

m.setHeader(Exchange.HTTP_URI, tokenUrl);

где tokenUrl был определен как

http4://d1e53858-uaa.run.aws-usw02-pr.ice.io:443/oauth/token

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

https://d1e53858-uaa.run.aws-usw02-pr.ice.io/oauth/token

и теперь я получаю CamelHttpResponseCode=401, CamelHttpResponseText= Несанкционированный

Я один счастливый турист, с этим я могу работать... Затем я протестировал ту же замену, задавая URI на маршруте в xml. и это тоже сработало.

 <setHeader headerName="CamelHttpMethod">
    <constant>POST</constant>
 </setHeader>
<log message="HTTP4 POST headers: ${headers}" loggingLevel="DEBUG"/>
<setHeader headerName="CamelHttpUri">
    <simple>${header.TOKENURL}?throwExceptionOnFailure=false</simple>
</setHeader>
<to uri="http4://d1e53858-uaa.run.aws-usw02-pr.ice.io/oauth/token?throwExceptionOnFailure=false" />

Я все еще пытаюсь заставить работать динамический маршрут, но я удовлетворен тем, что у меня есть, и сосредоточусь на этом позже.

<toD uri="${header.TOKENURL}?throwExceptionOnFailure=false" />
<toD uri="${header.TOKENURL}" /> -->

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

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