【问题标题】:rocketMQTemplate.asyncSend throws ConcurrentModificationException at MessageDecoder.messageProperties2StringrocketMQTemplate.asyncSend 在 MessageDecoder.messageProperties2String 处抛出 ConcurrentModificationException
【发布时间】:2023-02-01 14:46:15
【问题描述】:

我正在使用 rocketmq-spring 发送版本为 2.1.0 的消息,有时我在 org.apache.rocketmq.common.message.MessageDecoder.messageProperties2String(MessageDecoder.java:414) 处遇到 ConcurrentModificationException,以下是详细日志。谢谢!

#[xx, 10.xx.52] INFO  2022-05-07 15:31:11.043 [XNIO-1 task-74, 29de7f06241a3313, 29de7f06241a3313] com.xx.common.IpProducerService.asyncSendMessage:45 - contentMap{refNo=xx, system=xx, ip=null, platformId=xx, userId=xxx}
#[fp, 10.xx.52] INFO  2022-05-07 15:31:11.043 [XNIO-1 task-74, 29de7f06241a3313, 29de7f06241a3313] com.xx.rocketmq.producer.RocketMqProducer.asyncInfo:19 - -=-=-= [Async Sending Message] -=-=-= 
 Topic                = TOPIC_xx_xx
 Tag                   = 
 MessageId        = null
 DelayLevel        = 0
 Content            = {"refNo":"xx","system":"xx","platformId":"xx","userId":"xx"}

#[fp, 10.xx.52] ERROR 2022-05-07 15:31:11.044 [AsyncSenderExecutor_3, , ] com.xx.rocketmq.producer.ProduceCallBack.onException:32 - asyncSendMessage caused exception.
java.util.ConcurrentModificationException: null
    at java.util.HashMap$HashIterator.nextNode(HashMap.java:1437)
    at java.util.HashMap$EntryIterator.next(HashMap.java:1471)
    at java.util.HashMap$EntryIterator.next(HashMap.java:1469)
    at org.apache.rocketmq.common.message.MessageDecoder.messageProperties2String(MessageDecoder.java:414)
    at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.sendKernelImpl(DefaultMQProducerImpl.java:790)
    at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.sendDefaultImpl(DefaultMQProducerImpl.java:584)
    at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.access$300(DefaultMQProducerImpl.java:97)
    at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl$4.run(DefaultMQProducerImpl.java:511)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
#[xx, 10.xx.52] INFO  2022-05-07 15:31:11.044 [AsyncSenderExecutor_3, , ] com.xx.common.IpProducerService.handleResult:49 - async produce status is F

【问题讨论】:

  • 希望可以有人帮帮我
  • 请提供足够的代码,以便其他人可以更好地理解或重现问题。
  • JDK: oracle jdk 1.8 rocketmq: 1 master 2 slave delger 4.7.1 spring-boot-starter-parent: 2.1.5.RELEAS

标签: java rocketmq concurrentmodificationexception


【解决方案1】:

使用不同的 rocketMQTemplates 实例发送相同的消息。

asyncSend 是在 rocketMQTemplates 中的 ThreadPool 上做的,那里有很多线程,所以你不能使用不同的 rocketMQTemplates 发送相同的消息(相同的消息使用相同的 propertiy HashMap,不是线程安全的)。

【讨论】:

    猜你喜欢
    • 2013-02-12
    • 2013-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-25
    • 2017-10-18
    • 1970-01-01
    相关资源
    最近更新 更多