【发布时间】: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