如何在STS新建的Java独立项目中实现推送通知功能?
普通Java项目推送通知实现说明
普通Java项目完全可以实现推送通知功能,Spring Boot相关实现方案只是对核心依赖做了自动配置封装,底层的实现逻辑和依赖本身可以直接在无Spring的普通Java项目中使用。
前置依赖(以WebSocket推送场景为例,使用JSR356标准的Tyrus实现)
如果使用Maven管理依赖,在pom.xml中添加如下配置:
<dependencies> <!-- JSR356 WebSocket API --> <dependency> <groupId>javax.websocket</groupId> <artifactId>javax.websocket-api</artifactId> <version>1.1</version> </dependency> <!-- Tyrus 服务端实现,无Spring依赖 --> <dependency> <groupId>org.glassfish.tyrus</groupId> <artifactId>tyrus-server</artifactId> <version>1.19</version> </dependency> <dependency> <groupId>org.glassfish.tyrus</groupId> <artifactId>tyrus-container-grizzly-server</artifactId> <version>1.19</version> </dependency> </dependencies>
示例代码
场景1:WebSocket服务端主动向客户端推送消息
1. 定义WebSocket服务端点
import javax.websocket.OnClose; import javax.websocket.OnMessage; import javax.websocket.OnOpen; import javax.websocket.Session; import javax.websocket.server.ServerEndpoint; import java.io.IOException; import java.util.Set; import java.util.concurrent.CopyOnWriteArraySet; @ServerEndpoint("/push") public class PushServerEndpoint { // 存储所有连接的客户端会话 private static final Set<Session> sessions = new CopyOnWriteArraySet<>(); @OnOpen public void onOpen(Session session) { sessions.add(session); System.out.println("新客户端连接,当前连接数:" + sessions.size()); } @OnClose public void onClose(Session session) { sessions.remove(session); System.out.println("客户端断开连接,当前连接数:" + sessions.size()); } @OnMessage public void onMessage(String message, Session session) { System.out.println("收到客户端消息:" + message); } // 向所有连接的客户端推送消息 public static void pushToAll(String message) { for (Session session : sessions) { try { session.getBasicRemote().sendText(message); } catch (IOException e) { e.printStackTrace(); } } } }
2. 启动WebSocket服务
import org.glassfish.tyrus.server.Server; public class WebSocketServerStarter { public static void main(String[] args) { // 启动服务,监听8080端口,根路径为/ws,注册的端点类为PushServerEndpoint Server server = new Server("localhost", 8080, "/ws", null, PushServerEndpoint.class); try { server.start(); System.out.println("WebSocket服务启动成功,访问地址:ws://localhost:8080/ws/push"); // 模拟5秒后主动推送一条消息 Thread.sleep(5000); PushServerEndpoint.pushToAll("服务端主动推送的测试消息"); // 保持服务运行 Thread.currentThread().join(); } catch (Exception e) { e.printStackTrace(); } finally { server.stop(); } } }
场景2:通过HTTP请求向第三方平台/移动端推送通知
无需额外依赖,直接使用JDK自带的HttpURLConnection实现:
import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; import java.nio.charset.StandardCharsets; public class HttpPushDemo { public static void main(String[] args) { try { // 第三方推送接口地址 URL url = new URL("https://your-push-provider.com/api/send"); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("POST"); conn.setRequestProperty("Content-Type", "application/json"); conn.setDoOutput(true); // 推送请求参数 String jsonBody = "{\"title\":\"通知标题\",\"content\":\"通知内容\",\"targetUserId\":\"12345\"}"; try (OutputStream os = conn.getOutputStream()) { byte[] input = jsonBody.getBytes(StandardCharsets.UTF_8); os.write(input, 0, input.length); } int responseCode = conn.getResponseCode(); System.out.println("推送请求响应码:" + responseCode); conn.disconnect(); } catch (Exception e) { e.printStackTrace(); } } }
注意事项
- 如果需要对接苹果APNs、华为推送、小米推送等厂商通道,直接引入对应厂商的官方Java SDK即可,所有官方SDK均支持在普通Java项目中运行,无Spring强制依赖
- 消息重试、持久化、批量推送等业务逻辑可根据需求自行实现,和项目是否使用Spring无关
内容的提问来源于stack exchange,提问作者Jeevan Horeb
相关产品推荐
相关产品推荐

