Spring Integration - передайте Map в класс процессора - PullRequest
0 голосов
/ 05 сентября 2018

Я использую Spring Integration вместе с Spring JPA. Мне нужно прочитать данные из 5 таблиц и отправить их в один класс процессора для сложной обработки.

5 таблиц: UserExecution, UserExecutionDetail, Master, Inventory, Store.

Мне нужны кусочки данных из каждой из этих таблиц. Я не хочу создавать POJO для хранения данных БД, а вместо этого хочу сохранить данные БД на карте.

Затем карта будет передана в класс процессора для сложной обработки.

Каким должен быть код в процессоре? Я приложил код, который использовал ниже.

enter image description here

Класс процессора:

public class DataProcessor {
@Transformer
public void processUserData(Message<Map<String,String>> msg) {
    //Some complex logic using userDetailsMap
}

}

Получение данных БД:

    class ServicetoDBAdaptor {

@Autowired
UserExecutionDetail userExecutionDetail;

@Autowired
UserExecution userExecution;

@Autowired
Master master;

@Autowired
Inventory inventory;

@Autowired
Store store;

@Autowired
UserExecutionDetailRepository userExecutionDetailRepository;

@Autowired
UserExecutionRepository userExecutionRepository;

@Transactional(propagation=Propagation.REQUIRED)
@ServiceActivator
private void readFromTable1_UserExecutionDetail(Message<UserExecutionDetail> msg) throws Exception {
    userExecutionDetail = userExecutionDetailRepository.findById(msg.getPayload().getId());
}

@Transactional(propagation=Propagation.REQUIRED)
@ServiceActivator
private void readFromTable2_UserExecution(Message<UserExecutionDetail> msg) throws Exception {
    userExecution = userExecutionRepository.findById(msg.getPayload().getId());
}
@Transactional(propagation=Propagation.REQUIRED)
@ServiceActivator
private void readFromTable3_Master(Message<UserExecutionDetail> msg) throws Exception {
    master = userExecutionRepository.findById(msg.getPayload().getId());
}
@Transactional(propagation=Propagation.REQUIRED)
@ServiceActivator
private void readFromTable4_Inventory(Message<UserExecutionDetail> msg) throws Exception {
    inventory = userExecutionRepository.findById(msg.getPayload().getId());
}
@Transactional(propagation=Propagation.REQUIRED)
@ServiceActivator
private void readFromTable5_Store(Message<UserExecutionDetail> msg) throws Exception {
    store = userExecutionRepository.findById(msg.getPayload().getId());
}
Map<String,String> userDetailsMap = new HashMap<String,String>();
userDetailsMap.put("ID",msg.getPayload().getId());
userDetailsMap.put("ExecutionStatus",userExecution.getStatus());
userDetailsMap.put("ExecutionDetailStatus",userExecution.getDetailedStatus());
userDetailsMap.put("TotalOrders",master.getTotalOrders());
userDetailsMap.put("OrdersCompleted",inventory.getOrdersCompleted());
userDetailsMap.put("StoreStatus",store.getStoreStatus());

return userDetailsMap;
}

1 Ответ

0 голосов
/ 05 сентября 2018

попробуйте класс трансформатора, как показано ниже.

@Transformer
public SomeResponse processUserData((Message<?> message) {
// use message.getPayload() and cast it to map.
    //Some complex logic using userDetailsMap
}

и вызовите этот метод из потока, как показано ниже. Вы можете сохранить метод 'processUserData' в том же классе потока.

.transform(this)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...