如何将业务逻辑与JMS侦听器分开?

时间:2018-03-19 17:46:29

标签: java spring-boot jms spring-jms business-logic

我正在编写JmsAdapter,其中2个名为sendMessage的方法用于发送消息& receiveMessage用于在spring boot中接收消息,我有一个服务类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 ;
}

我需要以不同的方式思考。还有哪些其他选择?因为适配器和服务会存在循环依赖。

1 个答案:

答案 0 :(得分:0)

我认为理想的方法是分离发送和接收消息的责任。具有一种以上责任的班级往往会产生这种混淆。 如果您对使用EJB没有保留意见,则可以使用消息驱动Bean来侦听传入的消息。 如果不是通过EJB那么你应该有一个单独的类,它负责监听来自这个特定队列的消息并处理消息。为了进一步分离责任,您可以从侦听器调用POJO中实现的方法(这包含所有业务逻辑)。