multithreading - 如何多线程解析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("&", "&")));
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("&", "&")));
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
}
}
解决方案
推荐阅读
- ios - 如何获取 UITextView 的完整快照
- dart - Flutter-如何以这种格式发布https?
- java - 无法保存实体可嵌入 ID
- python - 在 Ubuntu 上运行的 Python - TypeError:“Point”类型的对象不是 JSON 可序列化的
- jersey - 无法解决这个问题 UnsatisfiedDependencyException: There was no object available for injection at SystemInjecteeImpl
- android - 更新到 Android Studio 3.2 预览版后 - 项目显示错误找不到方法 create()
- mysql - 在 MySql 选择查询中使用条件
- python - 如何在 pandas 中使用 to_csv 函数时解决分隔符错误
- amazon-web-services - 我们如何使用 AWS 中的云形成在用户池中创建/添加用户?
- python - 使用 iPython 执行 python 脚本时出错