首页 > 解决方案 > 下面的代码只能通过 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                              
}
}

标签: javaspring-bootjms

解决方案


要从 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) {}
}

推荐阅读