Corda-специфичный веб-сервер устарел и будет удален в будущем - PullRequest
0 голосов
/ 31 октября 2018

Узлы, работающие на нашем Mac OS, показывают error информацию, как показано ниже. Это произошло на двух отдельных машинах.

Last login: Wed Oct 31 12:48:00 on ttys004
bash -c 'cd "/Users/chrisceliberti/PropertyListing/PropertyListing/PropertyListing/PropertyListing/PropertyListing/PropertyListing/build/nodes/PartyB" ; "/Library/Java/JavaVirtualMachines/jdk1.8.0_192.jdk/Contents/Home/jre/bin/java" "-Dname=PartyB-corda-webserver.jar" "-Dcapsule.jvm.args=-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5009 -javaagent:drivers/jolokia-jvm-1.3.7-agent.jar=port=7009,logHandlerClass=net.corda.webserver.JolokiaSlf4Adapter" "-jar" "corda-webserver.jar" && exit'
chriss-Air-2:~ chrisceliberti$ bash -c 'cd "/Users/chrisceliberti/PropertyListing/PropertyListing/PropertyListing/PropertyListing/PropertyListing/PropertyListing/build/nodes/PartyB" ; "/Library/Java/JavaVirtualMachines/jdk1.8.0_192.jdk/Contents/Home/jre/bin/java" "-Dname=PartyB-corda-webserver.jar" "-Dcapsule.jvm.args=-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5009 -javaagent:drivers/jolokia-jvm-1.3.7-agent.jar=port=7009,logHandlerClass=net.corda.webserver.JolokiaSlf4Adapter" "-jar" "corda-webserver.jar" && exit'
Listening for transport dt_socket at address: 5009
This Corda-specific web server is deprecated and will be removed in future.
Please switch to a regular web framework like Spring, J2EE or Play Framework.

Должен ли я использовать другой веб-сервер, такой как Spring, или есть другое исправление?

1 Ответ

0 голосов
/ 01 ноября 2018

Вы должны переключиться на другой веб-сервер, например Spring.

Хотя Corda 3 включает в себя веб-сервер узла, это устаревшая функция, которая продолжает существовать только для демонстрационных целей. Вам следует создать собственный производственный веб-сервер с использованием существующих технологий.

См. Пример Spring Webserver здесь . Это веб-сервер Spring, который подключается к узлу Corda. Как работает этот пример?

  1. Мы создаем Component, который инициализируется при запуске сервера и устанавливает долговременное RPC-соединение с узлом:

    /**
    * Wraps a node RPC proxy.
    *
    * The RPC proxy is configured based on the properties in `application.properties`.
    *
    * @param host The host of the node we are connecting to.
    * @param rpcPort The RPC port of the node we are connecting to.
    * @param username The username for logging into the RPC client.
    * @param password The password for logging into the RPC client.
    * @property proxy The RPC proxy.
    */
    @Component
    open class NodeRPCConnection(
        @Value("\${$CORDA_NODE_HOST}") private val host: String,
        @Value("\${$CORDA_USER_NAME}") private val username: String,
        @Value("\${$CORDA_USER_PASSWORD}") private val password: String,
        @Value("\${$CORDA_RPC_PORT}") private val rpcPort: Int): AutoCloseable {
    
        lateinit var rpcConnection: CordaRPCConnection
            private set
        lateinit var proxy: CordaRPCOps
            private set
    
        @PostConstruct
        fun initialiseNodeRPCConnection() {
            val rpcAddress = NetworkHostAndPort(host, rpcPort)
            val rpcClient = CordaRPCClient(rpcAddress)
            val rpcConnection = rpcClient.start(username, password)
            proxy = rpcConnection.proxy
        }
    
        @PreDestroy
        override fun close() {
            rpcConnection.notifyServerAndClose()
        }
    }
    
  2. Мы вводим это Component в каждый контроллер и используем его для взаимодействия с узлом:

    /**
     * A CorDapp-agnostic controller that exposes standard endpoints.
     */
    @RestController
    @RequestMapping("/") // The paths for GET and POST requests are relative to this base path.
    class StandardController(private val rpc: NodeRPCConnection) {
    
        companion object {
            private val logger = LoggerFactory.getLogger(RestController::class.java)
        }
    
        private val proxy = rpc.proxy
    
        @GetMapping(value = "/status", produces = arrayOf("text/plain"))
        private fun status() = "200"
    
        @GetMapping(value = "/servertime", produces = arrayOf("text/plain"))
        private fun serverTime() = LocalDateTime.ofInstant(proxy.currentNodeTime(), ZoneId.of("UTC")).toString()
    
        @GetMapping(value = "/addresses", produces = arrayOf("text/plain"))
        private fun addresses() = proxy.nodeInfo().addresses.toString()
    
        @GetMapping(value = "/identities", produces = arrayOf("text/plain"))
        private fun identities() = proxy.nodeInfo().legalIdentities.toString()
    
        @GetMapping(value = "/platformversion", produces = arrayOf("text/plain"))
        private fun platformVersion() = proxy.nodeInfo().platformVersion.toString()
    
        @GetMapping(value = "/peers", produces = arrayOf("text/plain"))
        private fun peers() = proxy.networkMapSnapshot().flatMap { it.legalIdentities }.toString()
    
        @GetMapping(value = "/notaries", produces = arrayOf("text/plain"))
        private fun notaries() = proxy.notaryIdentities().toString()
    
        @GetMapping(value = "/flows", produces = arrayOf("text/plain"))
        private fun flows() = proxy.registeredFlows().toString()
    
        @GetMapping(value = "/states", produces = arrayOf("text/plain"))
        private fun states() = proxy.vaultQueryBy<ContractState>().states.toString()
    }
    
...