当前位置: 首页 > 知识库问答 >
问题:

Spring Boot中Apache Qpid没有处理程序问题的消息

刘意
2023-03-14

我试图通过使用Jms Qpid客户端的Spring Boot应用程序使用Apache Qpid。我可以对其进行配置,但当我尝试从队列接收消息时,记录器正在打印:

Dispatcher(918480905)Received a message(878303980)[1] from queue 1 )without a handler - rejecting(requeue)...

这是我的代码:

JMS配置。Java语言

@Configuration
public class JmsConfiguration {

    @Primary
    @Bean
    public Context createContext()
    {
        Properties properties=new Properties();
        System.setProperty("IMMEDIATE_PREFETCH", "true");

        Context context=null;
        try {
            properties.load(this.getClass().getResourceAsStream("application.properties"));
            context = new InitialContext(properties);
        } catch (NamingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return context;
    }

    @Primary
    @Bean
    public ConnectionFactory createConnectionFactory(Context context)
    {
        ConnectionFactory connectionFactory=null;
        try {
            connectionFactory = (ConnectionFactory) context.lookup("qpidConnectionFactory");
        } catch (NamingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return connectionFactory;
    }

    @Primary
    @Bean
    public Connection jmsConnection(ConnectionFactory connectionFactory) throws Exception
    {
        Connection connection = connectionFactory.createConnection();
        connection.start();
        return connection;
    }

    @Primary
    @Bean
    public Queue jmsQueue(Context context) throws Exception
    {
        Queue queue = (Queue) context.lookup("myqueue");
        return queue;
    }
}

应用属性

java.naming.factory.initial = org.apache.qpid.jndi.PropertiesFileInitialContextFactory
connectionfactory.qpidConnectionFactory = amqp://guest:guest@clientid/?brokerlist='tcp://localhost:5672?maxprefetch='0''
queue.myqueue = queue1

schduledTask.java它只是按间隔运行发送和接收消息。

@Component
public class ScheduledTasks
{
    Connection connection;
    Queue queue;

    @Autowired
    public ScheduledTasks(Connection connection, Queue queue) {
        this.connection=connection;
        this.queue=queue;
    }

    MessageListener messageListener = new MessageListener() {
        @Override
        public void onMessage(Message message) {
            System.out.println("Received id is------>");
            System.out.println(message);
        }
    };

    @Scheduled(fixedDelay = 2000)
    public void sendMessage() throws Exception
    {
        Session session = connection.createSession(true, Session.SESSION_TRANSACTED);
        Message message=session.createTextMessage();
        MessageProducer messageProducer=session.createProducer(queue);
        message.setStringProperty("value", "BOOM");
        messageProducer.send(message);
        session.commit();
        messageProducer.close();
        //connection.close();
        System.out.println("---------------Message Sent");
    }

    //@JmsListener(destination="queue1")
    @Scheduled(initialDelay=5000, fixedDelay = 5000)
    public void receiveMessage() throws Exception
    {
        Session session = connection.createSession(true, Session.SESSION_TRANSACTED);
        MessageConsumer messageConsumer = session.createConsumer(queue);
//        if(messageConsumer.getMessageListener()==null)
//          messageConsumer.setMessageListener(messageListener);
        Message message = messageConsumer.receive(3000);
        if(message!=null)
            System.out.println("----------------->"+message.getStringProperty("value"));
        session.commit();
        messageConsumer.close();
        //connection.close();
        System.out.println("--------------->Got Message");
    }
}

共有1个答案

斜俊
2023-03-14

您创建了一个实现MessageListener的实例,但没有对其执行任何操作。

在Spring中,您应该使用Spring jms中的DefaultMessageListenerContainer或SimpleMessageListenerContainer,并在JmsConfiguration类中将其创建为Spring Bean。在设置连接详细信息(ConnectionFactory、Queue、sessionTransacted等)之后,还需要设置JMS消息侦听器实现类。

 类似资料:
  • 版本 维特。x核心:3.5.0 vert. x redis客户端:3.5.0 上下文 2018-06-02 17:40:55.981错误4933---[ntlop-thread-2]io.vertx.redis.impl.重新连接:没有处理程序等待消息:14751915 2018-06-02 17:41:10.937错误4933---[ntloop-thread-2]io。维特斯。雷迪斯。impl

  • 我正在构建一个应用程序,其中微服务通过RabbitMQ(请求-响应模式)进行通信 一切正常,但我仍然有一个错误“远程服务中没有定义匹配的消息处理程序。”- 当我向客户端应用程序发送帖子时,它只需通过客户端(ClientProxy)发送包含数据的消息,消费者应用程序就会响应。此功能实际上可以工作,但始终只能第二次使用。我知道这听起来很奇怪,但在我的第一个POST请求中,总是有来自客户的错误,我的每一

  • 亲爱的史塔克弗劳尔, Swift/UIKit上的任何专家都可以在下面的屏幕截图中看到我做错了什么吗? Xcode似乎找不到基于标题、样式和处理程序的UIAlertAction的方便初始值设定项,我也不知道有任何其他方式来初始化UIAlertAction。实际上,处理器不会为零。 先谢谢你了, 杰米

  • 问题内容: 我有一个注册了处理程序的库(通过),该处理程序在调用时不支持多个线程。就我而言,我不需要分叉的环境中使用,因为我要的是调用右后。所以,我想要但没有任何处理程序。那可能吗?我会错过任何重要的案例吗? 有关背景信息,该库为OpenBlas,此处和此处均描述了该问题。 问题答案: 您可以使用(NPTL实现不调用fork处理程序)。尽管POSIX已从标准中删除,但您的实现中可能会使用它。 当使

  • 我正在使用netty构建一个应用程序。在应用程序中,我需要处理传入和传出的消息。要求是应用程序将发送的任何消息都应由特定的处理程序处理,进入应用程序的任何消息都应由另一个特定的处理程序处理。但是,我希望在两个处理程序之间交换消息,以便能够跟踪发送的消息响应,因为请求消息也将发送到应用程序。 请任何想法hwo实施这样的要求。这个问题听起来可能不相关,但这就是我得到的,我还不是一个网络极客。我读到的关

  • 我怎么才能修好这个?