【问题标题】:Message without handler issue for Apache Qpid in Spring BootSpring Boot 中 Apache Qpid 的消息没有处理程序问题
【发布时间】:2016-06-08 07:26:43
【问题描述】:

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

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

这是我的代码:

JmsConfiguration.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;
    }
}

application.properties

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

ScheduledTask.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");
    }
}

【问题讨论】:

    标签: java spring spring-boot qpid


    【解决方案1】:

    您创建了一个实现MessageListener 的实例,但您不使用它做任何事情。

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

    【讨论】:

    • 我现在就试试。但是我在想,因为我已经实现了一种在特定延迟后检查消息的方法,所以我不需要侦听器。我错了吗?
    猜你喜欢
    • 1970-01-01
    • 2021-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-19
    相关资源
    最近更新 更多