当前位置: 首页 > 面试题库 >

如何将消息发送到IBM MQ集群中不同队列管理器和主机名中托管的不同队列

钦海荣
2023-03-14
问题内容

我基于Apache骆驼的应用正在消耗来自IBM队列之一的消息,例如下面是连接工厂的详细信息

hostname=host1000
QManager=QM1000
Port="some port"
Channel="common channel"

消耗和处理并将响应发送到来自消息头的ReplyQueue的骆驼流。

 from(wmq:queue:<INPUT_QUEUE>)
.bean("processBean")
.bean("beanToSendMsgToReplyQueue")

在骆驼标头中,我在JMSReplyQueue下面。您可以看到它是不同的队列管理器,并且该队列管理器来自不同的主机,但是在集群环境中。

JMSReplyTo = queue://QM1012/TEST.REPLY?targetClient=1

队列管理器也在两者之间。喜欢

queue://<queue-manager>//<queue-name>?<other parameters>

以下是我在发送消息时遇到的异常。

ERROR o.apache.camel.processor.DefaultErrorHandler:215 - Failed delivery for (MessageId: ID-xxxxxxxxx-0-4 on ExchangeId: ID-xxxxxx-42443-1492594420697-0-1). Exhausted after delivery attempt: 1 caught: org.apache.camel.ResolveEndpointFailedException: Failed to resolve endpoint: wmq://queue://QM1012/TEST.REPLY?targetClient=1 due to: Failed to resolve endpoint: wmq://queue://TAP2001R5/TEST?targetClient=1 due to: There are 1 parameters that couldn't be set on the endpoint. Check the uri if the parameters are spelt correctly and that they are properties of the endpoint. Unknown parameters=[{targetClient=1}]. Processed by failure processor: FatalFallbackErrorHandler[Pipeline[[Channel[sendTo(Endpoint[wmq://queue:BACKOUT_Q])], Channel[DelegateSync[com.xxx.yyy.listener.XXXOnExceptionProcessor@21c66ee4]], Channel[Stop]]]]

任何人都可以帮助我将消息发送到不同主机中的不同队列管理器队列,但它们都在同一群集中。另外,队列管理器名称位于字符串的中间,因此如何解决该问题。如果您需要更多详细信息,请告诉我。

更新-1: 尝试使用相同的队列管理器且没有参数

JMSReplyTo = queue://QM1000/QUEUE_V1 低于异常我正在

org.springframework.jms.InvalidDestinationException: JMSWMQ2008: Failed to open MQ queue 'QM1000/QUEUE_V1'.; nested exception is com.ibm.msg.client.jms.DetailedInvalidDestinationException: JMSWMQ2008: Failed to open MQ queue 'QM1000/QUEUE_V1'. JMS attempted to perform an MQOPEN, but WebSphere MQ reported an error. Use the linked exception to determine the cause of this error. Check that the specified queue and queue manager are defined correctly.; nested exception is com.ibm.mq.MQException: JMSCMQ0001: WebSphere MQ call failed with compcode '2' ('MQCC_FAILED') reason '2189' ('MQRC_CLUSTER_RESOLUTION_ERROR').

更新2

我可以使用普通的javax.jms。和com.ibm.mq.jms。
api将消息发送到JMSReplyTo,但不能通过Apache骆驼发送。Camel用户/开发人员小组的任何人都可以帮助我使用骆驼组件来处理相同的事情。

@Override
public void process(Exchange exchange)
    throws Exception {

    QueueConnection m_connection = this.connectionFactory.createQueueConnection();
    //m_connection.start();
    boolean transacted = false;

    QueueSession session = m_connection.createQueueSession(transacted, QueueSession.AUTO_ACKNOWLEDGE);
    TextMessage outMessage = session.createTextMessage();
    outMessage.setText(exchange.getIn().getBody());
    MQQueue mq = new MQQueue(
        "queue://QM1012/TEST.REPLY");
    QueueSender queueSender = session.createSender((MQQueue) mq);
    queueSender.send(outMessage);

    /* producerTemplate.send("wmq:" + "queue://QM1012/TEST.REPLY", exchange); */
}

问题答案:

首先,感谢大家的支持。我的用例如下(上面也有)。

使用Apache Camel连接到MQ主机(主机名,queueManager,端口,通道),并使用属于同一主机/
Qmanager的队列中的消息。消息带有ReplyToQueue(JMSReplyTo)标头值。ReplyToQueue(JMSReplyTo)的值如下

例如

queue://Different_QueueManager_in_Cluster/TEST.REPLY?mdReadEnabled=true&messageBody=0&mdWriteEnabled=true&XMSC_WMQ_REPLYTO_STYLE=1&targetClient=1

现在的问题是,当连接对象连接到上述主机和队列管理器时,如何使用不同的队列管理器将回复消息发送到不同的队列。

注意:所有MQ队列管理器都在集群环境中。

解决方案1: 例如

form(wmq:queue:INPUT_MSG_Q)
 .bean(requestProcessor)
 .bean(responseProcessor)

默认情况下,Apache
Camel处理ReplyToQ(JMSReplyTo)。如果您不想发送对ReplyToQ(JMSReplyTo)的回复,请disableReplyTo=true在消费时使用

注意:在queue://Different_QueueManager_in_Cluster/TEST.REPLY使用相同的连接/连接工厂发送到时,MQ集群将检查消息是否必须通过集群中的指定队列发送到指定的队列管理器。关于以下html" target="_blank">参数
?mdReadEnabled=true&messageBody=0&mdWriteEnabled=true&XMSC_WMQ_REPLYTO_STYLE=1&targetClient=1,Apache
Camel能够在自动回复时自动解析,而无需使用任何第三方解析器JMSReplyTo

解决方案2:

使用禁用自动回复disableReplyTo=true并从标头中获取队列详细信息,并使用纯javax.jms。和com.ibm.mq.jms。
api发送消息。代码如下。

@Override
public void process(Exchange exchange)
    throws Exception {

    QueueConnection m_connection = this.connectionFactory.createQueueConnection();
    //m_connection.start();
    boolean transacted = false;

    QueueSession session = m_connection.createQueueSession(transacted, QueueSession.AUTO_ACKNOWLEDGE);
    TextMessage outMessage = session.createTextMessage();
    outMessage.setText(exchange.getIn().getBody());
    MQQueue mq = new MQQueue(
        "queue://Different_QueueManager_in_Cluster/TEST.REPLY");
    QueueSender queueSender = session.createSender((MQQueue) mq);
    queueSender.send(outMessage);

    /* producerTemplate.send("wmq:" + "queue://Different_QueueManager_in_Cluster/TEST.REPLY", exchange); */
}

对于参数,请使用@Sebastian Brandt提到的目标解析器(发布)



 类似资料:
  • 问题内容: 我基于Apache骆驼的应用正在消耗来自IBM队列之一的消息,例如下面是连接工厂的详细信息 消耗和处理并将响应发送到来自消息头的ReplyQueue的骆驼流。 在骆驼标头中,我在JMSReplyQueue下面。您可以看到它是不同的队列管理器,并且该队列管理器来自不同的主机,但是在集群环境中。 队列管理器也在两者之间。喜欢 以下是我在发送消息时遇到的异常。 任何人都可以帮助我将消息发送到

  • 我设置了一个EJB项目,使用JMS将持久性实体对象发送到MDB。我使用JBoss EAP 7,使用Apache ActiveMQ作为消息传递提供程序。我像这样设置ConnectionFactory和队列: 这是我的消息生成器,它接收“Account”实体对象作为参数并将其发送到队列: EntityEnqueueBean。Java语言 MDB从队列接收消息并对其进行处理: java账户 不确定我做错

  • 从跟踪中,我可以看到生产者在连接名称列表中有我的两个活动/备用主机,但也有“localhost”作为host_name和1414作为端口,这是我不能连接到它的原因吗?

  • Artemis 2.2.0的新版本有一个,它显然是在内部消息ID(而不是JMS消息ID)上操作的。 问题是:如何在Artemis Version2.x中使用JMS消息ID将消息从一个队列移动到另一个队列?

  • 我发送消息从JavaSpring Boot应用程序到消费者是Python应用程序。 除了输入命令rabbitmqctl list\u queues时,一切正常,它显示视频队列0,这意味着队列中没有消息。 消费者正在接收消息并执行一些长过程;所以如果我连续发送多条消息,应该会有一些消息在队列中等待。我说得对吗? 制片人: 消费者 在哪里可以看到我声明的队列上的消息?因为虽然我知道队列中有消息,但使用

  • 我正在编写一个Python应用程序,它从帐户a提取数据并发送到帐户B中的SQS队列。执行lambda函数时,它返回以下错误: "errorMessage":"调用SendMessage操作时发生错误(AccessDended):拒绝访问资源https://eu-central-1.queue.amazonaws.com/。", 如果我在同一个帐户中使用SQS队列,它就会工作。 我使用的是无服务器框