gpt4 book ai didi

java - 如何在 servlet 中获取 WebSphere ConfigService?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:23:40 26 4
gpt4 key购买 nike

我在 WebSphere Application Server 7 上的企业应用程序中有一个 servlet。
我希望 servlet 从自定义资源环境提供程序读取配置参数。

此特定环境不是 WebSphere Portal,我也没有使用 Spring,但我正在尝试调整此页面中有关将资源环境提供程序与 Spring 结合使用的代码:
http://blogs.perficient.com/portals/2012/03/28/using-wps-style-resource-environment-providers-with-spring

我的测试方法的第一行有问题:

com.ibm.websphere.management.configservice.ConfigService service
=com.ibm.websphere.management.configservice.ConfigServiceFactory.getConfigService();

此行中的 getConfigService() 方法在我的 servlet 中总是返回 null。该方法不会抛出任何异常,服务器日志中也不会出现任何错误;它只返回 null
(请注意,为了清楚起见,我在上面的代码中显示了包名称。在实际代码中,我导入相关类。)

如何在我的 servlet 中获取 ConfigService 对象?

ConfigServiceFactory 类也有一个 createConfigService(boolean enable, java.util.Properties props) 方法,但 Javadoc 没有说明其参数的预期内容,我找不到任何使用它的示例。

编辑:

我已经尝试按照 http://www-01.ibm.com/support/docview.wss?uid=swg21411254 的要求使用 ConfigServiceProxy,正如 Magic Wand 所建议的那样,但也无法正常工作。
问题详情如下。有谁知道如何进行这项工作?

关于使用 ConfigServiceProxy 的页面底部附近的第 5 点说:

Modify the properties connectProps.setProperty(AdminClient.CONNECTOR_HOST, "localhost"); and connectProps.setProperty(AdminClient.CONNECTOR_PORT, "8880") if needed.

但它没有说明如何确定正确的主机和端口,而且我没有在其他地方找到该信息,所以我只是猜测。

为了查找主机名和端口,我登录到 WebSphere Integrated Solutions Console,转到服务器 -> 服务器类型 -> WebSphere 应用程序服务器,单击运行我的 servlet 的应用程序服务器,然后单击“端口”。

这是我尝试获取 ConfigServiceProxy 的代码部分,其中我根据尝试的端口仅更改了主机名和端口号:

 Properties connectProps = new Properties();
connectProps.setProperty(AdminClient.CONNECTOR_TYPE,
AdminClient.CONNECTOR_TYPE_SOAP);
connectProps.setProperty(AdminClient.CONNECTOR_HOST,"localhost");
connectProps.setProperty(AdminClient.CONNECTOR_PORT,"9634");
AdminClient adminClient=AdminClientFactory.createAdminClient(connectProps);
ConfigService service=new ConfigServiceProxy(adminClient);

首先,我尝试了主机为“localhost”的唯一端口,因为这是链接示例使用的端口。端口名称为“IPC_CONNECTOR_ADDRESS”,端口号为 9634。
这会在调用 AdminClientFactory.createAdminClient 时产生异常。堆栈跟踪开始于:

com.ibm.websphere.management.exception.ConnectorException: ADMC0016E: The system cannot create a SOAP connector to connect to host localhost at port 9634.    at com.ibm.websphere.management.AdminClientFactory.createAdminClientPrivileged(AdminClientFactory.java:634)    at com.ibm.websphere.management.AdminClientFactory.access$000(AdminClientFactory.java:126)    at com.ibm.websphere.management.AdminClientFactory$1.run(AdminClientFactory.java:209)    at com.ibm.ws.security.util.AccessController.doPrivileged(AccessController.java:63)    at com.ibm.websphere.management.AdminClientFactory.createAdminClient(AdminClientFactory.java:205)    at com.isw.ResourceEnvironmentProviderPlaceHolderConfigurer.getConfigService(ResourceEnvironmentProviderPlaceHolderConfigurer.java:113)

And the nested causes are:

Caused by: java.lang.reflect.InvocationTargetException    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:56)    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:39)    at java.lang.reflect.Constructor.newInstance(Constructor.java:527)    at com.ibm.websphere.management.AdminClientFactory.createAdminClientPrivileged(AdminClientFactory.java:456)    ... 38 moreCaused by: com.ibm.websphere.management.exception.ConnectorNotAvailableException: [SOAPException: faultCode=SOAP-ENV:Client; msg=Connection reset; targetException=java.net.SocketException: Connection reset]    at com.ibm.ws.management.connector.soap.SOAPConnectorClient.reconnect(SOAPConnectorClient.java:422)    at com.ibm.ws.management.connector.soap.SOAPConnectorClient.(SOAPConnectorClient.java:222)    ... 43 moreCaused by: [SOAPException: faultCode=SOAP-ENV:Client; msg=Connection reset; targetException=java.net.SocketException: Connection reset]    at org.apache.soap.transport.http.SOAPHTTPConnection.send(SOAPHTTPConnection.java:479)    at org.apache.soap.rpc.Call.WASinvoke(Call.java:451)    at com.ibm.ws.management.connector.soap.SOAPConnectorClient$4.run(SOAPConnectorClient.java:372)    at com.ibm.ws.security.util.AccessController.doPrivileged(AccessController.java:118)    at com.ibm.ws.management.connector.soap.SOAPConnectorClient.reconnect(SOAPConnectorClient.java:365)    ... 44 more

Next, I tried a port named "SOAP_CONNECTOR_ADDRESS", where the host is the server's fully qualified domain name, and the port number is 8881, so the lines setting host and port look like:

 connectProps.setProperty(AdminClient.CONNECTOR_HOST,"server.company.net.au");
connectProps.setProperty(AdminClient.CONNECTOR_PORT,"9634");

这在尝试构造 ConfigServiceProxy 时产生了异常。堆栈跟踪以这些行开始,没有原因:

javax.management.InstanceNotFoundException: WebSphere:process=InfraCluster_server1,type=ConfigService,*    at com.ibm.websphere.management.configservice.ConfigServiceProxy.(ConfigServiceProxy.java:67)    at com.isw.ResourceEnvironmentProviderPlaceHolderConfigurer.getConfigService(ResourceEnvironmentProviderPlaceHolderConfigurer.java:114)    at com.isw.ResourceEnvironmentProviderPlaceHolderConfigurer.loadEnvironmentProviderProperties(ResourceEnvironmentProviderPlaceHolderConfigurer.java:205)    at com.isw.insight.client.REPTest.doGet(REPTest.java:50)

最后,我尝试了一个名为“WC_adminhost”的端口,其中主机为“*”,端口为 9062。我已经尝试过将主机名设置为“localhost”和服务器的完全限定域名,并且都因相同的异常而失败。
与 IPC_CONNECTOR_ADDRESS 端口一样,这会在调用 AdminClientFactory.createAdminClient 时产生异常。堆栈跟踪开始于:

com.ibm.websphere.management.exception.ConnectorException: ADMC0016E: The system cannot create a SOAP connector to connect to host server.company.net.au at port 9062.    at com.ibm.websphere.management.AdminClientFactory.createAdminClientPrivileged(AdminClientFactory.java:634)    at com.ibm.websphere.management.AdminClientFactory.access$000(AdminClientFactory.java:126)    at com.ibm.websphere.management.AdminClientFactory$1.run(AdminClientFactory.java:209)    at com.ibm.ws.security.util.AccessController.doPrivileged(AccessController.java:63)    at com.ibm.websphere.management.AdminClientFactory.createAdminClient(AdminClientFactory.java:205)    at com.isw.ResourceEnvironmentProviderPlaceHolderConfigurer.getConfigService(ResourceEnvironmentProviderPlaceHolderConfigurer.java:113)

嵌套的原因是:

Caused by: java.lang.reflect.InvocationTargetException    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:56)    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:39)    at java.lang.reflect.Constructor.newInstance(Constructor.java:527)    at com.ibm.websphere.management.AdminClientFactory.createAdminClientPrivileged(AdminClientFactory.java:456)    ... 36 moreCaused by: com.ibm.websphere.management.exception.ConnectorNotAvailableException: [SOAPException: faultCode=SOAP-ENV:Client; msg=Error opening socket: java.net.ConnectException: Connection refused; targetException=java.lang.IllegalArgumentException: Error opening socket: java.net.ConnectException: Connection refused]    at com.ibm.ws.management.connector.soap.SOAPConnectorClient.reconnect(SOAPConnectorClient.java:422)    at com.ibm.ws.management.connector.soap.SOAPConnectorClient.(SOAPConnectorClient.java:222)    ... 41 moreCaused by: [SOAPException: faultCode=SOAP-ENV:Client; msg=Error opening socket: java.net.ConnectException: Connection refused; targetException=java.lang.IllegalArgumentException: Error opening socket: java.net.ConnectException: Connection refused]    at org.apache.soap.transport.http.SOAPHTTPConnection.send(SOAPHTTPConnection.java:475)    at org.apache.soap.rpc.Call.WASinvoke(Call.java:451)    at com.ibm.ws.management.connector.soap.SOAPConnectorClient$4.run(SOAPConnectorClient.java:372)    at com.ibm.ws.security.util.AccessController.doPrivileged(AccessController.java:118)    at com.ibm.ws.management.connector.soap.SOAPConnectorClient.reconnect(SOAPConnectorClient.java:365)    ... 42 more

最佳答案

我无法确定为什么 ConfigServiceFactory.getConfigService() 总是返回 null,但我已经设法使用 AdminClient 获得了一个有效的 ConfigService 实例> 和 ConfigServiceProxy 基于 http://www-01.ibm.com/support/docview.wss?uid=swg21411254 中的代码.

基本代码是这样的,主机名和端口号可能会根据服务器配置而变化:

Properties connectProps = new Properties();
connectProps.setProperty(AdminClient.CONNECTOR_TYPE,
AdminClient.CONNECTOR_TYPE_SOAP);
connectProps.setProperty(AdminClient.CONNECTOR_HOST,"localhost");
connectProps.setProperty(AdminClient.CONNECTOR_PORT,"8880");
AdminClient adminClient=AdminClientFactory.createAdminClient(connectProps);
ConfigService service=new ConfigServiceProxy(adminClient);

IBM 支持文档没有说明如何确定正确的主机和端口。这里有一些细节:

当 WebSphere Application Server 配置为没有部署管理器的单个服务器时,主机名“localhost”和端口号 8880 是默认值。在集群环境下,至少每个应用服务器的端口号会有所不同。

在我的集群测试环境中,我首先检查了 WebSphere Integrated Solutions Console (ISC) 中为每个应用程序服务器列出的端口。这些都不正确。

我随后发现(通过谷歌搜索)每个服务器都有几个文件控制实际使用的端口。
这些文件位于 ${USER_INSTALL_ROOT}/properties 中每个应用程序服务器的文件系统中。
${USER_INSTALL_ROOT}的值可以在ISC的“Environment -> Websphere variables”中找到。
Linux 上的完整目录路径通常为/opt/IBM/WebSphere/AppServer/profiles/AppSrv01/properties。
在该目录中,可以在文件“wsadmin.properties”中找到正确的主机名和端口。

除了使用正确的主机和端口外,我的环境还需要 SOAP 连接的用户名/密码身份验证。这可以通过两种方式完成。

凭据可以在代码中设置,在调用AdminClientFactory.createAdminClient之前将这两行添加到上面的代码中:

connectProps.setProperty(AdminClient.USERNAME,"username");
connectProps.setProperty(AdminClient.PASSWORD,"password");

这需要明文形式的密码,不推荐。

或者,可以在与“wsadmin.properties”文件相同目录下的“soap.client.props”文件中设置凭据。
在运行代码的每个应用程序服务器上的“soap.client.props”中,必须设置这些属性:

com.ibm.SOAP.securityEnabled=truecom.ibm.SOAP.loginUserid=usernamecom.ibm.SOAP.loginPassword=password

请特别注意 com.ibm.SOAP.securityEnabled 属性:对于要使用的用户名和密码,其值必须为 true

设置这些属性并在每个服务器上保存文件后,在操作系统控制台中使用“PropFilePasswordEncoder”命令对密码进行编码。
我为此命令使用了以下文档:
http://publib.boulder.ibm.com/infocenter/wsdoc400/v6r0/index.jsp?topic=/com.ibm.websphere.iseries.doc/info/ae/ae/qshpropenc.htm

我的应用服务器上实际使用的命令是:
/opt/IBM/WebSphere/AppServer/bin/PropFilePasswordEncoder.sh/opt/IBM/WebSphere/AppServer/profiles/AppSrv01/properties/soap.client.props com.ibm.SOAP.loginPassword
这仅对基本身份验证的密码进行编码,因为我的配置不对 SOAP 使用 SSL。

完成这一切后,我的代码就可以工作了。
在上述过程中,我不必在任何时候重新启动任何服务器。

关于java - 如何在 servlet 中获取 WebSphere ConfigService?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25320097/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com