Http to Пользовательский поток процессора генерирует org.springframework.expression.spel.SpelEvaluationException: EL1004E - PullRequest
0 голосов
/ 10 января 2020

У меня есть поток

    http | customprocessor

код для пользовательского процессора (UsageProcessor) выглядит следующим образом

public class UsageProcessor {

    private double ratePerSecond = 0.1;

    private double ratePerMB = 0.05;

    @Transformer(inputChannel = Processor.INPUT, outputChannel = Processor.OUTPUT)
    public UsageCostDetail processUsageCost(UsageDetail usageDetail) {
        UsageCostDetail usageCostDetail = new UsageCostDetail();
        usageCostDetail.setUserId(usageDetail.getUserId());
        usageCostDetail.setCallCost(usageDetail.getDuration() * this.ratePerSecond);
        usageCostDetail.setDataCost(usageDetail.getData() * this.ratePerMB);
        return usageCostDetail;
    }
}

при отправке ниже JSON запроса в поток из POSTMAN

{"userId":"user1", "duration":200, "data":"3000"}

получить ошибку ниже в журнале процессора использования

"Caused by: org.springframework.expression.spel.SpelEvaluationException: EL1004E: Method call: Method processUsageCost(byte[]) cannot be found on type"

, но тот же процессор с потоком ниже работает нормально, когда исходные данные автоматически генерируются с помощью UsageDetailSender

custom source | custom processor

where custom source is below "UsageDetailSender" and custom processor is above "UsageProcessor"


@EnableScheduling
@EnableBinding(Source.class)
public class UsageDetailSender {

    @Autowired
    private Source source;

    private String[] users = {"user1", "user2", "user3", "user4", "user5"};

    @Scheduled(fixedDelay = 1000)
    public void sendEvents() {
        UsageDetail usageDetail = new UsageDetail();
        usageDetail.setUserId(this.users[new Random().nextInt(5)]);
        usageDetail.setDuration(new Random().nextInt(300));
        usageDetail.setData(new Random().nextInt(700));

        //message emitted to kafka output channel called output
        this.source.output().send(MessageBuilder.withPayload(usageDetail).build());
    }
}

Что необходимо сделать, чтобы данные, полученные из источника HTTP, были успешно обработаны пользовательским процессором без

"Caused by: org.springframework.expression.spel.SpelEvaluationException: EL1004E: Method call: Method processUsageCost(byte[]) cannot be found on type"

1 Ответ

0 голосов
/ 11 января 2020

после изменения кода процессора исправлена ​​ошибка.

    @Transformer(inputChannel = Processor.INPUT, outputChannel = Processor.OUTPUT)
    public Message<String> processUsageCost(byte[] payload) throws ParseException {

        Gson gson = new Gson();
        String payloadStr=new JSONObject(new String(payload)).toString();
        UsageDetail usageDetail = gson.fromJson(payloadStr,UsageDetail.class);

        String userId = usageDetail.getUserId();
        long duration = usageDetail.getDuration();
        long data = usageDetail.getData();

        UsageCostDetail usageCostDetail = new UsageCostDetail();
        usageCostDetail.setUserId(userId);
        usageCostDetail.setCallCost(duration * this.ratePerSecond);
        usageCostDetail.setDataCost(data * this.ratePerMB);

        String message = gson.toJson(usageCostDetail);

        return MessageBuilder.withPayload(message).build();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...