我正在尝试从带有@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)?
答案 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)。