RabbitMQ RPC,每个请求(多线程)如何快速取到自己的返回值?

赵牧野 2018-08-15 05:43:06
RabbitMQ RPC,现在不知道怎么高效的取返回值。实际应用下,一个JVM下肯定有多个用户/线程访问,从回调队列返回的值,存入JVM的一个队列里,每个值都不能丢。

我想到一个办法,每个线程不断的取JVM队列里的值(从头取),不是自己的就返回队尾,这样肯定能找到,但是我怎么觉得,并发量大时效率会很低。

有其他的办法吗?
...全文
508 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵牧野 2018-08-28
  • 打赏
  • 举报
回复
引用 1 楼 verejava 的回复:
RPC 微分布式远程调用框架

http://www.verejava.com/?id=1756827901192



package com.zjf.spb.demo.controller;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

import org.springframework.util.StringUtils;

public class Lockservice
{
public static volatile Map<Integer, String> map = new HashMap<Integer, String>();

public final static Lock lock = new ReentrantLock();

public final static Condition canget = lock.newCondition();

public final static ReadWriteLock lock2 = new ReentrantReadWriteLock();

public static void setvalue(Integer id, String value)
{
try
{
lock.lock();

map.put(id, value);

canget.signalAll();
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
lock.unlock();
}
}

public static String getValue(Integer id)
{
String vlaue = null;

try
{
lock.lock();

while (true)
{
vlaue = map.get(id);

System.out.println("id=" + id + ", value=" + vlaue);

if (StringUtils.isEmpty(vlaue))
{
System.out.println("未获取到id=" + id + "的值,继续尝试获取");

canget.await();
}
else
{
System.out.println("获取到id=" + id + "的值,退出");

break;
}
}
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
lock.unlock();
}
return vlaue;
}

}

如此可否?
verejava 2018-08-16
  • 打赏
  • 举报
回复
RPC 微分布式远程调用框架

http://www.verejava.com/?id=1756827901192

81,122

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧