【问题标题】:JMS message listener invoker cannot be cast to org.apache.qpid.client.AMQDestinationJMS 消息侦听器调用程序无法强制转换为 org.apache.qpid.client.AMQDestination
【发布时间】:2021-02-05 10:50:00
【问题描述】:

我有一个如下配置文件,

@Slf4j
@Configuration
@EnableJms
public class MyQpidConfig {
    @Bean("myQpidConn")
    public AMQConnectionFactory amqConnectionFactory() throws URLSyntaxException {
        AMQConnectionFactory amqConnectionFactory = new AMQConnectionFactory("URL");
        return amqConnectionFactory;
    }

    @Bean("myJmsContainer")
    public DefaultMessageListenerContainer defaultMessageListenerContainer(@Qualifier("myQpidAdaptor") MessageListenerAdapter messageListenerAdapter ,@Qualifier("myQpidConn")AMQConnectionFactory connectionFactory) {
        DefaultMessageListenerContainer messageListenerContainer = new DefaultMessageListenerContainer();
        messageListenerContainer.setConnectionFactory(connectionFactory);
         messageListenerContainer.setDestinationName(destinationName);
        messageListenerContainer.setMessageListener(messageListenerAdapter);
        messageListenerContainer.setPubSubDomain(false);
        messageListenerContainer.setSessionTransacted(true);
        messageListenerContainer.setDurableSubscriptionName("MYSUBSCRIBER");
        messageListenerContainer.setSubscriptionDurable(true);
        messageListenerContainer.setAutoStartup(true);
        messageListenerContainer.setDestination((Queue) () -> "MYQUEUE");
        return messageListenerContainer;
    }

    @Bean("myQpidAdaptor")
    public MessageListenerAdapter messageListenerAdapter() {
        Preconditions.checkNotNull(qpidMessageListner, "Consumer listener not set");
        MessageListenerAdapter messageListenerAdapter = new MessageListenerAdapter(new MyQpidMessageListner());
        messageListenerAdapter.setDefaultListenerMethod("onMessage");
        messageListenerAdapter.setDefaultResponseQueueName("MYQUEUE");
        return messageListenerAdapter;
    }
   
}

destinationName 等于

  ADDR:MYSUBSCRIBER:MYQUEUE; {"create":"receiver",
    "node":{"durable":true,"x-declare":
    {"exclusive":true,"auto-delete":false,
    "x-bindings":[{"exchange":"amq.topic","key":"MYQUEUE"}]}}}

我的 Listener 类如下,

@Slf4j
@Component
public class MyQpidMessageListner implements  MessageListener{
    @Override
    public void onMessage(Message jmsBytesMessage) {
       log.info("Control Inside");
       //to do
    }
}

作为异步消费者,当我当时运行我的应用程序时遇到与目的地相关的异常,

DefaultMessageListenerContainer - 
Setup of JMS message listener invoker failed for destination 'com.my.MyQpidConfig$$Lambda$637/429515253@3aa1975' - trying to recover. Cause: com.my.MyQpidConfig$$Lambda$637/429515253 cannot be cast to org.apache.qpid.client.AMQDestination  

如果它与 AMQDestination 相关,那么我如何在 java 代码中创建 AMQDestination。 我没有为这个 QPID 问题获得任何资源。 任何建议的帮助都必须感谢。

【问题讨论】:

    标签: java spring-boot jms qpid


    【解决方案1】:

    由于某种原因,您将 lambda 传递给 org.springframework.jms.listener.DefaultMessageListenerContainer.setDestination(Destination),即:

    messageListenerContainer.setDestination((Queue) () -> "MYQUEUE");
    

    此方法需要 javax.jms.Destination 实现(例如 org.apache.qpid.client.AMQDestination),而不是 lambda。

    您已经在设置目的地名称,即:

    messageListenerContainer.setDestinationName(destinationName);
    

    所以不清楚您为什么还要尝试设置目的地。这是配置同一事物的两种方式。

    我建议您只需删除尝试设置目的地的代码并保留设置目的地名称的代码。

    【讨论】:

    • 在destinationName变量中我有这个值ADDR:MYSUBSCRIBER:MYQUEUE; {"create":"receiver", "node":{"durable":true,"x-declare": {"exclusive":true,"auto-delete":false, "x-bindings":[{" exchange":"amq.topic","key":"MYQUEUE"}]}}} 并且当我删除行 setDestination 时得到异常原因:org.apache.qpid.QpidException: The name '地址中提供的 MYSUBSCRIBER:MYQUEUE' 无法解析为交换或队列
    • 你从哪里得到目的地名称的语法?
    • 实际上我必须配置持久性、订阅者、自动删除等,所以我形成了该字符串并将其传递给目标名称,看来我以某种错误的方式进行操作。请问纠正我如何设置destinationName中的属性
    • 所以你只是编造了那个语法还是从实际文档中得到的?
    • 不,它不是来自我从其他地方得到的文档,根据我制作这个主题的文档://amq.topic//MYQUEUE?durable='true'&autodelete='false'&exclusive= 'false' 并将其设置在 setDestinationName() 中,但将异常设置为 DefaultMessageListenerContainer - 目标 'topic://amq.topic//MYQUEUE?durable='true'&autodelete='false'&exclusive=' 的 JMS 消息侦听器调用程序的设置失败false'' - 试图恢复。原因:无法识别的字符 line:1,38:topic://amq.topic//MYQUEUE?durable='true'&autodelete='false'&exclusive='false'
    猜你喜欢
    • 2021-08-02
    • 1970-01-01
    • 2011-01-20
    • 1970-01-01
    • 1970-01-01
    • 2012-08-04
    • 1970-01-01
    • 1970-01-01
    • 2011-10-09
    相关资源
    最近更新 更多