docker 启动容器报端口异常
报错信息(HTTP code 500) server error - driver failed programming external connectivity on endpoint mysql (7cb7204000847eb37fb57aeec32aacf8d9d05d037d486c38c1f699c0dc7d197c): Bind for 0.0.0.0:3306 failed: port is already allocated
管理员cmd 重启 nat 服务就好了
12345678C:\Windows\System32>net stop winnatWindows NAT Driver 服务已成功停止。C:\Windows\System32>net start winnatWindows NAT Driver 服务已经启动成功。
Spring boot 项目作为客户端调用 服务端websocket
java客户端请求websocketSpring boot 导入包pom.xml 导入
1234<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId></dependency>
客户端调用方法测试执行方法
connectWebSocket
连接websocket 客户端,并携带过期时间等参数
HandshakeMessage
发送消息对象
sendHandshake
发送消息
WebSocketConfig.queue.take
队列信息,等待数据返回,并消费,获取websocket 返回的消息数据
12345678910111213141516public String test() { try { WebSocketConfig.connectWebSocket(); HandshakeMes ...
WinSW 将 Java 应用程序配置为 Windows 服务并设置为自启动
要使用 WinSW 将 Java 应用程序配置为 Windows 服务并设置为自启动,你需要遵循以下步骤:
配置jar包自启动下载 WinSW:访问 WinSW GitHub 仓库 下载最新版本的 WinSW.exe 文件。确保下载与你的系统架构相匹配的版本(x86 或 x64)。准备 Java 应用程序:确保你的 Java 应用程序被打包成了 .jar 文件或者包含所有依赖项的目录结构。
创建 XML 配置文件:创建一个 XML 文件(通常命名为 winsw.xml),用于配置 WinSW 如何启动和停止你的 Java 应用程序。下面是一个基本的配置示例:xml
1234567891011<?xml version="1.0" encoding="UTF-8"?><service> <id>MyJavaAppService</id> <name>My Java Application Service</name> <description>A sample ...
jar包 加密解密 使用 class-final
启动方式
1java -javaagent:admin-encrypted.jar -jar admin-encrypted.jar
启动后在输入密码
pom.xml 添加通过 pom.xml 添加进去password 使用 # 号 可以只混淆无需密码启动
123456789101112131415161718192021<plugin> <!-- https://gitee.com/roseboy/classfinal --> <groupId>net.roseboy</groupId> <artifactId>classfinal-maven-plugin</artifactId> <version>1.2.1</version> <configuration> <password>123455</password><!--加密打包之后pom.xml会被删除,不用担心在jar包里找到此密码--> <packages>com. ...
通过 winsw 将java项目配置windows自启动
winsw 项目地址https://github.com/winsw/winsw
使用 WinSW 作为全球工具
从分发版中获取WinSW.exe或WinSW.zip 。
编写myapp.xml(有关更多详细信息,请参阅XML 配置文件规范和示例)。
运行winsw install myapp.xml [options]以安装服务。
运行winsw start myapp.xml以启动该服务。
运行winsw status myapp.xml以查看您的服务是否已启动并正在运行。
使用 WinSW 作为捆绑工具
从发行版中获取WinSW.exe或WinSW.zip ,然后根据您的喜好重命名.exe(例如myapp.exe)。
编写myapp.xml(有关更多详细信息,请参阅XML 配置文件规范和示例)。
将这两个文件并排放置,因为这是 WinSW 发现其相关配置的方式。
运行myapp.exe install [options]以安装服务。
运行myapp.exe start以启动该服务。
配置文件详解123456789<service> <id>jenki ...
spring boot 项目 跟 JavaScript 简单 websocket 使用
websocket 简绍WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。
WebSocket 的优势包括:全双工通信:允许服务器主动向客户端发送信息,同时也能够提供客户端到服务器的低延迟通信。减少带宽消耗:一旦建立连接之后,通信开销很小,因为不需要HTTP头部。创建更丰富的交互体验:实时更新数据的能力,使得应用能够更加流畅地响应用户的动作
可以通过 JavaScript 的 WebSocket 对象来创建一个 WebSocket 连接。
1var ws = new WebSocket('ws://localhost:8080');
JavaScript 设置处理事件WebSocket 对象提供了几个事件处理器来处理连接的状态变化:open:连接成功建立时触发。message:接收到消息时触发。error:发生错误时触发。c ...
设计模式 享元模式(Flyweight Pattern)
享元模式 简绍享元模式(Flyweight Pattern)是一种结构型设计模式,它的目的是通过共享技术来有效地支持大量细粒度的对象。享元模式可以极大地减少内存的使用,从而提高程序的性能。它特别适用于需要创建大量相似对象的场景,通过共享不变的部分来减少对象的数量和内存消耗。
享元模式优缺点享元模式的优点
节省内存:通过共享享元对象,减少了内存占用。
提高性能:减少了对象的创建数量,提高了程序的性能。
享元模式的缺点
复杂性:实现享元模式可能增加了系统的复杂性,尤其是在维护和理解代码方面。
线程安全性:如果多个线程同时访问享元对象,需要确保线程安全。
享元模式概念
内部状态(Intrinsic State):不会随环境改变的状态,是对象固有的属性,可以被所有实例共享。
外部状态(Extrinsic State):随环境改变的状态,依赖于对象的使用环境,不可以被共享。
享元模式的应用场景
当系统中有大量相似的对象。
这些对象消耗大量内存。
这些对象的大多数状态可以外部化。
这些对象可以通过外部传递其状态来进一步减少系统内存
类图
代码实现定义 flyweight 的接口
123 ...
设计模式 代理模式(Proxy Pattern)
简绍代理模式是一种结构型设计模式,它允许您提供一个替代对象(代理)来控制对一个真实对象的访问。这种模式通常用于在访问某个对象之前或之后执行一些额外的操作,比如缓存、日志记录、权限验证等
静态代理静态代理的特点
代理类和真实主题类在编译时确定:代理类和真实主题类都是在编写代码时就确定的,并且它们通常共享一个公共接口。
代理类包含对真实主题类的引用:代理类包含一个对真实主题类实例的引用,并通过该引用调用真实主题的方法。
代理类可以执行额外的操作:代理类可以在调用真实主题的方法之前或之后执行一些额外的操作,如日志记录、权限验证等。
静态代理的应用场景
日志记录:在调用方法前后记录日志。
权限验证:在调用方法前验证用户权限。
缓存:缓存方法的结果,以避免重复计算。
事务管理:在调用方法前后管理事务。
性能优化:延迟加载或异步处理。
静态代理的缺点静态代理的一个缺点是,对于每一个真实主题类,都需要创建一个代理类。在需要为多个类创建代理的情况下,这可能会导致大量的代理类。
创建基础调用类
123public interface Mobile { void buy(String ...
设计模式 桥接模式(Bridge Pattern)
桥接模式简绍桥接模式(Bridge Pattern)是对象结构型设计模式中的一种,它将抽象与实现分离,使得两者可以独立地变化。这种模式的主要目的是解耦一个类的接口与其实现部分,从而可以更加灵活地给一个对象配置不同的功能实现。
桥接模式的核心概念包括以下几个部分:
抽象 (Abstraction) - 定义一个顶层接口或抽象类,这个抽象层持有一个指向具体实现部分的引用。
精炼抽象 (Refined Abstraction) - 扩展抽象中的行为,并且提供实现的方法。通常精炼抽象会根据实际需求细化抽象提供的基本操作。
实现者接口 (Implementor) - 这是一个接口或抽象类,定义实现部分的接口标准。
具体实现者 (Concrete Implementors) - 实现上述的实现者接口,并包含具体的实现细节。
通过这种方式,桥接模式允许在程序运行时改变对象的表现形式或行为,而无需修改代码。这提高了系统的可扩展性,因为你可以独立地增加新的实现类或抽象类。
桥接模式的工作流程
客户端代码创建一个具体的Refined Abstraction实例。 在创建时,将一个具体的Implement ...
设计模式 装饰模式(Decorator Pattern)
装饰器模式简绍装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。
装饰器模式的基本结构装饰器模式的基本结构如下:
Component(组件接口):定义了所有实体类和装饰器共同遵循的接口。
ConcreteComponent(具体组件):实现了 Component 接口的基础组件类。
Decorator(装饰器):实现了 Component 接口的抽象类或接口,它包含一个对 Component 类型的引用,可以用来包装具体的组件或其他装饰器。
ConcreteDecorator(具体装饰器):这些类扩展了 Decorator 类,并提供了额外的行为。
装饰器优缺点优点
灵活性:
动态扩展功能:装饰器模式允许在不修改原有类的基础上动态地添加职责或功能,这意味着可以在运行时根据需要添加或移除特性,提供了极大的灵活性。
透明性:
统一接口:装饰器类和具体组件类都遵循相同的接口,这样客户端代码就可以透明地处理所有对象,无论是基础对象还是装饰过的对象。
易于扩展:
避免多重 ...
