我在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
答案 0 :(得分:2)
我无法确定为什么ConfigServiceFactory.getConfigService()
始终返回null,但我已设法根据来自{的代码使用ConfigService
和AdminClient
获取有效的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。
毕竟,我的代码有效 我无需在上述过程中的任何时刻重启任何服务器。