2016-05-30 10 views
2

私はバネ統合を使用してデータベースからデータを読み取ります。 は、今私は、ポーリング・アダプターを使用しSpring統合DSL JDBCインバウンド・チャネル・アダプター

@Bean 
public MessageSource<Object> jdbcMessageSource() { 
    JdbcPollingChannelAdapter a = new JdbcPollingChannelAdapter(dataSource(), "SELECT id, clientName FROM client"); 
    return a; 
} 

フロー:

@Bean 
public IntegrationFlow pollingFlow() throws Exception { 
    return IntegrationFlows.from(jdbcMessageSource(), 
       c -> c.poller(Pollers.fixedRate(30000).maxMessagesPerPoll(1))) 
      .channel(channel1()) 
      .handle(handler()) 
      .get(); 
} 

しかし、私は他のシステムからの私の流れをスケジュールしたいと思います。 これを行う方法を知っている人は誰ですか?

答えて

1

スケジュールはあなたの流れの観点から、他のシステム

からの私の流れはevent driven actionのように聞こえます。このためにはJdbcOutboundGatewayと同じSELECTを使用する必要があります。

もちろん、その外部システムのフックがフロー入力チャンネルのイベントを引き起こすことがわかります。これは、インバウンドチャネルアダプタまたはメッセージドリブンアダプタとすることができる。 JMS、AMQP、HTTPなどです。ミドルウェアにすでにあるものと、このアプリケーションから外部システムに何が公開されるかによって異なります。

+0

あなたは私の入力としてJdbcOutboundGatewayを使用する方法の任意の例を持っていますか? – Lukaszaq

+1

'JdbcOutboundGateway'は' MessageHandler'なので、そのプロパティに従ってそれを設定し、フロー内の '.handle()'から参照するだけで十分です。トリガアクションは任意の 'IntegrationFlows.from()'で行うことができます。 'onlyOnceTrigger'に関するあなたの答えは、「私の流れを他のシステムからスケジュールしたい」という質問を反映していません。 –

+0

JdbcOutboundGatewayを使用しようとすると[Assertion failed]が表示されます - この引数は必須です。 nullであってはいけません – Lukaszaq

0

私は私がカスタムトリガーの問題を解決すると思う:

public Trigger onlyOnceTrigger() { 
     return new Trigger() { 
       private final AtomicBoolean invoked = new AtomicBoolean(); 
       @Override 
       public Date nextExecutionTime(TriggerContext triggerContext) { 
        return this.invoked.getAndSet(true) ? null : new Date(); 
       } 
     }; 
} 

そして、私の流れ:

public IntegrationFlow pollingFlow() throws Exception { 
    return IntegrationFlows.from(jdbcMessageSource(), 
       c -> c.poller(Pollers.trigger(onlyOnceTrigger()).maxMessagesPerPoll(1))) 
      .channel(channel1()) 
      .handle(handler()) 
      .get(); 
} 
関連する問題