package main;
import java.util.LinkedList;
import java.util.Queue;
import org.zeromq.ZMQ;
import org.zeromq.ZMQ.Context;
import org.zeromq.ZMQ.Poller;
import org.zeromq.ZMQ.Socket;
import client.ClientTask;
import worker.WorkerTask;
public class MainServer {
private static final int NBR_CLIENTS = 10;
private static final int NBR_WORKERS = 3;
public static void main (String[] args) {
Context context = ZMQ.context(1);
// Prepare our context and sockets
Socket frontend = context.socket(ZMQ.ROUTER);
Socket backend = context.socket(ZMQ.ROUTER);
frontend.bind("ipc://frontend.ipc");
backend.bind("ipc://backend.ipc");
int clientNbr;
for (clientNbr = 0; clientNbr < NBR_CLIENTS; clientNbr++)
new ClientTask("client"+clientNbr).start();
for (int workerNbr = 0; workerNbr < NBR_WORKERS; workerNbr++)
new WorkerTask("worker"+workerNbr).start();
// Queue of available workers
Queue<String> workerQueue = new LinkedList<String>();
while (!Thread.currentThread().isInterrupted()) {
// Initialize poll set
Poller items = new Poller (2);
// Always poll for worker activity on backend
items.register(backend, Poller.POLLIN);
// Poll front-end only if we have available workers
if(workerQueue.size() > 0)
items.register(frontend, Poller.POLLIN);
if (items.poll() < 0)
break;
// Handle worker activity on backend
if (items.pollin(0)) {
// Queue worker address for LRU routing
workerQueue.add (backend.recvStr ());
// Second frame is empty
String empty = backend.recvStr ();
assert (empty.length() == 0);
// Third frame is READY or else a client reply address
String clientAddr = backend.recvStr ();
// If client reply, send rest back to frontend
if (!clientAddr.equals("READY")) {
empty = backend.recvStr ();
assert (empty.length() == 0);
String reply = backend.recvStr ();
frontend.sendMore(clientAddr);
frontend.sendMore("");
frontend.send(reply);
if (--clientNbr == 0)
break;
}
}
if (items.pollin(1)) {
// Now get next client request, route to LRU worker
// Client request is [address][empty][request]
String clientAddr = frontend.recvStr ();
String empty = frontend.recvStr ();
assert (empty.length() == 0);
String request = frontend.recvStr ();
String workerAddr = workerQueue.poll();
backend.sendMore (workerAddr);
backend.sendMore ("");
backend.sendMore (clientAddr );
backend.sendMore ("");
backend.send (request);
}
}
frontend.close();
backend.close();
context.term();
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
com.zeromq.load-balancing.rar (15个子文件)
com.zeromq.load-balancing
pom.xml 552B
target
test-classes
classes
client
ClientTask.class 1KB
worker
WorkerTask.class 2KB
META-INF
maven
com.zeromq
com.zeromq.load-balancing
pom.xml 552B
pom.properties 264B
MANIFEST.MF 108B
main
MainServer.class 3KB
.settings
org.eclipse.m2e.core.prefs 90B
org.eclipse.core.resources.prefs 83B
org.eclipse.jdt.core.prefs 243B
src
test
resources
java
main
resources
java
client
ClientTask.java 812B
worker
WorkerTask.java 1KB
main
MainServer.java 3KB
.project 577B
.classpath 1KB
共 15 条
- 1
资源评论
- test1192018-08-02非常好的资源。谢谢分享
- sh59122017-09-04可参考,不错的资源
- nwemtf2019-05-15不错的资源
flourishLi
- 粉丝: 6
- 资源: 17
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功