JAX-WS 实现 WebService

使用 Java 标准库中 JAX-WS API 技术实现 WebService,使一个C/S架构的系统作为客户端远程调用作为服务端的B/S架构工具中的方法。

服务端:

public class AgentWsServerPublisher {

    public static void start() {

        try {

            AgentWsService service = new AgentWsServiceImpl();

            // 创建 JaxWsServerFactoryBean 对象,并设置服务地址和 Web Service 接口
            JaxWsServerFactoryBean factory = new JaxWsServerFactoryBean();
            String hostAddress = InetAddress.getLocalHost().getHostAddress();
            String port = "8888";
            String address = "http://"+hostAddress+":"+port+"/AgentWsService";

            factory.setServiceClass(AgentWsService.class);
            factory.setAddress(address);
            // 设置 Web Service 实现类
            factory.setServiceBean(service);

            // create()方法将会阻塞,调用 start()方法异步发布 Web Service
            factory.create().start();
            System.out.println("WebService服务启动");

        } catch (UnknownHostException e) {
            System.out.println("WebService服务启动失败");
        }

    }
    
}

接口:

@WebService
public interface WsService {

    @WebMethod
    void openMachineWifi(String serieId);

    @WebMethod
    void closeMachineWifi(String serieId);

    @WebMethod
    void installedApk(String serieId, String apkPath);

}

实现类:

@WebService
public class WsServiceImpl implements WsService {

    //开启设备wifi
    @Override
    public void openMachineWifi(String serieId) {
        TAUtil.openWifi(serieId);
    }

    //关闭设备wifi
    @Override
    public void closeMachineWifi(String serieId) {
        TAUtil.closeWifi(serieId);
    }

    //向设备安装Apk
    @Override
    public void installedApk(String serieId, String apkPath) {
        TAUtil.installApk(serieId, apkPath);
    }
}

客户端:

接口:

@WebService
public interface WsService {

    void openMachineWifi(String serieId);

    void closeMachineWifi(String serieId);

    void installedApk(String serieId, String apkPath);

}

工具类:

public class WsUtil {

    /**
     * @Param IP: Agent IP地址
     * @Param clazz: 远程调用的接口
     * @return T: 返回远程调用类实例
     * @author jinyh
     * @date 2023/5/30 18:03
    */
    public static <T> T getWsInstance(String IP,Class<T> clazz) throws Exception {

        String port = "8888";
        String spec = "http://"+IP+":"+port+"/WsService?wsdl";
        // 创建服务地址 URL
        URL url = new URL(spec);
        // 创建服务名称 QName, 参数从wsdl文件中获取
        QName qName = new QName("http://service.AgentWsService.webservice.spasvo.com/", "AgentWsServiceService");

        // 创建服务实例 Service,并从中获取 Web Service 接口
        Service service = Service.create(url, qName);
        T wsInstance = service.getPort(clazz);

        return wsInstance;
    }

}

客户端调用


    @ResponseBody
    @RequestMapping("closeMachinesWifi")
    public void closeMachinesWifi(){

        //查询所有在线设备
        List<Map<String,String>> onlineMachines = queryOnlineMachines();

        //按ip分组,Map的key是ip地址,value是一个保存seriId的List,形如:{0.0.0.1=[2, 4], 1.1.1.1=[1, 3]}
        Map<String, List<String>> resultMap = onlineMachines.stream()
                .collect(Collectors.groupingBy(map -> map.get("ip"),
                        Collectors.mapping(map -> map.get("serieId"), Collectors.toList())));

        //根据ip地址跟每个agent建立webService服务
        for(String ip : resultMap.keySet()){
            //使用线程池执行
            cachedThreadPool.execute(()->{
                try {

                    AgentWsService agentWsInstance = AgentWsUtil.getAgentWsInstance(ip, AgentWsService.class);

                    for(String serieId : resultMap.get(ip)) {
                        agentWsInstance.closeMachineWifi(serieId);
                    }

                } catch (Exception e) {
                    System.out.println("建立连接失败");
                }
            });
        }

    }

方法实际还会在服务端进行执行。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容