Собственный способ отправить пользовательский объект в очередь JMS? (Цитрусовые-имитатор) - PullRequest
0 голосов
/ 27 апреля 2018

Я ищу собственный (правильный, с точки зрения фреймворка) способ отправки стороннего (пользовательского) объекта в JMS в citrus-simulator ? Я пробовал:

scenario
.send()
.payloadModel(myObject); 

но в очереди JMS myObject отображается как com.consol.citrus.message.DefaultMessage вместо com ... myObject .

Пример: Сценарий - получает запрос HTTP POST (как триггер) и отправляет объект JMS в очередь сообщений.

конфиг

...
.useObjectMessages(true)
...

сценарий

  ...
    import com.temafon.data.MORequest;

    @Scenario("morequest")
    @RequestMapping(value = "/simulator/morequest",method = RequestMethod.POST)

    public class JmsMoRequestScenario extends AbstractSimulatorScenario {

    @Override
    public void run(ScenarioDesigner scenario) {
       MORequest request = new MORequest(12345678901L, "USSD", "1172", "ON", 
       11L);
            request.setSourcePort(3);

        scenario
                .receive()
                .payload("getmorequest");

        scenario
                .send("jms.queue.destination")
                .payloadModel(request);

После этого случая я ожидаю получить в jms.queue.destination что-то вроде screen 1

Expectation

Reality

P.S. Я уже реализовал обходной путь с JavaActionBuilder и jmsTemplate.send в дополнительном классе и

scenario
.java(//Object).method(//instance");

Но это не похоже на правильный путь цитрусового симулятора

1 Ответ

0 голосов
/ 29 июля 2018

Установка payloadModel() в Citrus Java DSL всегда приводит к некоторому маршалловому представлению объекта, а это не то, что вам нужно. Ни один из них не использует .useObjectMessages(true), поскольку это приводит к тому, что весь объект сообщения Citrus будет использоваться в качестве полезной нагрузки сообщения.

Вам необходимо определить полный объект сообщения Citrus, и он останется нетронутым с точки зрения создания полезной нагрузки для места назначения JMS. Затем Citrus автоматически использует объектное сообщение JMS с соответствующей полезной нагрузкой объекта.

MORequest request = new MORequest(12345678901L, "USSD", "1172", "ON", 11L);
request.setSourcePort(3);

scenario
    .receive()
    .payload("getmorequest");

scenario
    .send("jms.queue.destination")
    .message(new JmsMessage(request));

Обратите внимание, что я использую .message() свободный API вместо payloadModel() API. API сообщения получает объект сообщения Citrus, например com.consol.citrus.jms.message.JmsMessage или com.consol.citrus.message.DefaultMessage

Ваш пользовательский объект модели домена request используется в качестве аргумента конструктора и приводит к сообщению JMS в качестве полезной нагрузки объекта как есть. Конечно, MORequest должен иметь тип java.io.Serializable

...