我正在编写一个具有网络组件的高性能/低垃圾应用程序(微秒级).我遇到的一个痛点是内置的Selector Selector for Java NIO的实现.
一些有问题的事情:
select
因此锁定实际上是无用的.扩展或更改选择器实现是不可能的.大多数类都是最终的,私有和包私有成员位于sun.nio.ch.*
包中.原生方法也使事情变得复杂.
是否还有其他更现代的选择器实现可能更高效?
我检查过的网络库只是使用了内置的Java选择器.任何帮助,将不胜感激.
问题:
本地我的应用程序工作正常.我的HTTP GET返回代码200和最终URL:http://vow.mlspin.com/clients/index.aspx?
我的其他应用程序也很有效.
当我将代码部署到GAE服务器(我使用Eclipse插件进行部署)时,我的应用程序停止工作,因为返回了错误的html页面!返回码仍然是200,但现在是URL(最终URL):http://vow.mlspin.com/clients/signin.aspx?id =
我的问题是:重定向有问题吗?谷歌应用程序引擎服务器是否被列入黑名单?我在这做错了什么?有没有人遇到过这个?
我发现的最接近的问题就是这个:来自GAE Java的Http GET我已经实现了这个建议,但到目前为止它还没有对我有用.
谢谢大家!
其他信息 - >以下是来自同一GET请求的HTTPResponse标头,一个来自本地部署,另一个来自GAE部署.
本地HTTP响应标头
Date :: Tue, 24 Apr 2012 04:12:32 GMT
Server :: Microsoft-IIS/6.0
X-Powered-By :: ASP.NET
X-AspNet-Version :: 2.0.50727
P3P :: CP="NOI DSP COR NID ADMa OPTa OUR NOR"
Cache-Control :: no-cache
Pragma :: no-cache
Expires :: -1
Content-Type :: text/html; charset=utf-8
Content-Length :: 133704
Run Code Online (Sandbox Code Playgroud)
部署的HTTP响应标头
date :: Tue, 24 Apr 2012 04:11:19 GMT
server :: Microsoft-IIS/6.0 …
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用协议缓冲区来记录一些市场数据。每次我从市场收到报价通知时,我都会获取该报价并将其转换为协议缓冲区对象。然后我调用“writeDelimitedTo”
我的录音机示例:
try {
writeLock.lock();
LimitOrder serializableQuote = ...
LimitOrderTransport gpbQuoteRaw = serializableQuote.serialize();
LimitOrderTransport gpbQuote = LimitOrderTransport.newBuilder(gpbQuoteRaw).build();
gpbQuote.writeDelimitedTo(fileStream);
csvWriter1.println(gpbQuote.getIdNumber() + DELIMITER+ gpbQuote.getSymbol() + ...);
} finally {
writeLock.unlock();
}
Run Code Online (Sandbox Code Playgroud)
锁定的原因是因为来自不同市场的报价由不同的线程处理,所以我试图简化并将日志记录“序列化”到文件中。
读取结果文件的代码:
FileInputStream stream = new FileInputStream(pathToFile);
PrintWriter writer = new PrintWriter("quoteStream6-compare.csv", "UTF-8");
while(LimitOrderTransport.newBuilder().mergeDelimitedFrom(stream)) {
LimitOrderTransport gpbQuote= LimitOrderTransport.parseDelimitedFrom(stream);
csvWriter2.println(gpbQuote.getIdNumber()+DELIMITER+ gpbQuote.getSymbol() ...);
}
Run Code Online (Sandbox Code Playgroud)
当我运行记录器时,我得到一个似乎在增大的二进制文件。当我使用阅读器阅读文件时,我似乎也得到了大量的引用。它们都是不同的并且看起来都是正确的。
问题是:许多引用似乎“丢失” - 当我的读者从文件中读取时不存在。
我尝试使用 csvWriter1 和 csvWriter2 进行实验。在我的编写器中,我写出一个 csv 文件,然后在我的阅读器中,我使用 protobufs 文件作为源编写第二个 cvs 文件。
理论上来说,它们应该匹配。他们不匹配。原始 csv 文件包含的引号比我通过读取 protobufs 记录数据生成的 csv 更多。
是什么赋予了?我是否没有正确使用 writeDelimitedTo/parseDelimitedFrom ?
谢谢!
将应用程序从Java 7切换到Java 8时出现问题.更改JDK后,我开始收到此SSLPeerUnverified异常.改回Java7,也不例外.
我发现了这个问题:Java 7的SSL连接失败,这意味着这可能与服务器端问题有关.我们的服务器确实在Ubuntu机器上运行,但它也在运行Java8(sun Java8)
不确定发布还有什么其他内容.如果需要/有用,我可以提供代码示例.我现在没有把它们包括在内,因为好像代码不是问题.
编辑 - 链接到我的SSLSocketFactory扩展:http://pastebin.com/2j6HDHE7
Edit2 - Http客户端代码:
private HttpClient getHttpClient() throws GeneralSecurityException, IOException {
final KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
trustStore.load(CommandChannel.class.getResourceAsStream("myKeystore"), "myPassword".toCharArray());
final SSLSocketFactory sslSocketFactory = new TrustingSSLSocketFactory(trustStore);
final SchemeRegistry registry = new SchemeRegistry();
registry.register(new Scheme("http", 80, PlainSocketFactory.getSocketFactory()));
registry.register(new Scheme("https", 443, sslSocketFactory));
final HttpParams params = new BasicHttpParams();
HttpProtocolParamBean paramsBean = new HttpProtocolParamBean(params);
paramsBean.setVersion(HttpVersion.HTTP_1_1);
paramsBean.setContentCharset("UTF_8");
final ClientConnectionManager ccm = new BasicClientConnectionManager(registry);
final DefaultHttpClient httpClient = new DefaultHttpClient(ccm, params);
return httpClient; …
Run Code Online (Sandbox Code Playgroud)