-- PREDINE TEMPLATE DATA (STATIC DATA) IN BELOW TWO TABLES.
createtable FM_TEMPLATE ( ID NUMBER AUTO_INCREMENT, TYPE VARCHAR(16), -- ISSUANCE CREATE/UPDATE , RATE-FIXING, CUTODY NAME VARCHAR(64), CREATED_AT DATE, UPDATED_AT DATE );
createtable FM_TEMPLATE_COLS ( ID NUMBER AUTO_INCREMENT, TEMPLATE_ID NUMBER, NAME VARCHAR(32), TYPE VARCHAR(16), INDEX NUMBER, DFT_VAL VARCHAR(255), REQUIRED CHAR(1), FORMAT VARCHAR(64), CREATED_AT DATE, UPDATED_AT DATE );
-- END
-- USER CREATE DATA IN BELOW TWO TABLES
createtable FM_CONFIGURATION_TEMPLATE ( ID NUMBER AUTO_INCREMENT, CONFIG_NAME_PREFIX VARCHAR(64), TEMPLATE_ID NUMBER, HAS_HEADER CHAR(1), HEADER_CNT NUMBER, CREATED_AT DATE, UPDATED_AT DATE );
createtable FM_CONFIGURATION ( ID NUMBER AUTO_INCREMENT, CONFIG_TEMPLATE_ID NUMBER, CONFIG_NAME VARCHAR(255), COL_ID NUMBER, COL_IDX NUMBER, DFT_VAL VARCHAR(255), CREATED_AT DATE, UPDATED_AT DATE );
-- END
-- USER UPLOAD File createtable FM_UPLOAD ( ID NUMBER AUTO_INCREMENT, FM_CONG_ID NUMBER, FM_LOCATION VARCHAR(255), FM_STATUS VARCHAR(4), CREATED_AT DATE, UPDATED_AT DATE );
createtable FM_PARSE_DETAIL ( -- 记录解析信息,在 issuance 服务逐条解析创建时,try-catch-finally 最后统计入表。 ID NUMBER AUTO_INCREMENT, FM_UPLOAD_ID NUMBER, MSG VARCHAR(2048), -- e.g 200/200 records successfully created. 198/200 records create, 2/200 failed, reason: xxx CREATED_AT DATE, UPDATED_AT DATE );
createtable ct_sfkp_penalty_report( ID NUMBER AUTO_INCREMENT, sfkp_acc VARCHAR(32), frequency VARCHAR(4), -- daily/monthly location VARCHAR(255), CREATED_AT DATE, UPDATED_AT DATE )
createtable pmt_instruction( id NUMBER AUTO_INCREMENT, mail_id NUMBER, subject VARCHAR(255), status VARCHAR(6), receive_date DATE, comment VARCHAR(255), CREATED_AT DATE, UPDATED_AT DATE );
1.核心服务,负责监听所有入站的 swift message 的入口。使用 jms 监听 incoming queue,解析 message,并根据路由配置转发到其他服务。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
createtable swift_incoming_message( id NUMBER AUTO_INCREMENT, module_identifier VARCHAR(32), msg_type VARCHAR(8), module_name VARCHAR(8), sft_msg TEXT, CREATED_AT DATE, UPDATED_AT DATE );
createtable swift_message_routing( id NUMBER AUTO_INCREMENT, msg_type VARCHAR(8), module_name VARCHAR(8), receive_url VARCHAR(255), CREATED_AT DATE, UPDATED_AT DATE );
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
@JmsListener(destination = "queue-name") publicvoidreceive(String rawMessage){ try { // get delivery times from the broker, if more than 3 times, ignore processing. // default delivery times is 10, by more observation, we see almost all re-delivery // are due to our own handler logic, so its really not good to re-try with same error for 10 times. @Nullable BaseSwiftMessage swiftMsg = parseMessage(rawMessage); saveMessage(rawMessage, swiftMsg); List<Routing> routerConfs = getRoutingConfig(swiftMsg.msgType); callEachModule(routerConfs, swiftMsg); } catch (Exception ex) { // based on particular err to decide ignore or re-throw } }
PPA/Account_Bank/Issuance 的每笔账单校验,需要的 user 等级,以及需要几个 user 校验。
1 2 3 4 5 6 7 8 9 10 11
createtable pmt_threshold( id NUMBER AUTO_INCREMENT, module_name VARCHAR(8), pmt_amount DECIMAL, check1_level NUMBER, check2_level NUMBER, check3_level NUMBER, status VARCHAR(4), CREATED_AT DATE, UPDATED_AT DATE );
2.currency cutoff time
1 2 3 4 5 6 7 8 9 10
createtable pmt_ccy_cutoff( id NUMBER AUTO_INCREMENT, module_name VARCHAR(8), ccy VARCHAR(3), start_time VARCHAR(6), end_time VARCHAR(6), status VARCHAR(4), CREATED_AT DATE, UPDATED_AT DATE );
createtable user_detail ( id NUMBER AUTO_INCREMENT, u_id VARCHAR(7), m_id VARCHAR(7), level VARCHAR(2), region VARCHAR(5), CREATED_AT DATE, UPDATED_AT DATE );
@Bean ItemReader<User> reader(){ var itemReader = new FlatFileItemReader(filePath); LineMapper<User> lineMapper = new DefaultLineMapper<>(); var lineTokenizer = new DelimitedLineTokenizer(); lineTokenizer.setDelimiter(","); lineTokenizer.setNames(Arrays.stream(User.class.getDeclaredFields()).map(Field::getName).toArray(String[]::new)); defaultLineMapper.setLineTokenizer(lineTokenizer); var fieldSetMapper = new BeanWrapperFieldSetMapper<>(); fieldSetMapper.setTargetType(User.class); defaultLineMapper.setFieldSetMapper(fieldSetMapper); return itemReader; }