public class Client{
public static void main(String[] args) throws IOException{
Socket socket = new Socket();
//超时时间
socket.setSoTimeout(3000);
//连接本地,端口2000,超时时间3000ms
socket.connect(new InetSocketAddress(InetSocketAddress.getLocalHost(),2000),3000);
System.out.printf("已发起服务器连接,并进入后续流程~");
System.out.printf("客户端信息:"+socket.getLocalAddress()+"P:"+socket.getLocalPort());
System.out.printf("服务器信息:"+socket.getInetAddress()+"P:"+socket.getPort());
try{
todo(socket);
}catch(Exception e){
System.out.printf("异常关闭");
}
socket.close();
System.out.printf("客户端已退出");
}
private static void todo(Socket client) throws IOException{
//构建键盘输入流
InputStream in = System.in;
BufferedReader input = new BufferedReader(new InputStreamReader(in));
//得到socket输出流,并转换为打印流
OutputStream outputStream = client.getOutputStream();
PrintStream socketPrintStream = new PrintStream(outputStream);
//得到socket输入流,并转换为BufferedReader
InputStream inputStream = client.getInputStream();
BufferedReader socketBufferedReader = new BufferedReader(new InputStreamReader(inputStream));
boolean flag = true;
do{
//键盘读取一行
String str = input.readLine();
//发送到服务器
socketPrintStream.println(str);
//从服务器读取一行
String echo = socketBufferedReader.readLine();
if ("bye".equalsIgnoreCase(echo)) {
flag = false;
}else{
System.out.println(echo);
}
}while(flag);
//资源释放
socketPrintStream.close();
socketBufferedReader.close();
}
}
public class Server{
public static void main(String[] args) throws IOexception{
ServerSocket server = new ServerSocket(2000);
System.out.printf("服务器准备就绪~");
System.out.printf("服务器信息:"+server.getInetAddress()+" P:"+server.getLocalPort());
//等待客户端连接
for (; ; ) {
//得到客户端
Socket client = server.accept();
//客户端构建异步线程
ClientHandler clientHandler = new ClientHandler(client);
//启动线程
clientHandler.start();
}
}
//客户端消息处理
private static class ClientHandler extends Thread{
private Socket socket;
private boolean flag = true;
ClientHandler(Socket socket){
this.socket = socket;
}
@Override
public void run() {
super.run();
System.out.println("新客户端连接:" + socket.getInetAddress() +
" P:" + socket.getPort());
try {
// 得到打印流,用于数据输出;服务器回送数据使用
PrintStream socketOutput = new PrintStream(socket.getOutputStream());
// 得到输入流,用于接收数据
BufferedReader socketInput = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
do {
// 客户端拿到一条数据
String str = socketInput.readLine();
if ("bye".equalsIgnoreCase(str)) {
flag = false;
// 回送
socketOutput.println("bye");
} else {
// 打印到屏幕。并回送数据长度
System.out.println(str);
socketOutput.println("回送:" + str.length());
}
} while (flag);
socketInput.close();
socketOutput.close();
} catch (Exception e) {
System.out.println("连接异常断开");
} finally {
// 连接关闭
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
System.out.println("客户端已退出:" + socket.getInetAddress() +
" P:" + socket.getPort());
}
}
}
<!-- 解析WebService JAR包 CXF -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-spring-boot-starter-jaxws</artifactId>
<version>3.2.4</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http-jetty</artifactId>
<version>3.2.4</version>
</dependency>
<!-- 解析WebService JAR包 CXF end-->
<!-- https://mvnrepository.com/artifact/org.jdom/jdom2 -->
<dependency>
<groupId>org.jdom</groupId>
<artifactId>jdom2</artifactId>
<version>2.0.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/dom4j/dom4j -->
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
//命名空间一般为包名的倒序,最后一定要加斜杠
@WebService(targetNamespace = "http://webservice.msunsoft.com/")
public interface PatientService {
//生命对外接口方法和参数
@WebMethod
String sendPatientMsg(@WebParam(name = "name") String name);
}
/**
* webservice接口实现类
* qinfen
命名空间要和接口的命名空间保持一致
endpointInterface指明实现类所实现的接口
*/
@WebService(serviceName = "PatientService",
targetNamespace = "http://webservice.msunsoft.com/",
endpointInterface = "com.msunsoft.webService.PatientService")
@Component
public class PatientServiceImpl implements PatientService {
@Override
public String sendPatientMsg(String name) {
return "hello"+name;
}
}
/**
* cxf配置
* qinfen
*/
@Configuration
public class CxfConfig {
/**
* 注入servlet bean name不能dispatcherServlet 否则会覆盖dispatcherServlet
* @return
*/
@Bean(name = "cxfServlet")
public ServletRegistrationBean cxfServlet() {
return new ServletRegistrationBean(new CXFServlet(),"/services/*");
}
@Bean(name = Bus.DEFAULT_BUS_ID)
public SpringBus springBus() {
return new SpringBus();
}
//注入对外开放接口
@Bean
public PatientService patientService() {
return new PatientServiceImpl();
}
@Bean(name = "WebServiceDemoEndpoint")
public Endpoint endpoint() {
EndpointImpl endpoint = new EndpointImpl(springBus(), patientService());
endpoint.publish("/patient");
return endpoint;
}
}
生成的接口地址为:http://localhost:82/services/patient?wsdl
因为springboot整合了shiro,这个webservice路径没有添加到可以过滤的路径上面去。
filterChainDefinitionMap.put("/services/**", "anon");
“Redis的Key的TTL一到就自动从缓存中剔除” 这个过程是Redis底层自动触发的,而在我们的程序、代码里是完全感知不到的,因为我们得借助某种机制来帮助我们主动地去检测Redis缓存中那些Key已经失效了,而且,我们希望这种检测可以是“近实时”的!
基于Redis的Key失效/存活时间TTL +定时任务调度(用于主动定时的触发,去检测缓存Redis那些失效了的Key,而且希望Cron可以设置得足够合理,实现“近实时”的功效)!
用户提交过来的信息经过处理生成相应的订单号,然后将该订单记录插入数据库、插入缓存Redis,并设置对应的Key的存活时间TTL