首页 > 解决方案 > 如何多线程解析JMS消息

问题描述

在我的 Spring Boot 项目中,我有两个 JMS 侦听器在侦听一个队列。从队列接收到的所有消息都必须以相同的方式处理,并在数据库 (Oracle) 中持久化/更新。目前,我在一个正在解析消息的类中有一个同步方法。parseMessage()正如预期的那样,所有线程同时读取消息,但是在方法( )同步时,解析是一一完成的。我想要的是同时解析消息并进行数据库操作。

我该如何解决这个问题?

我不想用相同的代码创建两个不同的类,并用于@Qualifier在每个侦听器中调用不同的类,因为解析消息的代码是相同的。

我认为理想的解决方案是在新类中使用新的同步方法进行数据库操作,但以多线程方式解析消息。因此,一次只有一个线程可以说持久/更新。当一个线程不等待持久化/更新时,它会在自己的线程上继续解析。

如果我错了或者您找到了最佳解决方案,请纠正我。让我知道是否需要任何其他信息。

JMS 控制器类

@RestController
@EnableJms
public class JMSController {

    @Autowired
    private IParseMapXml iParseMapXml;

    @JmsListener(destination = "${app.jms_destinaltion}")
    public void receiveMessage1(String recvMsg) {
        try {
            InputSource is = new InputSource(new StringReader(recvMsg.replaceAll("&", "&amp")));
            Document doc = new SAXReader().read(is);
            iParseMapXml.parseMessage(doc);
        } catch (Exception e) {

        }
    }

    @JmsListener(destination = "${app.jms_destinaltion}")
    public void receiveMessage2(String recvMsg) {
        try {
            InputSource is = new InputSource(new StringReader(recvMsg.replaceAll("&", "&amp")));
            Document doc = new SAXReader().read(is);
            iParseMapXml.parseMessage(doc);
        } catch (Exception e) {

        }
    }
}

解析 XML 接口

public interface IParseMapXml {
    
    public void parseMessage(Document doc);

}

解析实现

public class ParsingMessageClass implements IParseMapXml{

    @Override
    @Transactional
    synchronized public void parseMessage(Document doc) {
        // TODO Auto-generated method stub

        ....
        PROCESS DATA/MESSAGE

        ....
        DO DB OPERATIONS
    }

}

标签: multithreadingspring-bootsynchronized

解决方案


推荐阅读