【问题标题】:Jelastic communincation between nodes节点间的Jelastic通信
【发布时间】:2016-05-22 08:15:57
【问题描述】:

我有一个基于给定宽度动态生成图像的 perl 程序。我需要创建从客户端获取图像尺寸的 Web 服务,并将其传递给 perl 程序以创建图像,然后将其发送回客户端。

现在在 Jelastic 云上,我创建了 3 个节点:

  • 节点 1:用于 tomcat(包含 java 代码)。
  • 节点 2:用于 MySql(包含数据库)。
  • 节点 3:用于 Centos VPS(包含 perl 代码)。

我的问题:

  1. 我做对了??如果不是,那么完成我的计划的最佳方式是什么?

  2. 如何从 java 服务(节点 1)调用 perl 代码(节点 3),并将生成的图像返回给客户端。

【问题讨论】:

    标签: perl web-services jersey-2.0 jelastic


    【解决方案1】:

    这听起来是一个合理的设计。你会写这样的东西。

    import java.lang.Runtime;
    
    int width = 99;
    
    try {
        Runtime runt = Runtime.getRuntime()
        Process proc = runt.exec('/usr/bin/perl', '/path/to/myperl.pl', Integer.toString(width));
        proc.waitFor();
    }
    catch (Exception ioe) {
        ioe.printStackTrace();
    }
    

    当然,您必须将 /usr/bin/perl 调整为您自己的 perl 可执行文件的实际位置,或者您可以调用 shell 让它通过使用来搜索路径

    runt.exec( '/bin/bash', '-c', 'perl', '/path/to/myperl.pl', Integer.toString(width) );
    

    至于如何将图像返回给客户端,您并没有过多说明您的 Perl 程序是如何工作的,但是您要么告诉它在哪里写入文件,要么它自己决定并告诉你它放在哪里之后

    如果是前者,那你想必是在命令行传递路径的,所以只需要扩展调用上面runt.exec就可以传递另一个参数

    如果是后者,那么大概程序会打印到 STDOUT,它已将新文件放入其中,您需要从 Java 代码中读取该流以收集信息。这看起来像proc.waitFor() 调用的到位

    import java.io.*;
    
    BufferedReader inp = new BufferedReader(
        new InputStreamReader(proc.getInputStream())
    );
    
    while ( ( line = inp.readLine() ) != null ) {
        // Process output of Perl code to get file location
    }
    

    【讨论】:

    • 只有当我将所有环境都安装在同一个节点(tomcat、perl)上时,您的解决方案才看起来不错。
    • 在jelastic中,tomcat节点与centos节点是分开的。 “如果我是对的”,它们就像两台不同的 PC。所以我不能用你的方法调用perl程序,除非它们在同一个节点中。
    • @Ahmedy,你可以在同一个tomcat节点上执行perl脚本。请说明您将其放入单独的VPS节点的原因,可能缺少某些库?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-02
    • 2011-01-25
    • 2020-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-18
    相关资源
    最近更新 更多