小编Shc*_*ein的帖子

随机类线程安全吗?

Random在多个线程之间共享一个类的实例是否有效?nextInt(int)特别是从多个线程调用?

java random multithreading thread-safety

106
推荐指数
5
解决办法
3万
查看次数

URLConnection不遵循重定向

我无法理解为什么Java HttpURLConnection不遵循重定向.我使用以下代码来获取此页面:

import java.net.URL;
import java.net.HttpURLConnection;
import java.io.InputStream;

public class Tester {

    public static void main(String argv[]) throws Exception{
        InputStream is = null;

        try {
            String httpUrl = "http://httpstat.us/301";
            URL resourceUrl = new URL(httpUrl);
            HttpURLConnection conn = (HttpURLConnection)resourceUrl.openConnection();
            conn.setConnectTimeout(15000);
            conn.setReadTimeout(15000);
            conn.connect();
            is = conn.getInputStream();
            System.out.println("Original URL: "+httpUrl);
            System.out.println("Connected to: "+conn.getURL());
            System.out.println("HTTP response code received: "+conn.getResponseCode());
            System.out.println("HTTP response message received: "+conn.getResponseMessage());
       } finally {
            if (is != null) is.close();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

而且,我收到以下回复(看起来绝对正确!):

Original URL: http://httpstat.us/301
Connected to: …

java https redirect httpurlconnection http-redirect

92
推荐指数
5
解决办法
8万
查看次数

Linux静态链接已经死了?

事实上,Linux上的-static gcc标志现在不起作用.让我引用GNU libc FAQ:

2.22.即使是静态链接的程序也需要一些我不能接受的共享库.我能做什么?

如果没有共享库,{AJ} NSS(详细信息只需输入`info libc"Name Service Switch"')将无法正常工作.NSS允许通过仅更改一个配置文件(/etc/nsswitch.conf)而不重新链接任何程序来使用不同的服务(例如NIS,文件,db,hesiod).唯一的缺点是现在静态库需要访问共享库.这由GNU C库透明地处理.

解决方案是使用--enable-static-nss配置glibc.在这种情况下,您可以创建一个仅使用服务dns和文件的静态二进制文件(为此更改/etc/nsswitch.conf).您需要明确链接所有这些服务.例如:

 gcc -static test-netdb.c -o test-netdb \
   -Wl,--start-group -lc -lnss_files -lnss_dns -lresolv -Wl,--end-group
Run Code Online (Sandbox Code Playgroud)

这种方法的问题在于您必须将使用NSS例程的每个静态程序与所有这些库链接起来.
{UD}事实上,不能再说使用此选项编译的libc正在使用NSS.没有开关了.因此,强烈 建议不要使用--enable-static-nss,因为这会使系统上程序的行为不一致.

关于这个事实,现在有什么合理的方法可以在Linux上创建一个功能齐全的静态构建,或者静态链接在Linux上完全没用?我的意思是静态构建:

  • 行为与动态构建完全相同(静态nss具有不一致的行为是邪恶的!);
  • 适用于glibc环境和Linux版本的合理变体;

linux gcc glibc static-linking

61
推荐指数
6
解决办法
4万
查看次数

Java HttpURLConnection InputStream.close()挂起(或工作时间太长?)

首先,一些背景.有一个工作人员扩展/解决了一堆短URL:

http://t.co/example -> http://example.com
Run Code Online (Sandbox Code Playgroud)

所以,我们只是按照重定向.而已.我们不会从连接中读取任何数据.在我们得到200之后,我们返回最终的URL并关闭InputStream.

现在,问题本身.在生产服务器上,其中一个解析程序线程挂起在InputStream.close()调用内:

"ProcessShortUrlTask" prio=10 tid=0x00007f8810119000 nid=0x402b runnable [0x00007f882b044000]
   java.lang.Thread.State: RUNNABLE
        at java.io.BufferedInputStream.fill(BufferedInputStream.java:218)
        at java.io.BufferedInputStream.skip(BufferedInputStream.java:352)
        - locked <0x0000000561293aa0> (a java.io.BufferedInputStream)
        at sun.net.www.MeteredStream.skip(MeteredStream.java:134)
        - locked <0x0000000561293a70> (a sun.net.www.http.KeepAliveStream)
        at sun.net.www.http.KeepAliveStream.close(KeepAliveStream.java:76)
        at java.io.FilterInputStream.close(FilterInputStream.java:155)
        at sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.close(HttpURLConnection.java:2735)
        at ru.twitter.times.http.URLProcessor.resolve(URLProcessor.java:131)
        at ru.twitter.times.http.URLProcessor.resolve(URLProcessor.java:55)
        at ...
Run Code Online (Sandbox Code Playgroud)

经过简单的研究,我明白skip()在将数据流发送回连接池之前会调用它来清理流(如果设置了keep-alive?).我仍然不明白如何避免这种情况.此外,我怀疑代码中是否存在一些不良设计或JDK中存在问题.

所以,问题是:

  1. 是否可以避免挂close()?例如,保证一些合理的超时.
  2. 是否可以避免从连接中读取数据?记住我只想要最终的URL.实际上,我想,我根本不想 skip()被召唤......

更新:

KeepAliveStream,第79行,close()方法:

    // Skip past the data that's left in the Inputstream because
    // some sort of error may have occurred. …
Run Code Online (Sandbox Code Playgroud)

java tcp http httpurlconnection

9
推荐指数
1
解决办法
2954
查看次数

异常后使用java http连接实例

以下代码是否安全:

try {
    URL url = new URL(urlRequest);
    conn = (HttpURLConnection)url.openConnection();
    conn.setConnectTimeout(30000);
    conn.setReadTimeout(30000);
    conn.setRequestProperty("Accept-Encoding", "gzip, deflate");
    String encoding = conn.getContentEncoding();
    return Utils.wrapCompressedStream(conn.getInputStream(), encoding);
} catch (IOException e) {
    if(conn != null) {
        conn.getContentEncoding();
        conn.getErrorStream();
        conn.whateverOtherMethodThere();
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

特别是,在InterruptedIOException(例如,读取超时)的情况下调用类似的方法getContentEncoding()是否安全?据我所知,这种方法需要实时连接来读取HTTP(S)头.

更新(附加信息):

这个问题源于真实的系统体验.我相信,系统是在Oracle/Sun JVM 1.6上运行的.代码几乎相同:

...    
} catch (IOException e) {
    if(conn != null) {
         try {
             String response = tryGetResponse(conn);
...
Run Code Online (Sandbox Code Playgroud)

在这个问题发生tryGetResponseHTTPS请求:

 private static String tryGetResponse(HttpURLConnection conn) {
    if(conn == null) return "(failed to get)"; …
Run Code Online (Sandbox Code Playgroud)

java urlconnection httpurlconnection httpsurlconnection

9
推荐指数
1
解决办法
1409
查看次数

如何确定glibc(glibcxx)二进制的版本将取决于?

众所周知,glibc(以及据我所知,glibstd ++)也使用符号版本控制机制.(有关详细信息,请参阅: 如何链接到特定的glibc版本.)

问题是如何确定GLIBC和GLIBCXX的确切版本将由链接器为libc和libstdc ++中的名称选择?例如,如何得到这样的东西:

time -> time@GLIBC_2_5
...
gethostbyname -> gethostbyname@GLIBC_2_3
Run Code Online (Sandbox Code Playgroud)

我们为什么需要这个?在我看来,如果你想最小化所需的glibc/libstdc ++版本,它会很有用.

linux glibc libstdc++

7
推荐指数
1
解决办法
1万
查看次数

Gunicorn + flask + pymongo + gevent在初始化时挂起

简单的测试应用:

from gevent import monkey
monkey.patch_all()

from pymongo import Connection, MongoClient
from flask import Flask, make_response

app = Flask(__name__)
print "connect"
connection = MongoClient("host1, host2, host3", 27017, max_pool_size=4, **{"connectTimeoutMS": 3000, "socketTimeoutMS": 3000, "use_greenlets": True})
print "db"
db = connection.barn_2

@app.route('/')
def hello_world():
    return make_response("Hello world!", 200, {'Content-type': 'application/json; charset=UTF-8'})

if __name__ == '__main__':
    app.run()
Run Code Online (Sandbox Code Playgroud)

如果它作为一个独立的应用程序运行,它可以完美运行:

shcheklein@hostname:~$ python test.py
connect
db
 * Running on http://127.0.0.1:5000/
127.0.0.1 - - [07/Apr/2014 13:07:31] "GET / HTTP/1.1" 200 -
^CKeyboardInterrupt
Run Code Online (Sandbox Code Playgroud)

但没有从gunicorn开始:

shcheklein@hostname:~$ gunicorn -w 1 …
Run Code Online (Sandbox Code Playgroud)

python pymongo gevent flask gunicorn

7
推荐指数
1
解决办法
2035
查看次数

无法在Solaris上应用统一的diff补丁

例如,如果我有两个文件:

文件1:

This is file 1
Run Code Online (Sandbox Code Playgroud)

和file2:

This is file 2
Run Code Online (Sandbox Code Playgroud)

并使用以下命令创建补丁:

diff -u file1 file2 > files.patch
Run Code Online (Sandbox Code Playgroud)

结果是:

--- file1       Fri Aug 13 17:53:28 2010
+++ file2       Fri Aug 13 17:53:38 2010
@@ -1,1 +1,1 @@
-This is file 1
+This is file 2
Run Code Online (Sandbox Code Playgroud)

然后,如果我尝试在Solaris上使用patch命令应用此补丁:

patch -u -i files.patch
Run Code Online (Sandbox Code Playgroud)

它挂在:

 Looks like a unified context diff.
File to patch:
Run Code Online (Sandbox Code Playgroud)

1.有没有办法将Solaris 本机补丁命令与统一差异一起使用?

2.如果无法应用统一格式,哪种差异格式被认为是最便携的?

更新: 我在问题的第一部分找到了答案.patch如果第二个文件(在这种情况下为file2)与第一个文件(file1)存在于同一文件夹中,那么Solaris上似乎会挂起.例如,以下相当常见的差异:

--- a/src/file.src       Sat Aug 14 23:07:29 2010
+++ b/src/file.src       Sat Aug 14 …
Run Code Online (Sandbox Code Playgroud)

diff patch solaris unified-diff

5
推荐指数
2
解决办法
5545
查看次数

JMS 容错异步发布者

在我们的架构中,即使与本地网络的连接丢失,JMS 发布者也可以继续工作(并生成新消息)。是否可以使用 JMS 使发布服务器容忍网络或代理中断:

  1. 即使代理不可用,发布调用也可能不会阻止应用程序;
  2. 发布的消息(在中断期间)必须在网络连接恢复后传递;

据我所知,它可以在每台发布机器上使用嵌入式(本地)代理来完成。如果这是唯一的方法,那么该拓扑是否存在任何不明显的问题 - 性能、维护等?本地代理是否可以自行容忍中断?

java messaging jms

5
推荐指数
1
解决办法
1683
查看次数

Docker - 增加/ dev/shm的大小

要运行Sedna XML数据库,我需要增加它的大小/dev/shm.它现在是64M.

有一些简单的方法来做到这一点?

docker sedna

5
推荐指数
2
解决办法
3530
查看次数

Win7 WOW64中应用程序中的奇怪线程

我们在应用程序中观察到Windows 7 x64上的4-6个线程,这些线程有3个线程,并且在Windows 7之前的任何Windows(32位或64位)上都能正常运行.

Process Explorer显示以下"未知"线程:

ntdll.dll!EtwDeliverDataBlock+offset
Run Code Online (Sandbox Code Playgroud)

在随机间隔之后出现以下线程:

ntdll.dll!TpCallbackIndependent+offset
ntdll.dll!TpCallbackIndependent+offset
Run Code Online (Sandbox Code Playgroud)

之后该应用程序无法创建线程(错误代码8,足够热的空间......).

在我看来,一些系统DLL创建ETW线程或其他东西.有谁知道这些线程是什么以及如何管理它们?

etw windows-7

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

是否有透明的方法可以在Solaris上强制执行64位gcc编译

有没有一种方法可以强制'-m64'不覆盖CXXFLAGS / CFLAGS。我想要像在Linux / BSD amd64中一样的自动x64构建环境。

我为什么需要这个?

问题是项目的复杂性,我需要在Solaris上将其作为x64。它包含几个部分,每个部分都可以使用特定的C / C ++编译器标志。因此,我不能只运行:

CXXFLAGS=-m64 O2 ...
CFLAGS=-m64 -O2 ...
./configure
Run Code Online (Sandbox Code Playgroud)

因为没有通用的C / C ++标志。

我需要的是将'-m64'透明地附加到每个gcc / g ++调用中的方法。

64-bit gcc solaris

1
推荐指数
1
解决办法
2万
查看次数