我只是发送了一个字符串,我不知道为什么会发生这种情况。客户端-版本: 4.5.2服务器-版本: 4.5.2
希望有人能帮助我!
private void sendMission(String pushId) {
try {
Message message = new Message();
message.setTopic(missionTpoic);
message.setBody(pushId.getBytes("utf-8"));
log.info("sendMission to MQ begin , message : {}", message);
rocketMQService.getProducer().send(message, new SendCallback() {
@Override
public void onSuccess(SendResult sendResult) {
log.info( "======== onSuccess ========== {}", sendResult);
}
@Override
public void onException(Throwable e) {
log.error( "======== onException ==========", e);
}
}, 10000L);
log.info("sendMission to MQ end, message : {}", message);
} catch (Exception e) {
throw new BusinessRuntimeException(BaseExceptionCode.SYSTEM_ERROR.getAdminCode(), e, "Occur a error when push message into mq.");
}
log.info("sendMissionDone!!! pushId : {}", pushId);
}例外情况如下:
2021-03-26 16:06:13 {:} ERROR AsyncSenderExecutor_1 c.p.b.p.c.SuperPushMissionExecutor:138 -- = onException =
java.util.ConcurrentModificationException:空
在java.util.HashMap$HashIterator.nextNode(HashMap.java:1445)
在java.util.HashMap$EntryIterator.next(HashMap.java:1479)
在java.util.HashMap$EntryIterator.next(HashMap.java:1477)
在org.apache.rocketmq.common.message.MessageDecoder.messageProperties2String(MessageDecoder.java:387)
在org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.sendKernelImpl(DefaultMQProducerImpl.java:767)
在org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.sendDefaultImpl(DefaultMQProducerImpl.java:557)
在org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.access$300(DefaultMQProducerImpl.java:90)
在org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl$3.run(DefaultMQProducerImpl.java:491)
在java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
在java.util.concurrent.FutureTask.run(FutureTask.java:266)
在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
在java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
在java.lang.Thread.run(Thread.java:748)
发布于 2021-05-25 01:44:39
我不知道问题是不是solved.It看起来像"rocketMQService.getProducer()“启动一个threadPool并使用多线程发送相同的”消息“,而"message.properties”是基于HashMap的,当使用线程访问HashMap时,它会抛出ConcurrentModificationException。
因此,解决方案是检查"rocketMQService.getProducer()“上的代码,不要使用多线程发送相同的”消息“。
https://stackoverflow.com/questions/66818527
复制相似问题