目前在做一个基于nats的paas项目时,碰到了一个诡异的问题。这个场景是业务A发送一个消息,业务B处理完以后应答,业务A拿到应答数据以后处理。
业务A --->request---->nats server dispatch--->业务B....--->发送应答---->nats server dispatch---->业务A
在我的macbook + JDK上运行时,大概有50%的概率会碰到业务A的两个线程收到同样的消息应答。
以下为业务A发送消息的代码,inbox是临时创建的一个唯一应答id(subject),如果是收到重复消息,应该是创建了不唯一的inbox。
@Override
public Request request(final String subject, String message, long timeout, TimeUnit unit, final Integer maxReplies, MessageHandler... messageHandlers) {
assertNatsOpen();
if (message == null) {
throw new IllegalArgumentException("Message can NOT be null.");
}
final String inbox = createInbox();
System.out.println(Thread.currentThread()+ " inbox == "+inbox);
final Subscription subscription = subscribe(inbox, maxReplies);
for (MessageHandler handler : messageHandlers) {
subscription.addMessageHandler(handler);
}
final ScheduledExecutorService scheduler = (channel == null) ? eve

最低0.47元/天 解锁文章
3382

被折叠的 条评论
为什么被折叠?



