3

我正在开发一个 Java 应用程序( J2SE )。在我的应用程序中,我应该通过队列发送消息(使用 Weblogic 的 JDNI),然后应该与 HTTP Web url 交互(使用 URLConnection)。

如果我尝试使用 URLConnection 与 HTTP Web 交互,它会成功。但是,在队列发送消息后,与 HTTP 网络(使用 URLConnection)的交互总是失败。在我极大地减少了源代码之后,我终于发现设置JDNI的代码影响了UrlConnection对象的制作。

下面是解释的源代码。

private void test() throws IOException, NamingExcpetion {
    HttpUrlConnection c1 = getConnection();
    System.out.println(c1);

    initContext();

    HttpUrlConnection c2 = getConnection();
    System.out.println(c2);
}


public void initContext() throws ... {
    Properties prop = new Properties();

    Prop.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory");
    Prop.put(Context.PROVIDER_URL, "t3://111.111.111.111:7100");  // my target weblogic server having queues.

    new InitialContext(prop);
    System.out.println("InitialContext() finished!!");
}

public HttpURLConnection getConnection() throws .... {
    URL url = new URL("http://222.222.222.222:8100/login");  // My target server to be interacting via URLConnection; I'm using java.net.URL
    return (HttpURLConnection) url.openConnection();
}


And below is the result.
sun.net.www.protocol.http.HttpURLConnection:http://222.222.222.222:8100/login
InitialContext() finished!!
weblogic.net.http.SOAPHttpURLConnection:http://222.222.222.222:8100/login

即使 InitialContext() 方法调用完成,我希望返回 HttpURLConnection,但实际上 SOAPHttpURLConnection 已通过 url.openConnction(); 返回 所以,我不能使用它与网页交互。

为什么 SOAPHttpURLConnection 已经返回?我该如何解决这个问题?

4

1 回答 1

1

您可以通过设置系统属性 UseSunHttpHandler 来强制 weblogic 使用默认处理程序。添加 -DUseSunHttpHandler=true到您的 JVM 参数中。我了解您不是在 weblogic 容器中运行,而只是在 J2SE 代码中运行,但我猜 weblogic 上下文工厂类或某些 weblogic 库代码正在注册返回 weblogic http 处理程序的 URLStreamHandlerFactory。我之所以这么说是因为 JDK 的 URL 类缓存了处理程序。因此,在您的第一个请求期间,它从 sun 默认 pkg 返回 HTTP 处理程序,它应该缓存它并始终从缓存中返回相同的处理程序。JDK 清除此 Handler 缓存的唯一可能情况是有人注册了一个新的 URLStreamHandlerFactory。

验证这一点的其他选项:初始化 Initialcontext 后,尝试调用 URL.setURLStreamHandlerFactory。如果 weblogic 已经注册了一个工厂,你应该得到一个异常,因为 JVM 只允许调用该方法一次。

于 2016-02-25T07:43:48.847 回答