- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我在 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/
我需要将文本放在 中在一个 Div 中,在另一个 Div 中,在另一个 Div 中。所以这是它的样子: #document Change PIN
奇怪的事情发生了。 我有一个基本的 html 代码。 html,头部, body 。(因为我收到了一些反对票,这里是完整的代码) 这是我的CSS: html { backgroun
我正在尝试将 Assets 中的一组图像加载到 UICollectionview 中存在的 ImageView 中,但每当我运行应用程序时它都会显示错误。而且也没有显示图像。 我在ViewDidLoa
我需要根据带参数的 perl 脚本的输出更改一些环境变量。在 tcsh 中,我可以使用别名命令来评估 perl 脚本的输出。 tcsh: alias setsdk 'eval `/localhome/
我使用 Windows 身份验证创建了一个新的 Blazor(服务器端)应用程序,并使用 IIS Express 运行它。它将显示一条消息“Hello Domain\User!”来自右上方的以下 Ra
这是我的方法 void login(Event event);我想知道 Kotlin 中应该如何 最佳答案 在 Kotlin 中通配符运算符是 * 。它指示编译器它是未知的,但一旦知道,就不会有其他类
看下面的代码 for story in book if story.title.length < 140 - var story
我正在尝试用 C 语言学习字符串处理。我写了一个程序,它存储了一些音乐轨道,并帮助用户检查他/她想到的歌曲是否存在于存储的轨道中。这是通过要求用户输入一串字符来完成的。然后程序使用 strstr()
我正在学习 sscanf 并遇到如下格式字符串: sscanf("%[^:]:%[^*=]%*[*=]%n",a,b,&c); 我理解 %[^:] 部分意味着扫描直到遇到 ':' 并将其分配给 a。:
def char_check(x,y): if (str(x) in y or x.find(y) > -1) or (str(y) in x or y.find(x) > -1):
我有一种情况,我想将文本文件中的现有行包含到一个新 block 中。 line 1 line 2 line in block line 3 line 4 应该变成 line 1 line 2 line
我有一个新项目,我正在尝试设置 Django 调试工具栏。首先,我尝试了快速设置,它只涉及将 'debug_toolbar' 添加到我的已安装应用程序列表中。有了这个,当我转到我的根 URL 时,调试
在 Matlab 中,如果我有一个函数 f,例如签名是 f(a,b,c),我可以创建一个只有一个变量 b 的函数,它将使用固定的 a=a1 和 c=c1 调用 f: g = @(b) f(a1, b,
我不明白为什么 ForEach 中的元素之间有多余的垂直间距在 VStack 里面在 ScrollView 里面使用 GeometryReader 时渲染自定义水平分隔线。 Scrol
我想知道,是否有关于何时使用 session 和 cookie 的指南或最佳实践? 什么应该和什么不应该存储在其中?谢谢! 最佳答案 这些文档很好地了解了 session cookie 的安全问题以及
我在 scipy/numpy 中有一个 Nx3 矩阵,我想用它制作一个 3 维条形图,其中 X 轴和 Y 轴由矩阵的第一列和第二列的值、高度确定每个条形的 是矩阵中的第三列,条形的数量由 N 确定。
假设我用两种不同的方式初始化信号量 sem_init(&randomsem,0,1) sem_init(&randomsem,0,0) 现在, sem_wait(&randomsem) 在这两种情况下
我怀疑该值如何存储在“WORD”中,因为 PStr 包含实际输出。? 既然Pstr中存储的是小写到大写的字母,那么在printf中如何将其给出为“WORD”。有人可以吗?解释一下? #include
我有一个 3x3 数组: var my_array = [[0,1,2], [3,4,5], [6,7,8]]; 并想获得它的第一个 2
我意识到您可以使用如下方式轻松检查焦点: var hasFocus = true; $(window).blur(function(){ hasFocus = false; }); $(win
我是一名优秀的程序员,十分优秀!