使用 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("建立连接失败");
}
});
}
}
方法实际还会在服务端进行执行。