我已经安装了Weblogic 12.2.1和最新的Logstash 7.5.2版本以及JMS插件v3.1.2。我正在努力使用 JMS 插件,并且我已经设置了 .conf 和 .yml,但它不起作用!
在
destination
字段中,文档和示例建议没有 JNDI 名称,只有队列或主题名称!
jms.conf
的输入:
input {
jms {
pub_sub => false
include_header => false
include_properties => false
include_body => true
use_jms_timestamp => false
yaml_file => "/home/chris/Downloads/logstash-7.5.2/config/jms.yml"
yaml_section => "weblogic"
destination => "DemoQ"
}
}
jms.yml
:
weblogic:
:jndi_name: jms/DemoCF
:jndi_context:
java.naming.factory.initial: weblogic.jndi.WLInitialContextFactory
java.naming.provider.url: t3://localhost:7001
java.naming.factory.url.pkgs: javax.naming:javax.jms
java.naming.security.principal: weblogic
java.naming.security.credentials: *****!
:require_jars:
- /home/chris/Downloads/wlogic/fmw_12.2.1.0.0_wls_quick_Disk1_1of1/wls12210/wlserver/server/lib/wlthint3client.jar
- /home/chris/Downloads/wlogic/fmw_12.2.1.0.0_wls_quick_Disk1_1of1/wls12210/wlserver/server/lib/wljmsclient.jar
- /home/chris/Downloads/wlogic/fmw_12.2.1.0.0_wls_quick_Disk1_1of1/wls12210/wlserver/server/lib/wlclient.jar
以及 Logstash 的输出:
[2020-01-31T14:50:10,284][WARN ][logstash.inputs.jms ][main] JMS Consumer Died {:exception=>"Java::WeblogicJmsCommon::JMSException", :exception_message=>"[JMSExceptions:045101]The destination name passed to the createTopic or createQueue "DemoQ" is invalid. If the destination name does not contain a "/" character, then it must be the name of a distributed destination that is available in the cluster to which the client is attached. If it does contain a "/" character, then the string before the "/" must be the name of a JMS server or a ".". The string after the "/" is the name of a the desired destination. If the "./" version of the string is used then any destination with the given name on the local WebLogic Server instance
几天后我想通了!在目的地使用领域: jmsmodulename!destinationname(来自 Oracle 文档), 对于集群环境!! 既不是“/”也不是“./”
Logstash 不使用 JNDI 查找目标,而是简单地使用 JMS API 调用 javax.jms.Session.createQueue()(如果
pubsub
是 false
)或 javax.jms.Session.createTopic ()(如果 pubsub
是 true
)。
虽然我对 WebLogic 不太熟悉,但它返回的错误消息似乎非常清楚:
传递给createTopic或createQueue“DemoQ”的目标名称无效。如果目标名称不包含“/”字符,则它必须是客户端所连接的集群中可用的分布式目标的名称。如果它确实包含“/”字符,则“/”之前的字符串必须是JMS 服务器的名称或“.”。 “/”后面的字符串是所需目的地的名称。如果使用字符串的“./”版本,则本地 WebLogic Server 实例上具有给定名称的任何目标
这表明你的配置无效,特别是这一点:
destination => "DemoQ"
它似乎还建议您改用它:
destination => "./DemoQ"
我得到这个是因为我们使用了 Spring 创建的默认
DestinationResolver
bean(DynamicDestinationResolver
的实例)。
我将其更改为
JndiDestinationResolver
以解决问题。
@Bean
static DestinationResolver jndiDestinationResolver(JndiTemplate jndiTemplate) {
//spring default is DynamicDestinationResolver
JndiDestinationResolver jndiDestinationResolver = new JndiDestinationResolver()
jndiDestinationResolver.jndiTemplate = jndiTemplate
return jndiDestinationResolver
}