Чтобы отправить сообщение из 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) {}
}