小编eak*_*913的帖子

备用Java选择器实现

我正在编写一个具有网络组件的高性能/低垃圾应用程序(微秒级).我遇到的一个痛点是内置的Selector Selector for Java NIO的实现.

一些有问题的事情:

  • 大量的对象创建.几乎每次调用selectedKeys()都会创建很多对象.迭代器,装箱/拆箱,你的名字.大多数其他情况不是问题,但我正在编写的应用程序需要创建尽可能少的垃圾.
  • 分层锁定和同步.在构建selectorImpls时,一堆Java锁原语不存在.结果它很笨重而且不是最佳的.在我的用例中,只有一个线程调用,select因此锁定实际上是无用的.

扩展或更改选择器实现是不可能的.大多数类都是最终的,私有和包私有成员位于sun.nio.ch.*包中.原生方法也使事情变得复杂.

是否还有其他更现代的选择器实现可能更高效?

我检查过的网络库只是使用了内置的Java选择器.任何帮助,将不胜感激.

java java-native-interface nio

14
推荐指数
1
解决办法
698
查看次数

App Engine的URLFetch:http GET在本地工作,但在特定URL上部署到GAE时则不起作用

问题:

本地我的应用程序工作正常.我的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)

java google-app-engine get http

4
推荐指数
1
解决办法
1690
查看次数

writeDelimitedTo/parseDelimitedFrom 似乎正在丢失数据

我正在尝试使用协议缓冲区来记录一些市场数据。每次我从市场收到报价通知时,我都会获取该报价并将其转换为协议缓冲区对象。然后我调用“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 protocol-buffers

4
推荐指数
1
解决办法
5143
查看次数

Java 8 javax.net.ssl.SSLPeerUnverifiedException:peer未经过身份验证,但不是Java 7

将应用程序从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)

java ssl java-8

4
推荐指数
1
解决办法
5611
查看次数