Skip to content

咨询一下顺序消息处理问题。 #268

@zangyk

Description

@zangyk

咨询一下顺序消息处理问题。

ConsumeMessageOrderlyService中ConsumeRequest 类的处理方式为:
final Object objLock = messageQueueLock.fetchLockObject(this.messageQueue);
synchronized (objLock) {
......
}
这样为了获得messageQueue的锁,这个线程会一直等待,同时也会影响到该线程对其他messageQueue处理效率。

是否可以使用下面的处理方式:
messageQueueLock改为存放每个messageQueue对应的ReentrantLock 对象,

ReentrantLock objLock = messageQueueLock.fetchLockObject(this.messageQueue);
if(objLock.tryLock())
{
try{
.....
}finally{
objLock.unlock();
}
}else
{
ConsumeMessageOrderlyService.this.submitConsumeRequestLater(this.messageQueue,this.processQueue,10);
}

如果获取到这个messageQueue的锁,则进行消息消费;
如果没有获取到锁,把该请求重新放到线程池中,该线程不会阻塞,可以继续处理线程池中的其他请求。这样的执行效率会提高很多。

不知道这样的更改是否有其他隐患?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions