複数のグローバル HTTP コネクタと REST コンポーネントを使用してアプリを構成し、CloudHub にデプロイするのに苦労しています。
私のアプリケーションには 2 つのフローがあります。1 つはニュースの RSS フィードをポーリングし、そのフィードの json 表現を同じアプリの http インバウンド エンドポイントに投稿します (エンドポイントは 2 番目のフローにあります)。2 番目のフローはその投稿を受け取り、アイテムをストレージに永続化するなどの魔法を実行し、http アウトバウンド エンドポイントを介して外部 node.js Web アプリに通知し、Web ソケットを介してアイテムをアクティブなクライアントにプッシュします。
さまざまな HTTP グローバル コネクタと http のインおよびアウトバウンド エンドポイントを含む数十の異なる構成を試してみましたが、すべてを機能させることはできません。私は現在持っています:
- ポーリング HTTP コネクタ
- 上記のポーリング http コネクタを参照して RSS フィードを取得する HTTP エンドポイント
- メッセージを受信する 1 つのグローバル コネクタ (HTTP_ONE と呼びます)
localhost:${http.port}
- HTTP_ONE を参照するように構成され、アクティビティを /api/v1/activity にポストするように構成された HTTP アウトバウンド エンドポイント
- メッセージを受信するように構成された http インバウンド エンドポイント
/api/v1
と、このエンドポイントのすぐ後ろにあるジャージー コントローラー/activity
。
- 外部ホストがプロキシ ホスト名として設定された別のグローバル コネクタ (HTTP_TWO) (例: somehost.somewhere.com)。
- somehost.somewhere.com にメッセージを投稿するように構成された HTTP アウトバウンド エンドポイント
私のローカルホストでは、さまざまなプロパティを使用して、ラップトップの複数のポートでこのすべてのアクティビティを許可する必要がありました。
CloudHub では、外部 Web サービスを呼び出すアウトバウンド エンドポイントを除いて、どこでも localhost と ${http.port} を使用しています。
どちらか一方のフローを機能させることはできますが、両方を機能させることはできません.... 私の問題は、特定のニュース項目を RSS フィードからインバウンド HTTP エンドポイントに投稿することにあるようです。に投稿を送信してhttp://localhost:80/api/v1/activity
いますが、コネクタはそのようなパスが存在しないことを示しています (オプションとして /api/v1 のみがリストされています)。これにより、グローバルの背後にあるジャージー コントローラーまで呼び出しが到達していないと思われます。のコネクタと http インバウンド エンドポイント/api/v1/activity
。この動作は、REST コンポーネントと複数のグローバル http コネクタを使用する際の固有の欠陥ですか? また、アウトバウンド コールを行うときにグローバル HTTP コネクタを参照する必要があるのはなぜですか? デフォルトの HTTP コネクタを使用できないのはなぜですか? (たぶん、最後の 2 つの質問は、次の投稿に入れる必要があります...)
2 つのフローに関連するほとんどの構成を次に示します。
グローバル コネクタ
<http:polling-connector name="PollingHttpConnector" pollingFrequency="60000" doc:name="HTTP Polling" clientSoTimeout="10000" cookieSpec="netscape" receiveBacklog="0" receiveBufferSize="0" sendBufferSize="0" serverSoTimeout="10000" socketSoLinger="0" validateConnections="true"/>
<http:connector name="EduStream_HTTP" cookieSpec="netscape" validateConnections="true" sendBufferSize="0" receiveBufferSize="0" receiveBacklog="0" clientSoTimeout="10000" serverSoTimeout="10000" socketSoLinger="0" proxyHostname="${edustream.host}" doc:name="HTTP\HTTPS" proxyPort="80"/>
<http:connector name="EduStreamESB_HTTP" cookieSpec="netscape" validateConnections="true" sendBufferSize="0" receiveBufferSize="0" receiveBacklog="0" clientSoTimeout="10000" serverSoTimeout="10000" socketSoLinger="0" proxyHostname="localhost" proxyPort="${http.port}" doc:name="HTTP\HTTPS"/>
ニュース RSS フィードの流れ
<flow name="ucdNewsConsumer" doc:name="ucdNewsConsumer">
<http:inbound-endpoint address="http://news.ucdavis.edu/xml/getnews.php/rss/category/General%20Interest"
connector-ref="PollingHttpConnector" doc:name="HTTP" exchange-pattern="one-way"/>
<rss:feed-splitter/>
<rss:entry-last-updated-filter/>
<component class="edu.ucdavis.edustream.esb.news.rss.EntryReceiver" doc:name="Java"/>
<logger message="#[payload]" level="INFO" doc:name="Logger"/>
<http:outbound-endpoint exchange-pattern="request-response" host="localhost" port="${http.port}" path="api/v1/activity" doc:name="HTTP" mimeType="application/json" connector-ref="EduStreamESB_HTTP" />
<logger message="Payload is: #[payload] Inbound Headers: #[headers:INBOUND:*] Outbound Headers: #[headers:OUTBOUND:*] Exception is: #[exception]" level="INFO" doc:name="Logger"/>
</flow>
アクティビティ発行サービス -- コア フロー
<flow name="edustreamesbFlow1" doc:name="edustreamesbFlow1">
<http:inbound-endpoint exchange-pattern="request-response" host="localhost" port="${http.port}" doc:name="HTTP" contentType="application/json" mimeType="application/json" path="api/v1" connector-ref="EduStreamESB_HTTP"/>
<jersey:resources doc:name="REST">
<component class="edu.ucdavis.edustream.esb.activity.restapi.ActivityController"/>
</jersey:resources>
<component class="edu.ucdavis.edustream.esb.activity.restapi.JerseyResponseTransformer" doc:name="JerseyRespTrans"/>
<flow-ref name="PublishActivity" doc:name="Publish Activity"/>
</flow>
<sub-flow name="PublishActivity" doc:name="PublishActivity">
<component doc:name="ActivityService">
<spring-object bean="activityService"/>
</component>
<logger message="#[payload] #[message]" level="INFO" doc:name="Logger"/>
<http:outbound-endpoint exchange-pattern="request-response" host="${edustream.host}" port="80" path="api/v1/activity" mimeType="application/json" contentType="application/json" doc:name="HTTP" connector-ref="EduStream_HTTP"/>
</sub-flow>