Приведенный ниже код можно вызвать только через JMS. Измените его так, чтобы он также был веб-сервисом. - PullRequest
0 голосов
/ 09 мая 2020

Приведенный ниже код можно вызвать только через JMS. Измените его так, чтобы он также был веб-сервисом.

@MessageDriven(name = "testMDB", activationConfig = {
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
@ActivationConfigProperty(propertyName = "destination", propertyValue = "queue/test") 
})

public class MessageOne implements MessageListener {
public void onMessage(Message message) {
    for (int i = 0; i < 1000; i++) {
        Process(i);
    }
}

private void Process(int i) throws Exception {
    Thread.sleep(5000); //This sleep represents really complex code that takes 5 seconds to run and cannot be further optimised                              
}
}

1 Ответ

0 голосов
/ 09 мая 2020

Чтобы отправить сообщение из REST, вы можете использовать шаблон простого сообщения для простых протоколов, таких как топт или просто JmsTemplate:

@Controller
public class MessageOneSender implements ApplicationListener<SessionDisconnectEvent> {

    private static final Logger log = LoggerFactory.getLogger(MessageOneSender.class);

    private final SimpMessageSendingOperations messagingTemplate;

    public MessageOne(SimpMessageSendingOperations messagingTemplate) {
        this.messagingTemplate = messagingTemplate;
    }

    @MessageMapping("/queue/test")
    @SendTo("queue/test")
    public MyDTO sendMessage(@Payload MyDTO myDTO, Principal principal) {
        // TODO
    }

    @Override
    public void onApplicationEvent(SessionDisconnectEvent event) {
        // or this way
        messagingTemplate.convertAndSend("queue/test", "message");
    }
}

Приведенный выше код предназначен для получения сообщения через rest и передачи его в JMS. Чтобы повторно использовать код из прослушивателя сообщений, вам, вероятно, придется добавить метод @JmsListener, переместить свой код в @Service, и вы можете вызвать его из состояния покоя и из метода прослушивателя:

@Component
public class MyDTOReceiver {

  @Autowired
  private MyService service;

  @JmsListener(destination = "queue/test", containerFactory = "myFactory")
  public void receiveMessage(MyDTO dto) {
    System.out.println("Received <" + dto + ">");
    service.save(dto);
  }
}


@RestController
@RequestMapping("/api")
public class Example {

  @Autowired 
  private JmsTemplate jmsTemplate;
  @Autowired 
  private MyService service;

  @PostMapping("/save")
  public void save(@RequestBody MyDTO dto) {
    service.save(dto);

    System.out.println("passing to another queue.");
    jmsTemplate.convertAndSend("queue/test2", dto);
  }
}

@Service
public class MyService {
  public void save(MyDTO dto) {}
}
...