アプリケーションに非常に奇妙なバグがあります。ServiceMix でアプリケーションを実行すると、SimpleJdbcCall からの結果セットには、以前のストアド プロシージャ呼び出しからの以前の値が常にすべて含まれるという問題に直面しています。
ただし、ローカルで実行する場合は最後の値のみを保存します。
My Camel ルート (ダミー名あり):
<from ref="cronQuartzEndpoint"/>
<to uri="bean:userDAO?method=listAll"/>
<split>
<simple>${body}</simple>
<to uri="bean:myStoredProcCaller?method=requestAndStoreUserName" />
<to uri="bean:userDAO?method=saveUser" />
</split>
ストアド プロシージャの呼び出し元のロジックを見てみましょう。ストアド プロシージャがユーザーの名前を返し、id をパラメーターとして待機するとします。
public User requestAndStoreUserName(User user) {
LOG.info("userId: " + user.getId());
//I know it's not necessary but I added it to ensure that new RowMapper is generated
mySimpleJdbcCall.returningResultSet(USER_NAME_FIELD, new UserNameRowMapper());
mySimpleJdbcCall.compile();
Map<String, Object> results = mySimpleJdbcCall.execute(user.getId());
List<String> userNames = (List<String>)results.get(USER_NAME_FIELD);
LOG.info("userNames: " + userNames );
if ( !userNames .isEmpty() ) {
user.setName(userNames.get(0));
}
return user;
}
そして、私の RowMapper は次のように単純です:
private static class UserNameRowMapper implements RowMapper<String> {
@Override
public String mapRow(ResultSet rs, int rowNum) throws SQLException {
return rs.getString(USER_NAME_RESPONSE_FIELD_INDEX);
}
};
Camel ルートをローカルで実行した場合のログ:
- ユーザー ID: 1
- ユーザー名: [アリス]
- ユーザー ID: 2
- ユーザー名: [ボブ]
ServiceMix で実行した場合のログ:
- ユーザー ID: 1
- ユーザー名: [アリス]
- ユーザー ID: 2
- userNames: [アリス、ボブ]
アーティファクトの使用バージョンとすべての構成は、両側で同じです。この問題の背後にあるロジックは何ですか? ありがとう、ガーゲリー