设计:我有一个带有服务器连接通道(EXAMPLE.CHANNEL)的队列管理器(EXAMPLE.QM),请求队列(EXAMPLE.TEST.QUEUE)和回复队列(EXAMPLE.TEST) 。答复)。我的应用程序将使用消息驱动bean(MDB)来侦听EXAMPLE.TEST.QUEUE。当消息到达时,创建MDB实例并完成业务逻辑,其中包括查询数据库,然后将答复放在EXAMPLE.TEST.REPLY队列上。这是一个交易。如果发生崩溃或任何故障,将捕获异常并回滚所有内容。我想在服务器端为MQ和数据库建立连接池。
设置: WebSphere MQ 7.0.1,JBoss 6.2 EAP,Java 1.7.0_21,IBM DB2 9.7
我从 MQ_INSTALLATION_PATH \ java \ lib \ jca 获得了wmq.jmsra.rar 我也得到了com.ibm.mqetclient.jar
根据Redhat installation guide为了支持XATransactions我使用命令 jar -uf wmq.jmsra.rar com.ibm.mqetclient重新打包wmq.jmsra.rar以包含com.ibm.mqetclient.jar的.jar
您可以跳过下一段并查看下面提供的xml代码段,以获取相同的信息。
执行此操作后,将wmq.jmsra.rar手动删除到JBoss部署目录中,我使用了管理控制台。然后我继续在资源适配器下的配置文件视图中添加。我将Archive设置为wmq.jmsra.rar并将TX设置为XATransaction。然后我将属性设置为以下:logWriterEnabled - true,maxConnections - 10,reconnectionRetryCount - 5,traceLevel - 6,traceEnabled - true,reconnectionRetryInterval - 300000,connectionConcurrency - 5.执行此操作后,我添加了连接定义。我将其命名为WMQ_ConnectionFactory,JNDI - java:jboss / WMQ_ConnectionFactory和Connection Class - com.ibm.mq.connector.outbound.ManagedConnectionFactoryImpl。我将属性设置如下:port - 1414,hostName - localhost,channel - EXAMPLE.CHANNEL,transportType - BINDINGS_THEN_CLIENT,failIfQuiesce - true和queueManager - EXAMPLE.QM。然后我继续添加2个管理对象。首先,我命名为EXAMPLE_REQ_Queue,JNDI - java:jboss / EXAMPLE_REQ_Queue,以及类名 - com.ibm.mq.connector.outbound.MQQueueProxy。我有它以下属性:useJNDI - true,readAheadClosePolicy - ALL,startTimeout - 10000,destination - EXAMPLE.TEST.REQUEST,destinationType - javax.jms.Queue。第二个管理对象我命名为EXAMPLE_REP_Queue,JNDI - java:jboss / EXAMPLE_REP-Queue,以及类名 - com.ibm.mq.connector.outbound.MQQueueProxy。我赋予它以下属性:failifQuiesce - true,baseQueueManagerName - EXAMPLE.QM,persistence - HIGH,encoding - NNN,baseQueueName - EXAMPLE.TEST.REPLY,targetClient - MQ,expiry 300000.
以下是standalone.xml文件的片段
<subsystem xmlns="urn:jboss:domain:resource-adapters:1.1">
<resource-adapters>
<resource-adapter id="wmq.jmsra.rar">
<archive>
wmq.jmsra.rar
</archive>
<transaction-support>XATransaction</transaction-support>
<config-property name="logWriterEnabled">
true
</config-property>
<config-property name="maxConnections">
10
</config-property>
<config-property name="traceEnabled">
true
</config-property>
<config-property name="traceLevel">
6
</config-property>
<config-property name="reconnectionRetryCount">
5
</config-property>
<config-property name="reconnectionRetryInterval">
300000
</config-property>
<config-property name="connectionConcurrency">
5
</config-property>
<connection-definitions>
<connection-definition class-name="com.ibm.mq.connector.outbound.ManagedConnectionFactoryImpl" jndi-name="java:jboss/WMQ_ConnectionFacotry" enabled="true" pool-name="WMQ_ConnectionFactory">
<config-property name="port">
1414
</config-property>
<config-property name="hostName">
localhost
</config-property>
<config-property name="channel">
EXAMPLE.CHANNEL
</config-property>
<config-property name="failIfQuiesce">
true
</config-property>
<config-property name="transportType">
BINDINGS_THEN_CLIENT
</config-property>
<config-property name="queueManager">
EXAMPLE.QM
</config-property>
<security>
<application/>
</security>
<validation>
<background-validation>false</background-validation>
</validation>
</connection-definition>
</connection-definitions>
<admin-objects>
<admin-object class-name="com.ibm.mq.connector.outbound.MQQueueProxy" jndi-name="java:jboss/EXAMPLE_REQ_Queue" enabled="true" use-java-context="false" pool-name="EXAMPLE_REQ_Queue">
<config-property name="useJNDI">
true
</config-property>
<config-property name="startTimeout">
10000
</config-property>
<config-property name="destination">
EXAMPLE.TEST.REQUEST
</config-property>
<config-property name="readAheadClosePolicy">
ALL
</config-property>
</admin-object>
<admin-object class-name="com.ibm.mq.connector.outbound.MQQueueProxy" jndi-name="java:jboss/EXAMPLE_REP_Queue" enabled="true" use-java-context="false" pool-name="EXAMPLE_REP_Queue">
<config-property name="failIfQuiesce">
true
</config-property>
<config-property name="baseQueueManagerName">
EXAMPLE.QM
</config-property>
<config-property name="persistence">
HIGH
</config-property>
<config-property name="encoding">
NNN
</config-property>
<config-property name="baseQueueName">
EXAMPLE.TEST.REPLY
</config-property>
<config-property name="targetClient">
MQ
</config-property>
<config-property name="expiry">
300000
</config-property>
</admin-object>
</admin-objects>
</resource-adapter>
</resource-adapters>
</subsystem>
问题: 我得到以下异常:
15:54:53,325 ERROR [org.jboss.msc.service.fail](ResourceAdapterDeploymentService Thread Pool - 1)MSC000001:无法启动服务jboss.ra.deployment。&#34; wmq.jmsra.rar&# 34;:服务jboss.ra.deployment中的org.jboss.msc.service.StartException。&#34; wmq.jmsra.rar&#34;:JBAS010446:无法启动RA部署[wmq.jmsra] 在org.jboss.as.connector.services.resourceadapters.deployment.AbstractResourceAdapterDeploymentService $ 1.run(AbstractResourceAdapterDeploymentService.java:279)[jboss-as-connector-7.3.0.Final-redhat-14.jar:7.3.0.Final -redhat-14] 在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)[rt.jar:1.7.0_21] at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:615)[rt.jar:1.7.0_21] 在java.lang.Thread.run(Thread.java:722)[rt.jar:1.7.0_21] 在org.jboss.threads.JBossThread.run(JBossThread.java:122)[jboss-threads-2.1.1.Final-redhat-1.jar:2.1.1.Final-redhat-1] 引起:org.jboss.jca.deployers.common.DeployException:IJ020060:无法注入:com.ibm.mq.connector.outbound.MQQueueProxy属性:目标值:EXAMPLE.TEST.REQUEST 在org.jboss.jca.deployers.common.AbstractResourceAdapterDeployer.initAdminObject(AbstractResourceAdapterDeployer.java:907)[ironjacamar-deployers-common-1.0.23.Final-redhat-1.jar:1.0.23.Final-redhat-1] 在org.jboss.jca.deployers.common.AbstractResourceAdapterDeployer.createObjectsAndInjectValue(AbstractResourceAdapterDeployer.java:2382)[ironjacamar-deployers-common-1.0.23.Final-redhat-1.jar:1.0.23.Final-redhat-1] 在org.jboss.as.connector.services.resourceadapters.deployment.ResourceAdapterXmlDeploymentService $ AS7RaXmlDeployer.doDeploy(ResourceAdapterXmlDeploymentService.java:185)[jboss-as-connector-7.3.0.Final-redhat-14.jar:7.3.0。最终的redhat-14] 在org.jboss.as.connector.services.resourceadapters.deployment.ResourceAdapterXmlDeploymentService.start(ResourceAdapterXmlDeploymentService.java:106)[jboss-as-connector-7.3.0.Final-redhat-14.jar:7.3.0.Final-在redhat-14] at org.jboss.msc.service.ServiceControllerImpl $ StartTask.startService(ServiceControllerImpl.java:1811)[jboss-msc-1.0.4.GA-redhat-1.jar:1.0.4.GA-redhat-1] at org.jboss.msc.service.ServiceControllerImpl $ StartTask.run(ServiceControllerImpl.java:1746)[jboss-msc-1.0.4.GA-redhat-1.jar:1.0.4.GA-redhat-1] 在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)[rt.jar:1.7.0_21] at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:615)[rt.jar:1.7.0_21] 在java.lang.Thread.run(Thread.java:722)[rt.jar:1.7.0_21] 15:54:53,343 INFO [org.jboss.as.server](控制器启动线程)JBAS018559:已部署&#34; wmq.jmsra.rar&#34; (runtime-name:&#34; wmq.jmsra.rar&#34;) 15:54:53,344 INFO [org.jboss.as.controller](控制器启动线程)JBAS014774:服务状态报告 JBAS014777:无法启动的服务:服务jboss.ra.deployment。&#34; wmq.jmsra.rar&#34;:org.jboss.msc.service.StartException in service jboss.ra.deployment。&#34; wmq .jmsra.rar&#34;:JBAS010446:无法启动RA部署[wmq.jmsra]
我猜主要部分是引起:org.jboss.jca.deployers.common.DeployException:IJ020060:无法注入:com.ibm.mq.connector.outbound.MQQueueProxy属性:destination value:EXAMPLE .TEST.REQUEST 在此之前,我遇到了同样的错误,而是说了destinationType值:javax.jms.Queue。然后我继续删除该属性并再次尝试,现在我收到了这个错误。我不确定接下来该做什么。
我一直关注的教程: IBM - The WebSphere MQ resource adapter,Redhat Jboss文档 - JCA架构章节和Oracle - 消息驱动Bean Java EE6教程
我的代表只允许我发布2个链接,因此最后两个教程没有链接。 非常感谢任何帮助。
答案 0 :(得分:1)
我将MQ RAR部署到JBoss时遇到了稍微不同的问题,但是here概述的解决方案和过程应该对您有用。要查看的具体文件是here。这些文件是iron-jacamar(作为JCA提供者的jboss)描述符。
答案 1 :(得分:0)
我最终最终删除了导致弹出异常的所有属性。我试图设置的属性是用于入站通信,事实证明这不是设置它们的合适位置。相反,这些应该在消息驱动器Bean(MDB)的部署描述符中设置。该文件名为ejb-jar.xml。内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd"
version="3.0"
>
<enterprise-beans>
<message-driven>
<ejb-name>MyMDB</ejb-name>
<ejb-class>com.foo.MyMDB</ejb-class>
<messaging-type>javax.jms.MessageListener</messaging-type>
<transaction-type>Container</transaction-type>
<activation-config>
<activation-config-property>
<activation-config-property-name>
destinationType
</activation-config-property-name>
<activation-config-property-value>
javax.jms.Queue
</activation-config-property-value>
</activation-config-property>
<activation-config-property>
<activation-config-property-name>
destination
</activation-config-property-name>
<activation-config-property-value>
EXAMPLE.TEST.REQUEST
</activation-config-property-value>
</activation-config-property>
<!--SET OTHER PROPERTIES-->
</activation-config>
</message-driven>
</enterprise-beans>
</ejb-jar>
希望这有帮助。