首页 文章

tomcat上的本地phantomjs / highcharts导出服务器

提问于
浏览
2

我已经搜索过这个网站和互联网上的任何地方,但没有得到明确的理解 .

我已按照说明在CentOS 6.7上成功安装了phantomjs和highcharts Setting Up Export Server

以下是“/ software / phantomjs / highcharts / highcharts-export-server-master / phantomjs”中所需的.js文件:

  • highcharts-convert.js highcharts-more.js highstock.js highmaps.js d3-funnel.js gauge.min.js exports.js jquery.1.9.1.min.js

我对phantomjs,特别是highcharts非常陌生 - 我要做的是为在一台服务器(服务器B)上运行的批处理程序提供一种方法,将POST请求发送到服务器A上的导出服务器并返回.png或 . pdf文件 .

战争部署在Tomcat上,10个独立的服务器从端口7777开始运行,PhantomJS服务器也按照以下命令和app-convert.js配置文件在127.0.0.1:3003运行:

phantomjs highcharts-convert.js -host 127.0.0.1 -port 3003

phantomjs属性主机和端口phantomjs监听host = 127.0.0.1 port = 7777 phantomjs可执行文件的位置,可以是例如> / usr / local / bin / phantomjs exec = / software / phantomjs / phantomjs这里指定一个替代位置(整个路径!)用于>启动Phantomjs服务器的脚本 . F.eks /home/bert/scripts/my-highcharts-convert.js如果您使用与export-server捆绑在一起的脚本,请留空 . script = connect用于连接作为HTTP-server运行的phantomjs的属性>所有以毫秒为单位的值指定在 Build 连接时从phantomjs读取时的超时readTimeout = 6000打开到phantomjs的通信链接时使用的超时>服务器connectTimeout = 1000对phantomjs服务器的整个请求被调度,max timeout可以持续>到此值 . 这是因为在java中你不能依赖上面两个>超时 . maxTimeout = 6500池属性可以在池中运行的phantomjs服务器数 . poolSize = 10池实现为BlockingQueue . 当要求幻像服务器>连接并且没有任何可用时,它等待毫秒数>由maxWait定义maxWait = 6000将文件保存在临时文件夹中以保留特定的retainTime,定义为> miliseconds retentionTime = 300000

我可以点击http://my-server/highcharts-export-web/演示页面,它可以在浏览器中正常工作 .

我有的问题:

  • 我想将哪个URL用于远程批处理程序?

  • 是// my-server / highcharts-export-web /应该可以用于远程调用吗?

  • webapp是否设计为接收来自非浏览器客户端的直接请求?

  • 什么进程调用服务器池中的10个服务器?

有人可以提供一个示例,说明如何设置远程调用导出服务器(它们将每天运行多次)并从批处理程序返回.png或.pdf?

谢谢Brian

1 回答

  • 0

    我们取得了成功!部分问题是从HTTPS调用HTTP中的托管服务器(javascript不喜欢它 .

    我们也是一个冷冻房子,所以这个第一个例子是一个直接的服务器端调用,主要是缩小的基本图表 .

    注意:我们确实成功通过cfhttp标签从HTTPS服务器端调用HTTP(类似于PHP cURL的东西)......

    <!--- first we need to create a small chart --->
    {
    "xAxis":{
        "categories":["Jan","Feb","Mar"]
        },
        "series":[{
            "data":[29.9,71.5,106.4]
        }]
    }
    
    <!--- lets go a little bit larger (I cut in something bigger below...
    --->
    <cfsavecontent variable="stringItForMe">
    <cfprocessingdirective suppressWhiteSpace="true">
    {xAxis: {categories: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']},series: [{data: [29.9, 71.5, 106.4, 129.2, 144.0, 176.0, 135.6, 148.5, 216.4, 194.1, 95.6, 54.4]}]}
    </cfprocessingdirective>
    </cfsavecontent>
    
    <!--- next we encode the variable the parameter names will normally have double quotes for cleanliness but highcharts exports works without them. --->
    
    <cfset stepTwo = URLEncodedFormat(stringItForMe)>
    
    <!---
    setting my URL target...
    --->
    
    <cfset urlMaker = "http://targetServer:10001/highcharts-export-web/">
    
    
    <cfhttp url="#urlMaker#" result="r" method="post" timeout="1">
    <cfhttpparam type="HEADER" name="Content-Type" value="application/x-www-form-urlencoded; charset=UTF-8">
    <cfhttpparam name="data" type="body" value="async=true&type=jpeg&width=800&options=#stepTwo#">
    </cfhttp>
    
    <cfset targetImage = urlMaker&r.fileContent>
    
    <cfoutput><img src="#targetImage#"/></cfoutput>
    

    现在第二个是javascript / jQuery它是从highsoft提供的jsfiddle示例中提取的,但我不记得我是否在论坛或exprt服务器页面上找到它,但是我们通过HTTPS调用了highcharts托管导出服务器并且它工作了(我们每个内部渲染看起来好多了,我认为我们有一些额外的依赖,但两种方式都成功...

    我们不得不调试这个javascript来使这个的coldfusion版本起作用 .

    <br><br>
    <button id='b'>Run Code</button>
    <div id="container"></div>
    
    <script>
    $(function () {
        $("#b").click(testPOST);
    
        //var exportUrl = 'http://targetServer:10001/highcharts-export-web/';
        var exportUrl = 'https://export.highcharts.com/';
    
        function testPOST() {
    
            var optionsStr = JSON.stringify({
                "xAxis": {
                    "categories": ["Jan", "Feb", "Mar"]
                },
                    "series": [{
                    "data": [29.9, 71.5, 106.4]
                }]
            }),
            dataString = encodeURI('async=true&type=jpeg&width=400&options=' + optionsStr);
    
            if (window.XDomainRequest) {
                var xdr = new XDomainRequest();
                xdr.open("post", exportUrl+ '?' + dataString);
                xdr.onload = function () {
                    console.log(xdr.responseText);
                    $('#container').html('<img src="' + exporturl + xdr.responseText + '"/>');
                };
                xdr.send();
            } else {
                $.ajax({
                    type: 'POST',
                    data: dataString,
                    url: exportUrl,
                    success: function (data) {
                        console.log('get the file from relative url: ', data);
                        $('#container').html('<img src="' + exportUrl + data + '"/>');
                    },
                    error: function (err) {
                        debugger;
                        console.log('error', err.statusText)
                    }
                });
            }
    
        }
    });
    </script>
    

    我认为有了这两个工作示例,有人可以将它移植到PHP或其他几乎没有问题的语言 . 请记住,如果在javascript中调试你的控制台并在Coldfusion上调试:)

    最后,这个发现中最令人沮丧的部分之一就是点击服务器,与服务器通话但是在数据或文件内容中拉回default export example page(对于Coldfusion),它让我们挠头,因为我们不知道如何通过那部分只是得到我们的文件 .

相关问题