如何在servlet中获取WebSphere ConfigService?

时间:2014-08-15 01:40:23

标签: java servlets websphere

我在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 (注意,为了清楚起见,我在上面的代码中显示了包名。在实际代码中,我import相关的类。)

如何在servlet中获取ConfigService对象?

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

修改

我已尝试按照http://www-01.ibm.com/support/docview.wss?uid=swg21411254使用ConfigServiceProxy按照魔杖的建议使用ConfigServiceProxy,并且无法使其工作。
问题详情如下。有谁知道如何使这项工作?

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

  

修改属性connectProps.setProperty(AdminClient.CONNECTOR_HOST," localhost");和connectProps.setProperty(AdminClient.CONNECTOR_PORT," 8880")如果需要。

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

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

这是我的代码中尝试获取 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);的部分,其中我根据我尝试的端口仅更改主机名和端口号:

AdminClientFactory.createAdminClient

首先,我尝试了主机所在的唯一端口" localhost",因为这是链接示例使用的内容。其端口名称为" IPC_CONNECTOR_ADDRESS",端口号为9634.
这会在调用 connectProps.setProperty(AdminClient.CONNECTOR_HOST,"server.company.net.au"); connectProps.setProperty(AdminClient.CONNECTOR_PORT,"9634");时产生异常。堆栈跟踪以:

开头
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)

嵌套的原因是:

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 more
Caused 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 more
Caused 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

接下来,我尝试了一个名为" SOAP_CONNECTOR_ADDRESS"的端口,其中主机是服务器的完全限定域名,端口号是8881,因此设置主机和端口的行看起来像:

ConfigServiceProxy

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

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端口一样,这会在调用{{1}}时产生异常。堆栈跟踪以:

开头
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 more
Caused 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 more
Caused 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

1 个答案:

答案 0 :(得分:2)

我无法确定为什么ConfigServiceFactory.getConfigService()始终返回null,但我已设法根据来自{的代码使用ConfigServiceAdminClient获取有效的ConfigServiceProxy实例{3}}

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

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配置为没有Deployment Manager的单个服务器时,主机名“localhost”和端口号8880是缺省值。在集群环境中,每个应用程序服务器的端口号至少不同。

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

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

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

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

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

这需要使用纯文本密码,不建议使用。

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

com.ibm.SOAP.securityEnabled=true
com.ibm.SOAP.loginUserid=username
com.ibm.SOAP.loginPassword=password

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

设置这些属性并在每台服务器上保存文件后,在操作系统控制台中使用“PropFilePasswordEncoder”命令对密码进行编码。
我使用以下文档来执行此命令:
http://www-01.ibm.com/support/docview.wss?uid=swg21411254

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

毕竟,我的代码有效 我无需在上述过程中的任何时刻重启任何服务器。