我正在编写JmsAdapter,其中有两个方法称为sendMessage用于发送消息,而receiveMessage用于在春季启动时接收消息,我有一个服务类EventService,它使用此JmsAdapter发送消息。现在我很困惑在JMSAdapter中收到消息时该怎么办,因为我不想在侦听器receiveMessage方法中放入任何业务逻辑(例如db调用,消息处理)。我这样做是为了将业务逻辑与JMS适配器分开这里是JMSAdapter的代码-

public class JmsAdapter {

@Autowired
private JmsTemplate jmsTemplate;

public void sendMessage(final String jsonMessage) throws JMSException {
    System.out.println("Sending message = " + jsonMessage);
    //TODO replace the queue name based from DB
    jmsTemplate.convertAndSend("sender", jsonMessage);
    System.out.println("Message Sent");
}

@JmsListener(destination = "${receiver}")
public String receiveMessage(final Message jsonMessage) throws JMSException {
    System.out.println("Received message " + jsonMessage);
    String response = null;
    if(jsonMessage instanceof TextMessage) {
        TextMessage textMessage = (TextMessage)jsonMessage;
        response = textMessage.getText();
        System.out.println("Message Received = "+response );
    }
    return response ;
}


我是否需要以不同的方式思考。还有什么其他选择?由于对适配器和服务的循环依赖。

最佳答案

我认为理想的方法是将发送和接收消息的责任分开。一类职责多于一个的类容易造成这种混乱。
如果您对使用EJB没有保留,则可以使用消息驱动Bean来侦听传入的消息。
如果不通过EJB,则应该有一个单独的类,该类负责侦听来自此特定队列的消息并处理该消息。为了进一步分离责任,您可以从侦听器调用在POJO中实现的方法(具有所有业务逻辑)。

10-06 08:29