小编Jan*_*Jan的帖子

Java:如何以原子方式替换 Map 中的所有值?

我在多线程环境中有一个有状态的 bean,它将其状态保存在地图中。现在我需要一种方法来在一个原子操作中替换该地图的所有值。

public final class StatefulBean {

    private final Map<String, String> state = new ConcurrentSkipListMap<>();

    public StatefulBean() {
        //Initial state
        this.state.put("a", "a1");
        this.state.put("b", "b1");
        this.state.put("c", "c1");
    }

    public void updateState() {
        //Fake computation of new state
        final Map<String, String> newState = new HashMap<>();
        newState.put("b", "b1");
        newState.put("c", "c2");
        newState.put("d", "d1");

        atomicallyUpdateState(newState);
        /*Expected result
         *  a: removed
         *  b: unchanged
         *  C: replaced
         *  d: added*/
    }

    private void atomicallyUpdateState(final Map<String, String> newState) {
        //???
    }
}
Run Code Online (Sandbox Code Playgroud)

目前我ConcurrentSkipListMap用作 a 的实现 …

java concurrency multithreading dictionary

5
推荐指数
1
解决办法
1199
查看次数

无法让服务器发送的事件和事件源在JHipster中工作

我正在使用带有spring-boot和angular的JHipster 3.5.0来构建应用程序.我想使用服务器发送的事件从后端向UI发送更新,但我无法让它工作.

这是我的RestController的代码:

@RestController
@RequestMapping("/api")
public class SSEResource {
    private final List<SseEmitter> sseEmitters = new CopyOnWriteArrayList<>();

    @RequestMapping(value = "/sse", method = RequestMethod.GET)
    @Timed
    public SseEmitter getSSE() throws IOException {
        SseEmitter sseEmitter = new SseEmitter();
        this.sseEmitters.add(sseEmitter);
        sseEmitter.send("Connected");
        return sseEmitter;
    }

    @Scheduled(fixedDelay = 3000L)
    public void update() {
        this.sseEmitters.forEach(emitter -> {
            try {
                emitter.send(String.valueOf(System.currentTimeMillis()));
            } catch (IOException e) {
                e.printStackTrace();
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

我的Angaluar控制器看起来像这样:

(function () {
    'use strict';

    angular
        .module('myApp')
        .controller('SSEController', SSEController);

    SSEController.$inject = [];

    function SSEController() {
        var vm …
Run Code Online (Sandbox Code Playgroud)

spring-mvc angularjs spring-boot jhipster

1
推荐指数
1
解决办法
1442
查看次数