我正在使用Oracle Service Bus(OSB)作为MOM,并且目标URI是IBM MQ队列。我只想知道哪种传输方式更好。OSB为此提供了两个适配器,JMS适配器和MQ适配器。有人知道它们的优缺点吗?TIA
我正在使用Oracle Service Bus(OSB)作为MOM,并且目标URI是IBM MQ队列。我只想知道哪种传输方式更好。OSB为此提供了两个适配器,JMS适配器和MQ适配器。有人知道它们的优缺点吗?TIA
我想补充一下我发现对我有用的方法。当您创建队列实例时,必须执行以下操作。
Queue queue = queueSession.createQueue("queue:///" + queueName + "?targetClient=1");
//Send w/o MQRFH2 header (i.e. receiver is not a JMS client but just MQ)
性能不是将无JMS头信息的普通消息(MQ格式)从JMS客户端发送到MQ服务器的唯一原因。也可能是消息消费者是非JMS客户端,如Tivoli Workload Scheduler(TWS)和 .net。
我提供了一个解决方案,适用于Java独立客户端和JBoss,它们会从JMS消息中删除MQRFH2格式并将其转换为普通消息:
独立JMS客户端
import com.ibm.msg.client.wmq.WMQConstants;
import com.ibm.mq.jms.MQQueue;
Hashtable<String, String> env = new Hashtable<String, String>();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, "ldap://...);
InitialContext context = new InitialContext(env);
ConnectionFactory connectionFactory = (ConnectionFactory) context.lookup(JNDI_QUEUE_CONNECTION_FACTORY);
//the following to extra lines make sure that you send 'MQ' messages
MQQueue mqQueue = (MQQueue) iniCtx.lookup(queueJNDI);
mqQueue.setTargetClient(WMQConstants.WMQ_CLIENT_NONJMS_MQ);
Destination destination = (Destination) mqQueue;
...proceed as usual...
应用服务器 JBoss 7 资源适配器
。<subsystem xmlns="urn:jboss:domain:resource-adapters:1.0">
<resource-adapters>
<resource-adapter>
<archive>wmq.jmsra.rar</archive>
<transaction-support>NoTransaction</transaction-support>
<connection-definitions>
<connection-definition class-name="com.ibm.mq.connector.outbound.ManagedConnectionFactoryImpl" jndi-name="java:jboss/jms/MqConnectionFactory" pool-name="MqConnectionFactoryPool">
<config-property name="connectionNameList">${mqserver}</config-property>
<config-property name="channel">${mqchannel}</config-property>
</connection-definition>
</connection-definitions>
<admin-objects>
<admin-object class-name="com.ibm.mq.connector.outbound.MQQueueProxy" jndi-name="java:jboss/jms/MyQueue" pool-name="MyQueuePool">
<config-property name="baseQueueName">${queuename}</config-property>
<config-property name="targetClient">MQ</config-property>
</admin-object>
</admin-objects>
这取决于MQ队列另一端的程序是否期望接收JMS或“本地”MQ消息。
MQ可以作为本地队列机制或JMS消息的传输方式。区别在于,JMS消息在消息缓冲区的开头具有一些标准头字段,而“本地”MQ消息仅包含您的程序发送到缓冲区的数据。
对于其他可能在这里寻找答案的人,我想提供一些更新的信息(截至2017年):
更多信息请参见API选择。
自v8以来的一般声明是,新应用程序应使用IBM MQ类进行JMS。当然,这并不否定selotape提到的所有优缺点。您仍然需要进行一些配置,并且开箱即用的性能可能较差。实际上,v8有一个MP0E文档声称他们已经比较了Java JMS MQ应用程序和C++ MQI应用程序,前者在不同场景下慢了高达35%(所以如果您得到50与900,那么您做错了什么)。
从丰富的个人经验出发,我强烈推荐如有可能使用本地 MQ。
JMS 传输缺点(使用 WMQ 时)-
JMS 传输唯一的优点是支持 XA 事务。在 OSB 11.1.1.7 中已经解决了这个问题,现在两种传输方式都支持 XA。
本地 MQ 优点 -
再次强烈建议尽可能使用 本地 MQ 传输在 OSB 中。