带Javascript客户端的Thrift Java server OutOfMemoryError
我昨天开始学习节俭 经过大量的努力,我成功地执行了Java教程。 Java服务器和客户机运行良好 但现在,我想要一个javascript客户端与Java Thrift服务器通信 为此,我移动了带Javascript客户端的Thrift Java server OutOfMemoryError,java,javascript,thrift,Java,Javascript,Thrift,我昨天开始学习节俭 经过大量的努力,我成功地执行了Java教程。 Java服务器和客户机运行良好 但现在,我想要一个javascript客户端与Java Thrift服务器通信 为此,我移动了js/文件夹中的所有js文件 并将index.html代码粘贴如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <
js/
文件夹中的所有js文件
并将index.html代码粘贴如下:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Thrift Javascript Bindings - Tutorial Example</title>
<script src="js/thrift.js" type="text/javascript"></script>
<script src="js/tutorial_types.js" type="text/javascript"></script>
<script src="js/shared_types.js" type="text/javascript"></script>
<script src="js/SharedService.js" type="text/javascript"></script>
<script src="js/Calculator.js" type="text/javascript"></script>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<script type="text/javascript" charset="utf-8">
//<![CDATA[
$(document).ready(function(){
// remove pseudo child required for valid xhtml strict
$("#op").children().remove();
// add operations to it's dropdown menu
$.each(Operation, function(key, value) {
$('#op').append($("<option></option>").attr("value",value).text(key));
});
$('table.calculator').attr('width', 500);
});
function calc() {
var transport = new Thrift.Transport("http://localhost:9090");
var protocol = new Thrift.Protocol(transport);
var client = new CalculatorClient(protocol);
var work = new Work()
work.num1 = $("#num1").val();
work.num2 = $("#num2").val();
work.op = $("#op").val();
try {
result = client.calculate(1, work);
$('#result').val(result);
$('#result').css('color', 'black');
} catch(ouch){
$('#result').val(ouch.why);
$('#result').css('color', 'red');
}
}
function auto_calc() {
if ($('#autoupdate:checked').val() !== undefined) {
calc();
}
}
//]]>
</script>
</head>
<body>
<h2>Thrift Javascript Bindings</h2>
<form action="">
<table class="calculator">
<tr>
<td>num1</td>
<td><input type="text" id="num1" value="20" onkeyup="javascript:auto_calc();"/></td>
</tr>
<tr>
<td>Operation</td>
<td><select id="op" size="1" onchange="javascript:auto_calc();"><option></option></select></td>
</tr>
<tr>
<td>num2</td>
<td><input type="text" id="num2" value="5" onkeyup="javascript:auto_calc();"/></td></tr>
<tr>
<td>result</td>
<td><input type="text" id="result" value=""/></td></tr>
<tr>
<td><input type="checkbox" id="autoupdate" checked="checked"/>autoupdate</td>
<td><input type="button" id="calculate" value="calculate" onclick="javascript:calc();"/></td>
</tr>
</table>
</form>
<p>This Java Script example uses <a href="https://git-wip-us.apache.org/repos/asf?p=thrift.git;a=blob;f=tutorial/tutorial.thrift;hb=HEAD">tutorial.thrift</a> and a Thrift server using JSON protocol and HTTP transport.
</p>
<p>
<a href="http://validator.w3.org/check/referer"><img
src="http://www.w3.org/Icons/valid-xhtml10"
alt="Valid XHTML 1.0!" height="31" width="88" /></a>
</p>
</body>
</html>
与
如图所示,我的服务器位于端口9090上。而且/thrift/service/tutorial
对我来说没有任何意义,它也不起作用
然后,当我打开我的页面
Java thrift服务器崩溃,出现以下错误:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at org.apache.thrift.protocol.TBinaryProtocol.readStringBody(TBinaryProtocol.java:339)
at org.apache.thrift.protocol.TBinaryProtocol.readMessageBegin(TBinaryProtocol.java:202)
at org.apache.thrift.TBaseProcessor.process(TBaseProcessor.java:27)
at org.apache.thrift.server.TSimpleServer.serve(TSimpleServer.java:83)
at thrift.server.CalculatorServer.main(CalculatorServer.java:23)
下面是CalculatorServer
java类
package thrift.server;
import org.apache.thrift.server.TServer;
import org.apache.thrift.server.TServer.Args;
import org.apache.thrift.server.TSimpleServer;
import org.apache.thrift.transport.TServerSocket;
import org.apache.thrift.transport.TServerTransport;
import org.apache.thrift.transport.TTransportException;
import tutorial.Calculator;
public class CalculatorServer {
public static void main(String[] args) {
CalculatorHandler handler = new CalculatorHandler();
Calculator.Processor<CalculatorHandler> processor = new Calculator.Processor<>(handler);
try {
TServerTransport serverTransport = new TServerSocket(9090);
TServer server = new TSimpleServer(new Args(serverTransport).processor(processor));
System.out.println("Starting the simple server...");
server.serve();
} catch (TTransportException e) {
e.printStackTrace();
}
}
}
package-thrift.server;
导入org.apache.thrift.server.TServer;
导入org.apache.thrift.server.TServer.Args;
导入org.apache.thrift.server.TSimpleServer;
导入org.apache.thrift.transport.TServerSocket;
导入org.apache.thrift.transport.TServerTransport;
导入org.apache.thrift.transport.ttTransportException;
导入教程。计算器;
公共类计算器服务器{
公共静态void main(字符串[]args){
CalculatorHandler=新的CalculatorHandler();
Calculator.Processor=新的Calculator.Processor(处理器);
试一试{
TServerTransport服务器传输=新的TServerSocket(9090);
tserverserver=newtsimpleserver(新参数(serverTransport.processor)(处理器));
System.out.println(“启动简单服务器…”);
server.service();
}捕获(TTransportException e){
e、 printStackTrace();
}
}
}
其余的代码来自Thrift教程。事实上,Java Thrift server与Java Thrift客户端配合得非常好。我认为Java服务器端没有任何问题
谁能告诉我出了什么问题
Javascript客户端有其他选择吗
我使用thrift在我的JavaSE应用程序和本地计算机上的网站之间进行通信。因此,我可以使用HTML+CSS+JS开发GUI,而不是使用Java Swing。默认的“TTTransport”不是基于http协议的服务器。如果您想使用http作为通信协议,这似乎是js在客户端的唯一方式,那么应该使用基于http的“TTTransport”。看看“org.apache.thrift.server.TServlet”,这是一种在servlet中构建基于http的thrift服务器的简单方法 您还应该在服务器端使用“TJSONProtocol”而不是“TBinaryProtocol”,因为thrift js无法很好地处理二进制数据。这是我以前使用的代码片段
public class CalculatorServlet extends TServlet
{
public CalculatorServlet()
{
//'Calculator' is the generated class from thrift,
//'CalculatorHandler' is the implement class for thrift rpc
super(new Calculator.Processor(
new CalculatorHandler()),
new TJSONProtocol.Factory());
}
}
IIRC,JavaScript只支持JSON协议。这(当然)与二进制不兼容 因此,解决方案是:在服务器中使用JSON协议而不是二进制协议 节约的一个很好的经验法则是,始终在两端使用相同的传输/协议堆栈。在这种特殊情况下,这意味着:
- HTTP服务器
- JSON协议
- 没有像
protocol那样的额外功能(顺便说一句,缓冲可以工作)framed
(也有一些例外,因为某些服务器类型本质上需要框架,但这完全是另一回事,与您的问题无关)我一直在寻找一种在聚合javascript中使用节俭的简单方法。在我花了三天的时间分析其他解决方案之后,这里终于给出了解决方案。他们在哪里工作,但他们都需要从我的请求中读取view.html本地位置文件。我发现这太贵了,因为我同时使用谷歌应用程序引擎和计算引擎。我找不到app engine上的本地目录,所以下面是我所做的
<dom-module id="thrift-client">
<template>
</template>
<script>
Polymer({
is:'thrift-client',
ready:function(){
var transport = new Thrift.TXHRTransport("http://localhost:8088/service");
var protocol = new Thrift.TJSONProtocol(transport);
var client = new NtvApiClient(protocol);
var result = client.ping(); // ping the java server. custom
console.log(result);
}
});
</script>
var transport = new Thrift.TXHRTransport("http://localhost:8088/service");
var protocol = new Thrift.TJSONProtocol(transport);
var client = new NtvApiClient(protocol);
var result = client.ping();
干杯我们可以看看java代码吗?例如,您应该使用更多内存运行服务器
-Xmx1024m
,然后再试一次again@RC不,相同的错误。好的,你的意思是,我必须创建一个Servlet才能与JS客户端通信?你的代码片段很好,但请详细说明,并用我的示例引用它。所以,我很容易理解。你可以创建一个http服务器而不是“TServerSocket”。但这要复杂得多。thrift java库中只有“TServlet”可以帮助您做到这一点。但是,在创建servlet实例之后,如何将其连接到服务器?因此,它可以处理传入的请求。您应该在您的案例中为您的servlet嵌入一个jetty(servlet容器)。有一个教程我已经成功地将Java服务器协议设置为TJSONProtocol,但是如何解决传输部分呢?有两个类,TExtensibleServlet扩展了HttpServlet
,这似乎是一个不错的选择。这里还有一些文档,我自己没用过。
<dom-module id="thrift-client">
<template>
</template>
<script>
Polymer({
is:'thrift-client',
ready:function(){
var transport = new Thrift.TXHRTransport("http://localhost:8088/service");
var protocol = new Thrift.TJSONProtocol(transport);
var client = new NtvApiClient(protocol);
var result = client.ping(); // ping the java server. custom
console.log(result);
}
});
</script>
var transport = new Thrift.TXHRTransport("http://localhost:8088/service");
var protocol = new Thrift.TJSONProtocol(transport);
var client = new NtvApiClient(protocol);
var result = client.ping();