AbstractVirtualBoxServer.java 2.21 KB
package com.example.mina.base;

import com.example.mina.property.AbstractVirtualBoxProperties;
import lombok.extern.slf4j.Slf4j;
import org.apache.mina.filter.codec.ProtocolCodecFactory;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;

import java.net.InetSocketAddress;

/**
 * @author 杜云山
 * @date 21/03/05
 */
@Slf4j
public class AbstractVirtualBoxServer implements ApplicationRunner {

    private final AbstractVirtualBoxProperties abstractVirtualBoxProperties;

    private final AbstractVirtualBoxHandler abstractVirtualBoxHandler;

    private final ProtocolCodecFactory protocolCodecFactory;

    public AbstractVirtualBoxServer(AbstractVirtualBoxProperties abstractVirtualBoxProperties,
                                    AbstractVirtualBoxHandler abstractVirtualBoxHandler,
                                    ProtocolCodecFactory protocolCodecFactory) {
        this.abstractVirtualBoxProperties = abstractVirtualBoxProperties;
        this.abstractVirtualBoxHandler = abstractVirtualBoxHandler;
        this.protocolCodecFactory = protocolCodecFactory;
    }

    @Override
    public void run(ApplicationArguments args) {

        String name = abstractVirtualBoxProperties.getName();
        Integer port = abstractVirtualBoxProperties.getPort();

        if (!abstractVirtualBoxProperties.getEnable()) {
            log.info("{}服务端 配置未开启", name);
            return;
        }

        if (port == null) {
            log.info("{}服务端 端口未配置", name);
            return;
        }

        try {
            NioSocketAcceptor acceptor = new NioSocketAcceptor();
            acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(protocolCodecFactory));
            acceptor.setHandler(abstractVirtualBoxHandler);
            acceptor.setReuseAddress(true);
            acceptor.bind(new InetSocketAddress(port));
            log.info("{}服务端已经启动,监听端口: {}", name, port);
        } catch (Exception e) {
            log.error("无法启动{}服务端, {}", name, e.getMessage(), e);
        }
    }

}