発端
- TCP/IPで複数のサーバへ同時に接続し受信する。
- 接続先は固定数では無く、運用中に不定期に追加される。
ってのが開発の前提条件
XMLファイルで設定するint-ip:tcp-inbound-channel-adapter等は静的な設定しか出来ないっぽくて接続先分予め用意する必要があるためやりたいことが出来ない。
従ってjavaでadapterの生成やchannelの設定を行うことにした。
事前準備
- bean生成用クラスに@Configuration()を設定
- メソッドに@Beanと@Scope("prototype")を設定する
- scopeをprotptypeにしないとsingletonとなるので注意
サンプルコード
TCP/IP受信アダプター
@Bean
@Scope("prototype")
public TcpReceivingChannelAdapter gettcpadapter(AbstractConnectionFactory connectionfactory) {
TcpReceivingChannelAdapter adapter = Tcp.inboundAdapter(connectionfactory)
.clientMode(true).autoStartup(false).get();
return adapter;
}
bean名を設定したい場合は、生成後に呼び出し元で付けないと反映されなかった。
<int:bridge>相当のオブジェクト生成
@Bean
@Scope("prototype")
public EventDrivenConsumer getBridge(SubscribableChannel input, MessageChannel output) {
// ハンドラも@bean生成した方が良いのか不明
BridgeHandler handler = new BridgeHandler();
handler.setOutputChannel(output);
EventDrivenConsumer bridge = new EventDrivenConsumer(input, handler);
return bridge;
}
受信データを最終的にXMLで定義したchannelに流したいので必要だった。
<int:header-enricher>相当のオブジェクト生成
@Bean
@Scope("prototype")
public EventDrivenConsumer getHeaderEnricher(SubscribableChannel input, MessageChannel output, String setmessage) {
Map<String, HeaderValueMessageProcessor<?>> headersToAdd = new HashMap<String, HeaderValueMessageProcessor<?>>();
headersToAdd.put("HOGE", new StaticHeaderValueMessageProcessor<String>(setmessage + "_hogehoge"));
HeaderEnricher transformer = new HeaderEnricher(headersToAdd );
MessageTransformingHandler handler = new MessageTransformingHandler(transformer );
handler.setOutputChannel(output);
EventDrivenConsumer consumer = new EventDrivenConsumer(input, handler);
return consumer;
}
ヘッダーに色々情報を付加したかったのでこれも必要だった。
終わりに
以上で必要なパーツは揃ったので今回はここまで
もう少し簡単な方法や他のパーツも必要な時は追記します。