【问题标题】:Spring MVC @ModelAttribute seems to behave asynchronously (using jpa) and need it to be synchronousSpring MVC @ModelAttribute 似乎表现得异步(使用 jpa)并且需要它是同步的
【发布时间】:2021-03-31 02:57:15
【问题描述】:

我需要以下代码来同步运行。

这是我的 HomeController 类的相关部分

    /*
     * Pulls up beancoin blockchain on startup. 
     * 
     * If no beancoin exists, create one and populate it with initial values
     */
    @ModelAttribute("blockchain")
    public Blockchain addBlockchain() throws NoSuchAlgorithmException, InterruptedException {
        try {
            Blockchain blockchain = blockchainApp.getBlockchainService("beancoin");
            pnapp = new PubNubApp(blockchain);
            System.out.println("Pulling up your beancoin from our records");
            return blockchain;
        } catch (NoResultException e) {
            System.err.println("Creating new beancoin");
            Blockchain blockchain = blockchainApp.newBlockchainService("beancoin");
            
            // this seems to be going async and I need it to be sync (based on web render). What could be cause?
            Initializer.loadBC("beancoin");
            return blockchain;
        }
    }

以上在流程方面工作正常,并且可以正确填充本地数据库。但是,第一次在网页上显示的只是 genesis_block,然后我必须启动和停止服务器,然后它会显示来自Initializer.loadBC("beancoin"); 调用的所有五个块。我不知道这是什么部分导致它不同步。

这是Initailizer.loadBC("beancoin"); 堆栈,我认为会有帮助。

来电:

    public static void loadBC(String nameOfBlockchain) {
        BlockchainService blockchainApp = new BlockchainService();
        blockchainApp.addBlockService(nameOfBlockchain, new String[] { "Dance", "The", "Quickstep" });
        blockchainApp.addBlockService(nameOfBlockchain, new String[] { "Dance", "The", "Waltz" });
        blockchainApp.addBlockService(nameOfBlockchain, new String[] { "Dance", "The", "Tango" });
        blockchainApp.addBlockService(nameOfBlockchain, new String[] { "Dance", "The", "Samba" });
        blockchainApp.addBlockService(nameOfBlockchain, new String[] { "Dance", "With", "Us", "America" });
    }

来电:

    public boolean addBlockService(String name, String[] data) {
        return blockchainD.addBlock(name, data);
    }

来电:

    @Override
    public boolean addBlock(String name, String[] data) {
        this.connect();
        Query query = em.createQuery("select b from Blockchain b where b.instance_name = :name");
        query.setParameter("name", name);
        Blockchain blockchain = (Blockchain) query.getSingleResult();
        try {
            em.getTransaction().begin();
            Block new_block = blockchain.add_block(data);
            em.persist(new_block);
            em.getTransaction().commit();
            this.disconnect();
            System.out.println("Returning true");
            return true;
        } catch (NoSuchAlgorithmException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return false;
        }
    }

我认为这应该是您需要的所有信息。

它没有抛出任何错误。它与页面完全不同步,所以如果我刷新所有数据库表(从头开始)并启动服务器,就会出现这样的情况:

只有这个。

然而数据库有我需要的一切,如果我启动和停止服务器,然后转到同一页面,我会得到这个(如预期的那样)。

这不仅仅是一个显示问题,尽管这很重要。我需要我的控制器是最新的,以便它可以与其他节点通信并正确报告链并根据需要更新链。我的代码中似乎有一些东西隐含地告诉 JVM 它可以同时运行或在单独的线程上运行?请帮我理解

编辑:当我将控制器代码更改为此时,它似乎仍然表现出异步。我肯定给了足够的时间,所以肯定有一个我不明白的概念。

    @ModelAttribute("blockchain")
    public Blockchain addBlockchain() throws NoSuchAlgorithmException, InterruptedException {
        try {
            Blockchain blockchain = blockchainApp.getBlockchainService("beancoin");
            pnapp = new PubNubApp(blockchain);
            System.out.println("Pulling up your beancoin from our records");
            return blockchain;
        } catch (NoResultException e) {
            System.err.println("Creating new beancoin");
            Blockchain blockchain = blockchainApp.newBlockchainService("beancoin");
            Thread.sleep(15000);
            // this seems to be going async and I need it to be sync (based on web render).
            // What could be cause?
            blockchainApp.addBlockService("beancoin", new String[] { "Dance", "The", "Quickstep" });
            blockchainApp.addBlockService("beancoin", new String[] { "Dance", "The", "Waltz" });
            blockchainApp.addBlockService("beancoin", new String[] { "Dance", "The", "Tango" });
            blockchainApp.addBlockService("beancoin", new String[] { "Dance", "The", "Samba" });
            blockchainApp.addBlockService("beancoin", new String[] { "Dance", "With", "Us", "America" });
            return blockchain;
        }
    }

【问题讨论】:

    标签: java spring jpa asynchronous


    【解决方案1】:

    我是个白痴,所以我很高兴没有人回答这个问题。它与同步或异步无关。

    用代码解释我需要做什么比用文字解释更好:

        @ModelAttribute("blockchain")
        public Blockchain addBlockchain() throws NoSuchAlgorithmException, InterruptedException {
            try {
                Blockchain blockchain = blockchainApp.getBlockchainService("beancoin");
                pnapp = new PubNubApp(blockchain);
                System.out.println("Pulling up your beancoin from our records");
                return blockchain;
            } catch (NoResultException e) {
                System.err.println("Creating new beancoin");
                Blockchain blockchain = blockchainApp.newBlockchainService("beancoin");
                // this seems to be going async and I need it to be sync (based on web render).
                // What could be cause? Thread.sleep(15000) doesn't fix it. 
                blockchainApp.addBlockService("beancoin", new String[] { "Dance", "The", "Quickstep" });
                blockchainApp.addBlockService("beancoin", new String[] { "Dance", "The", "Waltz" });
                blockchainApp.addBlockService("beancoin", new String[] { "Dance", "The", "Tango" });
                blockchainApp.addBlockService("beancoin", new String[] { "Dance", "The", "Samba" });
                blockchainApp.addBlockService("beancoin", new String[] { "Dance", "With", "Us", "America" });
                Blockchain populated_blockchain = blockchainApp.getBlockchainService("beancoin");
                return populated_blockchain;
            }
        }
    

    我确实在每次调用时都添加到数据库中,但我没有重新查询我需要的实例。如此简单,所以在某种程度上它是异步的,但不是由于线程或任何类似性质的东西。只是人为疏忽。

    【讨论】:

      猜你喜欢
      • 2012-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多