从子流中的ENV变量读取数据

时间:2018-10-03 10:16:50

标签: corda

我正在尝试从带有@InitiatedBy注释的子流中进行API调用。有什么方法可以从子流中的ENV变量中读取API URL,而不是对其进行硬编码? 例如:

 @InitiatedBy(Initiator::class)
class Acceptor(val otherPartyFlow: FlowSession) : FlowLogic<SignedTransaction>() {
    @Suspendable
    override fun call(): SignedTransaction {
        val notary = serviceHub.networkMapCache.notaryIdentities[0]
        val txID = otherPartyFlow.receive<SecureHash>().unwrap { secureHash -> secureHash }
        val commitedId = waitForLedgerCommit(txID)
        val op = commitedId.tx.outputStates.single() as RequestState
        val txBuilder = TransactionBuilder(notary)

        try {
            val res = khttp.get("http://localhost:3000/getTitle", timeout = 30.0).jsonObject.getString("data")
            val iouState = IOUState(res, serviceHub.myInfo.legalIdentities.first(), otherPartyFlow.counterparty)
            val txCommand = Command(RequestContract.Commands.Approve(), ourIdentity.owningKey)
            val txCommand1 = Command(IOUContract.Commands.Create(), ourIdentity.owningKey)
            txBuilder.addInputState(commitedId.tx.outRefsOfType<RequestState>().single())
            txBuilder.addOutputState(iouState, IOU_CONTRACT_ID)
            txBuilder.addOutputState(op.copy(status = "Transferred"), RequestContract.REQUEST_ID)
            txBuilder.addCommand(txCommand)
            txBuilder.addCommand(txCommand1)
            // Verify that the transaction is valid.
            txBuilder.verify(serviceHub)
            // Stage 3.
            val partSignedTx = serviceHub.signInitialTransaction(txBuilder)
            return subFlow(FinalityFlow(partSignedTx))
        }catch (ex: Exception){
            logger.info(ex.message)
            txBuilder.addInputState(commitedId.tx.outRefsOfType<RequestState>().single())
            val txCommand1 = Command(RequestContract.Commands.Expire(), ourIdentity.owningKey)
            txBuilder.addCommand(txCommand1)
            txBuilder.verify(serviceHub)
            // Stage 3.
            val partSignedTx = serviceHub.signInitialTransaction(txBuilder)
            return subFlow(FinalityFlow(partSignedTx))
        }
    }
}

在其上执行Acceptor流的节点需要通过API从其外部系统检索一些数据。当前,它被硬编码在子流代码中。子流是否可以从ENV变量/ node.conf文件中读取URL(http://localhost:3000/getTitle)?

1 个答案:

答案 0 :(得分:0)

在Corda 4+中

Corda 4将引入CorDapp配置文件的概念,该文件将允许您提供特定于CorDapp的配置。

这些配置文件必须放在<node_dir>/cordapps/config文件夹中。这些文件是在创建CordappContext时加载的,因此可以在运行时更改。

文件名应与CorDapp JAR的名称匹配(例如,如果您的CorDapp名为hello-0.1.jar,则配置文件应名为config/hello-0.1.conf)。配置文件必须以Typesafe / Lightbend配置格式编写。

只要有CordappContext::config可用,就可以从CordappContext访问CorDapp配置。

Corda 3替代品

同时,在Corda 3中,最好的选择是创建自己的本地配置文件(请参见here)或将配置存储在节点数据库中(请参见here)。