12.18 webSocket消息推送
---恢复内容开始---
准备工作:
在要跳转到的页面加入js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
|
<#--弹窗--> <div class = "modal fade" id= "myModal" role= "dialog" aria-labelledby= "myModalLabel" aria-hidden= "true" > <div class = "modal-dialog" > <div class = "modal-content" > <div class = "modal-header" > <button type= "button" class = "close" data-dismiss= "modal" aria-hidden= "true" >×</button> <h4 class = "modal-title" id= "myModalLabel" > 提醒 </h4> </div> <div class = "modal-body" > 你有新的订单 </div> <div class = "modal-footer" > <button onclick= "javascript:document.getElementById('notice').pause()" type= "button" class = "btn btn-default" data-dismiss= "modal" >关闭</button> <button onclick= "location.reload()" type= "button" class = "btn btn-primary" >查看新的订单</button> </div> </div> </div> </div> <#--播放音乐--> <audio id= "notice" loop= "loop" > <source src= "/sell/mp3/song.mp3" type= "audio/mpeg" /> </audio> <script src= "https://cdn.bootcss.com/jquery/1.12.4/jquery.min.js" ></script> <script src= "https://cdn.bootcss.com/bootstrap/3.3.5/js/bootstrap.min.js" ></script> <script> var websocket = null ; if ( 'WebSocket' in window) { websocket = new WebSocket( 'ws://sell.natapp4.cc/sell/webSocket' ); } else { alert( '该浏览器不支持websocket!' ); } websocket.onopen = function (event) { console.log( '建立连接' ); } websocket.onclose = function (event) { console.log( '连接关闭' ); } websocket.onmessage = function (event) { console.log( '收到消息:' + event.data) //弹窗提醒, 播放音乐 $( '#myModal' ).modal( 'show' ); document.getElementById( 'notice' ).play(); } websocket.onerror = function () { alert( 'websocket通信发生错误!' ); } window.onbeforeunload = function () { websocket.close(); } </script> |
1.引入依赖
1
2
3
4
5
|
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency> </dependencies> |
2.创建配置文件
1
2
3
4
5
6
7
8
|
@Component public class WebSocketConfig { @Bean public ServerEndpointExporter serverEndpointExporter() { return new ServerEndpointExporter(); } } |
3.在service包下加入执行的类文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
@Component @ServerEndpoint ( "/webSocket" ) @Slf4j public class WebSocket { private Session session; private static CopyOnWriteArraySet<WebSocket> webSocketSet = new CopyOnWriteArraySet<>(); @OnOpen public void onOpen(Session session) { this .session = session; webSocketSet.add( this ); log.info( "【websocket消息】有新的连接, 总数:{}" , webSocketSet.size()); } @OnClose public void onClose() { webSocketSet.remove( this ); log.info( "【websocket消息】连接断开, 总数:{}" , webSocketSet.size()); } @OnMessage public void onMessage(String message) { log.info( "【websocket消息】收到客户端发来的消息:{}" , message); } public void sendMessage(String message) { for (WebSocket webSocket: webSocketSet) { log.info( "【websocket消息】广播消息, message={}" , message); try { webSocket.session.getBasicRemote().sendText(message); } catch (Exception e) { e.printStackTrace(); } } } } |
在创建订单扣库存后执行方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
|
* * Created by 廖师兄 * 2017 - 06 - 11 18 : 43 */ @Service @Slf4j public class OrderServiceImpl implements OrderService { @Autowired private ProductService productService; @Autowired private OrderDetailRepository orderDetailRepository; @Autowired private OrderMasterRepository orderMasterRepository; @Autowired private PayService payService; @Autowired private PushMessageService pushMessageService; @Autowired private WebSocket webSocket; @Override @Transactional public OrderDTO create(OrderDTO orderDTO) { String orderId = KeyUtil.genUniqueKey(); BigDecimal orderAmount = new BigDecimal(BigInteger.ZERO); // List<CartDTO> cartDTOList = new ArrayList<>(); //1. 查询商品(数量, 价格) for (OrderDetail orderDetail: orderDTO.getOrderDetailList()) { ProductInfo productInfo = productService.findOne(orderDetail.getProductId()); if (productInfo == null ) { throw new SellException(ResultEnum.PRODUCT_NOT_EXIST); } //2. 计算订单总价 orderAmount = productInfo.getProductPrice() .multiply( new BigDecimal(orderDetail.getProductQuantity())) .add(orderAmount); //订单详情入库 orderDetail.setDetailId(KeyUtil.genUniqueKey()); orderDetail.setOrderId(orderId); BeanUtils.copyProperties(productInfo, orderDetail); orderDetailRepository.save(orderDetail); // CartDTO cartDTO = new CartDTO(orderDetail.getProductId(), orderDetail.getProductQuantity()); // cartDTOList.add(cartDTO); } //3. 写入订单数据库(orderMaster和orderDetail) OrderMaster orderMaster = new OrderMaster(); orderDTO.setOrderId(orderId); BeanUtils.copyProperties(orderDTO, orderMaster); orderMaster.setOrderAmount(orderAmount); orderMaster.setOrderStatus(OrderStatusEnum.NEW.getCode()); orderMaster.setPayStatus(PayStatusEnum.WAIT.getCode()); orderMasterRepository.save(orderMaster); //4. 扣库存 List<CartDTO> cartDTOList = orderDTO.getOrderDetailList().stream().map(e -> new CartDTO(e.getProductId(), e.getProductQuantity()) ).collect(Collectors.toList()); productService.decreaseStock(cartDTOList); //发送websocket消息 webSocket.sendMessage(orderDTO.getOrderId()); return orderDTO; } } |