首先看一下activemq的网络模型(获取自网络)。
可以看到,TcpTransportServer是一个监听网络的类,如果有socket连接,便会放入阻塞队列,然后创建一个TransportConnection类,该类接收socket的消息,进行逻辑处理;
先看看TransportConnector在干啥
第一步:设置server处理类
第二步:接收到连接socket加入线程池
第三步:创建一个连接
第四步:连接启动
最终会调用到getServer().start();在看看TcpTransportServer在干啥
/**
* pull Sockets from the ServerSocket
*/
@Override
public void run() {
if (!isStopped() && !isStopping()) {
final ServerSocket serverSocket = this.serverSocket;
if (serverSocket == null) {
onAcceptError(new IOException("Server started without a valid ServerSocket"));
}
final ServerSocketChannel channel = serverSocket.getChannel();
if (channel != null) {
doRunWithServerSocketChannel(channel);
} else {
doRunWithServerSocket(serverSocket);
}
}
}
会调用到
doRunWithServerSocketChannel(channel);
private void doRunWithServerSocketChannel(final ServerSocketChannel channel) {
try {
channel.configureBlocking(false);
final Selector selector = Selector.open();
try {
channel.register(selector, SelectionKey.OP_ACCEPT); // 接受连接事件
} catch (ClosedChannelException ex) {
try {
selector.close();
} catch (IOException ignore) {}
throw ex;
}
// Update object instance for later cleanup.
this.selector = selector;
while (!isStopped()) { // while循环一直等待连接
int count = selector.select(10);
if (count == 0) {
continue;
}
Set<SelectionKey> keys = selector.selectedKeys();
for (Iterator<SelectionKey> i = keys.iterator(); i.hasNext(); ) { // 遍历通道事件
final SelectionKey key = i.next();
if (key.isAcceptable()) { // 如果有连接事件
try {
SocketChannel sc = channel.accept();
if (sc != null) {
if (isStopped() || getAcceptListener() == null) {
sc.close();
} else {
if (useQueueForAccept) {
socketQueue.put(sc.socket()); // 放入阻塞队列
} else {
handleSocket(sc.socket()); // 直接获取
}
}
}
} catch (SocketTimeoutException ste) {
// expect this to happen
} catch (Exception e) {
e.printStackTrace();
if (!isStopping()) {
onAcceptError(e);
} else if (!isStopped()) {
LOG.warn("run()", e);
onAcceptError(e);
}
}
}
i.remove();
}
}
} catch (IOException ex) {
if (!isStopping()) {
onAcceptError(ex);
} else if (!isStopped()) {
LOG.warn("run()", ex);
onAcceptError(ex);
}
}
}
如果是直接处理
final protected void doHandleSocket(Socket socket) {
boolean closeSocket = true;
boolean countIncremented = false;
try {
int currentCount;
do {
currentCount = currentTransportCount.get();
if (currentCount >= this.maximumConnections) {
throw new ExceededMaximumConnectionsException(
"Exceeded the maximum number of allowed client connections. See the '" +
"maximumConnections' property on the TCP transport configuration URI " +
"in the ActiveMQ configuration file (e.g., activemq.xml)");
}
//Increment this value before configuring the transport
//This is necessary because some of the transport servers must read from the
//socket during configureTransport() so we want to make sure this value is
//accurate as the transport server could pause here waiting for data to be sent from a client
} while(!currentTransportCount.compareAndSet(currentCount, currentCount + 1));
countIncremented = true;
HashMap<String, Object> options = new HashMap<String, Object>();
options.put("maxInactivityDuration", Long.valueOf(maxInactivityDuration));
options.put("maxInactivityDurationInitalDelay", Long.valueOf(maxInactivityDurationInitalDelay));
options.put("minmumWireFormatVersion", Integer.valueOf(minmumWireFormatVersion));
options.put("trace", Boolean.valueOf(trace));
options.put("soTimeout", Integer.valueOf(soTimeout));
options.put("socketBufferSize", Integer.valueOf(socketBufferSize));
options.put("connectionTimeout", Integer.valueOf(connectionTim