0

私たちはアプリケーションの設計段階にあります。Spring-Integration を使用することにしました。開始点として、アプリケーションは、Task-executor を使用してポーリング ベースでマルチスレッド化された Inbound Adapter を使用して、JMS キューからメッセージを読み取ります。メッセージの監査ロギングの後、これらのレシーバー スレッドはメッセージをチャネルにドロップし、そこからワーカー スレッドが各メッセージを取得してさらに処理します。その後の処理自体には、メッセージの解析、ノード オブジェクトの構築、事前リンク、リンクなどのさまざまなコンポーネントが含まれます。ステップでは、メッセージの保存とノード オブジェクトの保存のためのインターセプターが含まれています。これは、以下の構成に従っています。

<int-jms:inbound-channel-adapter jms-template="jmsTemplate"  channel="channel1" id="MessageReceiver">
    <int:poller fixed-delay="100" time-unit="MILLISECONDS" task-executor="taskExecutor"/>
</int-jms:inbound-channel-adapter>
<int:channel id="channel1">
        <int:interceptors>
            <int:wire-tap channel="channel.tbl_message"/>
        </int:interceptors>
    </int:channel>

<bean id="dataSource" destroy-method="close"
    class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="${db.driverClassName}" />
    <property name="url" value="${db.host.url}" />
    <property name="username" value="${db.username}" />
    <property name="password" value="${db.password}" />
</bean>

<int-jdbc:outbound-channel-adapter channel="channel.tbl_message" data-source="dataSource"
    query="#{message.receiver.insert.query}" id="MessageLogger"></int-jdbc:outbound-channel-adapter>

<int:transformer input-channel="channel1" output-channel="channel2" method="parse" id="NodeBuilder">
    <bean class="com.recon.parser.NodeBuilder"></bean>
</int:transformer>
<int:channel id="channel2"/>

<int:filter input-channel="channel3" output-channel="channel5"
    discard-channel="channel4" method="validate" id="NodeValidator">
    <bean class="com.recon.util.Validator"></bean>
</int:filter>
<int:channel id="channel3">
    <int:interceptors>
        <int:wire-tap channel="channel.tbl_node"/>
    </int:interceptors>
</int:channel>
<int-jdbc:outbound-channel-adapter channel="channel.tbl_node" data-source="dataSource"
    query="#{valid.node.insert.query}" id="ValidNodePersist"></int-jdbc:outbound-channel-adapter>

<int:channel id="channel4"/>
<int-jdbc:outbound-channel-adapter channel="channel4" data-source="dataSource"
    query="#{validation.failure.insert.query}" id="FailedNodePersist"></int-jdbc:outbound-channel-adapter>

<int:transformer input-channel="channel2" output-channel="channel3" method="nodeEnricher" id="NodeEnricher">
    <bean class="com.recon.processor.NodeEnricher"></bean>
</int:transformer>

<int:channel id="channel5"/>
<int:service-activator input-channel="channel5" id="LinkerManager">
    <bean class="com.recon.manager.LinkerManager"></bean>
</int:service-activator>

1) ワーカー スレッドのスレッド プールを作成します。各ワーカー スレッドはノード プロセッサ以降のメッセージを処理し、スプリング統合を使用せずに単純なスプリングの依存性注入の方法で後続のすべてのコンポーネントを使用します。2) task-executor を使用して、各コンポーネントのスレッドプールを作成します。各コンポーネントの各スレッドは、前のチャネルにバッファリングされた入力オブジェクトを選択します。ただし、各コンポーネントがマルチスレッド化されるため、これにより多数のスレッドが作成されます。

選択するアプローチに関する解決策を誰か提案してもらえますか?

4

2 に答える 2

0

からフローを開始するとすぐにJMS message poller、メッセージをポーリング スレッドから他のスレッドに移動する理由がわかりません。一般的なロジックがその単一のスレッド内で実行され、この場合、アプリケーションのスループットが Poller TaskExecutor の同時実行性に依存する場合は、より良いでしょう。

audit logging、別のスレッドから実行される場合がありますmessage savingnode object savingこの場合QueueChannelはあなたのためです。私はそれらすべての<int:wire-tap>チャンネルを意味します。

于 2014-05-26T06:57:06.737 に答える
0

<wire-tap>@prasadshチャネルをQueueChannelに変換することで、必要なパフォーマンスを得ていますか? とにかく、jms からの入力メッセージを記録する channel.tbl_message があるので、channel1 を QueueChannel に変換することもできます。

同様の要件 (10k メッセージ/秒) があるため、解決策が機能しているかどうか知りたいです。

于 2014-05-29T02:19:28.290 に答える