2

我在一个交易引擎上工作,在运行时,我从engine.log以下内容中获取日志,

2018_01_02_03_28_20_684 INFO  ZMQCommunicatorService REMOTE_EXECUTOR_MARKET_ADMIN-ALL_MARKETS-0-5 - no jzmq in java.library.path, sleeping 2 minutes then try again
2018_01_02_03_28_20_697 INFO  ZMQCommunicatorService ENGINE_MARKET_ADMIN-ALL_MARKETS-0-4 - Could not initialize class org.zeromq.ZMQ, sleeping 2 minutes then try again
2018_01_02_03_30_20_696 INFO  ZMQCommunicatorService REMOTE_EXECUTOR_MARKET_ADMIN-ALL_MARKETS-0-5 - Could not initialize class org.zeromq.ZMQ, sleeping 2 minutes then try again
2018_01_02_03_30_20_710 INFO  ZMQCommunicatorService ENGINE_MARKET_ADMIN-ALL_MARKETS-0-4 - Could not initialize class org.zeromq.ZMQ, sleeping 2 minutes then try again
2018_01_02_03_32_20_697 INFO  ZMQCommunicatorService REMOTE_EXECUTOR_MARKET_ADMIN-ALL_MARKETS-0-5 - Could not initialize class org.zeromq.ZMQ, sleeping 2 minutes then try again
2018_01_02_03_32_20_711 INFO  ZMQCommunicatorService ENGINE_MARKET_ADMIN-ALL_MARKETS-0-4 - Could not initialize class org.zeromq.ZMQ, sleeping 2 minutes then try again
2018_01_02_03_34_20_698 INFO  ZMQCommunicatorService REMOTE_EXECUTOR_MARKET_ADMIN-ALL_MARKETS-0-5 - Could not initialize class org.zeromq.ZMQ, sleeping 2 minutes then try again
2018_01_02_03_34_20_712 INFO  ZMQCommunicatorService ENGINE_MARKET_ADMIN-ALL_MARKETS-0-4 - Could not initialize class org.zeromq.ZMQ, sleeping 2 minutes then try again
2018_01_02_03_36_20_699 INFO  ZMQCommunicatorService REMOTE_EXECUTOR_MARKET_ADMIN-ALL_MARKETS-0-5 - Could not initialize class org.zeromq.ZMQ, sleeping 2 minutes then try again
2018_01_02_03_36_20_713 INFO  ZMQCommunicatorService ENGINE_MARKET_ADMIN-ALL_MARKETS-0-4 - Could not initialize class org.zeromq.ZMQ, sleeping 2 minutes then try again

我相信第一行说明了主要问题,

No jzmq in java.library.path

ZMQ binding我遵循了for Java的设置手册,

cd /root
wget https://github.com/zeromq/jzmq/archive/v3.1.0.tar.gz -O jzmq-3.1.0.tar.gz
tar zxf jzmq-3.1.0.tar.gz
cd jzmq-3.1.0
./autogen.sh
./configure --prefix=/opt/jzmq-3.1.0
nice make
make install

加载项目后,需要在项目根目录中运行命令,

root@debian:~# export LD_LIBRARY_PATH=/opt/jzmq-3.1.0/lib

root@debian:~# java -Xss256k -cp /opt/jzmq-3.1.0/share/java/zmq.jar:draglet-common/target/lib/*:draglet-balser/target/lib/*:draglet-engine/target/lib/*:draglet-remote/target/lib/*:draglet-mapu/target/lib/*:draglet-shaba/target/lib/*:draglet-meba/target/lib/* -Dlog4j.configurationFile=draglet-common/src/main/resources/log4j2.xml -DisThreadContextMapInheritable=true com.draglet.batch.Batch draglet.yml

当时我得到像这样的输出,

Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.

Tue Jan 02 03:59:17 EST 2018 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.

Intellij该问题与终端中提供的警告有关吗?如何检查 jzmq 是否在java.library.path?

4

2 回答 2

3

在 OSX 上,我遇到了类似的问题。我使用这些说明安装了 ZMQ 。

最后一步说用-Djava.library.path=/usr/local/lib.

我发现简单地将路径添加到

~/.bash_profile

例如:

echo "export JAVA_LIBRARY_PATH=$JAVA_LIBRARY_PATH:/usr/local/lib" >> ~/.bash_profile

重新启动 Intellij 后,它能够正确找到libjzmq.

DYLD_LIBRARY_PATH此外,如果您打算进行任何 C/C++ 开发,那么将其导出也是一个好主意。

只需添加

export DYLD_LIBRARY_PATH="$DYLD_LIBRARY_PATH:/usr/local/lib"

~/.bash_profile.

于 2019-01-24T21:55:51.883 回答
1

好的。所以,让我们一起动手吧:

在您的机器上查看,如果它正常工作,在适当的安装之后,或者没有:

最简单的形式原型之一是一个REQ/REP示例,它使用两个部分,一个 - 一个“服务器”:

import org.zeromq.ZMQ;
import org.zeromq.ZMQ.Context;
import org.zeromq.ZMQ.Socket;

public class rrserver{
    public static void main (String[] args) {
        Context context = ZMQ.context(1);

        //  Socket to talk to clients
        Socket responder  = context.socket(ZMQ.REP);
        responder.bind("tcp://localhost:5560");

        System.out.println("launch and connect server.");

        while (!Thread.currentThread().isInterrupted()) {
            //  Wait for next request from client
            byte[] request = responder.recv(0);
            String string = new String(request);
            System.out.println("Received request: ["+string+"].");

            //  Do some 'work'
            try {
                Thread.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            //  Send reply back to client
            responder.send("World".getBytes(), 0);
        }

        //  We never get here but clean up anyhow
        responder.close();
        context.term();
    }
}

另一部分,“客户”:

import org.zeromq.ZMQ;
import org.zeromq.ZMQ.Context;
import org.zeromq.ZMQ.Socket;

public class rrclient{

    public static void main(String[] args) {
        Context context = ZMQ.context(1);

        //  Socket to talk to server
        Socket requester = context.socket(ZMQ.REQ);
        requester.connect("tcp://localhost:5560"); // REF ABOVE AND LET START THIS AFTER "server"

        System.out.println("launch and connect client.");

        for (int request_nbr = 0; request_nbr < 10; request_nbr++) {
            requester.send("Hello", 0);
            String reply = requester.recvStr(0);
            System.out.println("Received reply " + request_nbr + " [" + reply + "]");
        }

        //  We never get here but clean up anyhow
        requester.close();
        context.term();
    }
}

如果安装正确与否,这应该会很快启动并运行。代码是从 ZeroMQ 发布的琐碎示例中借来的灵感。

如果真的想进入分布式计算领域,请不要犹豫,阅读 Pieter HINTJENS 的一本好书,“Code Connected, Volume 1”(也提供 pdf 版本)。值得花时间和精力。

于 2018-01-03T01:44:44.640 回答