java - 下面的代码只能通过 JMS 调用。修改它,使其也是一个 Web 服务
问题描述
下面的代码只能通过 JMS 调用。修改它,使其也是一个 Web 服务。
@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
}
}
解决方案
要从 REST 发送消息,您可以将简单消息模板用于简单协议,例如 stomp 或只是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) {}
}
推荐阅读
- php - wordpress中的PHP函数删除斜杠
- node.js - 如何将 Keystonejs 添加到现有的 Express 应用程序
- python - 如何获得属性错误棒:“numpy.ndarray”对象没有属性“iloc”
- sql - 为两列之间的差异创建 SQL 代码并更改表
- gerrit - 从 gerrit api 通过 change_jd 获取修订
- mongodb - 如何设计模式以优化 UI 过滤器的填充和过滤?
- javascript - 将 Firebase 用户 uid 存储在会话存储中是一个漏洞吗?在客户端浏览器上的 javascript 中
- typescript - TypeScript 不遵循代码逻辑:无法调用可能“未定义”的对象
- python - 如何按索引对数据框列进行操作
- php - Twilio 会议录音