Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Spring AMQP从队列中自动删除消息_Java_Spring_Rabbitmq_Spring Amqp - Fatal编程技术网

Java 使用Spring AMQP从队列中自动删除消息

Java 使用Spring AMQP从队列中自动删除消息,java,spring,rabbitmq,spring-amqp,Java,Spring,Rabbitmq,Spring Amqp,我有两个应用程序使用RabbitMQ交换数据。我已经使用Spring AMQP实现了这一点。我有这样一个场景:一旦消费者消费了消息,在处理过程中可能会遇到异常 如果出现任何异常,我计划登录数据库。一旦消息到达使用者,无论是成功处理还是遇到错误,我都必须从队列中显式删除消息 如何强制从队列中删除消息,否则将 如果我的应用程序无法处理它,会出现什么问题 下面是我的侦听器代码 @RabbitListener(containerFactory="rabbitListenerContainerFacto

我有两个应用程序使用RabbitMQ交换数据。我已经使用Spring AMQP实现了这一点。我有这样一个场景:一旦消费者消费了消息,在处理过程中可能会遇到异常

如果出现任何异常,我计划登录数据库。一旦消息到达使用者,无论是成功处理还是遇到错误,我都必须从队列中显式删除消息

如何强制从队列中删除消息,否则将 如果我的应用程序无法处理它,会出现什么问题

下面是我的侦听器代码

 @RabbitListener(containerFactory="rabbitListenerContainerFactory",queues=Constants.JOB_QUEUE)
            public void handleMessage(JobListenerDTO jobListenerDTO) {
                //System.out.println("Received summary: " + jobListenerDTO.getProcessXML());
                //amqpAdmin.purgeQueue(Constants.JOB_QUEUE, true);
                try{
                    Map<String, Object> variables = new HashMap<String, Object>();  
                    variables.put("initiator", "cmy5kor");

                    Deployment deploy = repositoryService.createDeployment().addString(jobListenerDTO.getProcessId()+".bpmn20.xml",jobListenerDTO.getProcessXML()).deploy();
                    ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(jobListenerDTO.getProcessId(), variables);

                    System.out.println("Process Instance is:::::::::::::"+processInstance);

                }catch(Exception e){

                    e.printStackTrace();
            }
@RabbitListener(containerFactory=“rabbitListenerContainerFactory”,队列=常量。作业\u队列)
公共无效handleMessage(JobListenerDTO JobListenerDTO){
//System.out.println(“收到的摘要:+jobListenerDTO.getProcessXML());
//amqpAdmin.purgeQueue(Constants.JOB_QUEUE,true);
试一试{
Map variables=newhashmap();
变量。put(“发起人”、“cmy5kor”);
Deployment deploy=repositoryService.createDeployment().addString(jobListenerDTO.getProcessId()+“.bpmn20.xml”,jobListenerDTO.getProcessXML()).deploy();
ProcessInstance ProcessInstance=runtimeService.startProcessInstanceByKey(jobListenerDTO.getProcessId(),变量);
System.out.println(“流程实例为::::::”+processInstance);
}捕获(例外e){
e、 printStackTrace();
}
配置代码

@Configuration
@EnableRabbit
public class RabbitMQJobConfiguration extends AbstractBipRabbitConfiguration {


    @Bean
    public RabbitTemplate rabbitTemplate() {
        RabbitTemplate template = new RabbitTemplate(connectionFactory());
        template.setQueue(Constants.JOB_QUEUE);
        template.setMessageConverter(jsonMessageConverter());
        return template;
    }


    @Bean
    public Queue jobQueue() {
        return new Queue(Constants.JOB_QUEUE);
    }


    @Bean(name="rabbitListenerContainerFactory")
    public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory() {
        SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
        factory.setConnectionFactory(connectionFactory());
        Jackson2JsonMessageConverter messageConverter = new Jackson2JsonMessageConverter();
        DefaultClassMapper classMapper = new DefaultClassMapper();
        Map<String, Class<?>> idClassMapping = new HashMap<String, Class<?>>();
        idClassMapping.put("com.bosch.diff.approach.TaskMessage", JobListenerDTO.class);
        classMapper.setIdClassMapping(idClassMapping);
        messageConverter.setClassMapper(classMapper);
        factory.setMessageConverter(messageConverter);
        factory.setReceiveTimeout(10L);
        return factory;
    }



}
@配置
@使能兔
公共类RabbitMQJobConfiguration扩展了AbstractBibbitConfiguration{
@豆子
公共的rabbitmplate rabbitmplate(){
RabbitTemplate=新的RabbitTemplate(connectionFactory());
template.setQueue(Constants.JOB_QUEUE);
setMessageConverter(jsonMessageConverter());
返回模板;
}
@豆子
公用队列作业队列(){
返回新队列(常量.作业队列);
}
@Bean(name=“rabbitListenerContainerFactory”)
公共SimpleRableBitListenerContainerFactory rabbitListenerContainerFactory(){
SimpleRableBitListenerContainerFactory=新SimpleRableBitListenerContainerFactory();
setConnectionFactory(connectionFactory());
Jackson2JsonMessageConverter messageConverter=新Jackson2JsonMessageConverter();
DefaultClassMapper classMapper=新的DefaultClassMapper();
地图>();
idClassMapping.put(“com.bosch.diff.approach.TaskMessage”,JobListenerDTO.class);
setIdClassMapping(idClassMapping);
messageConverter.setClassMapper(classMapper);
factory.setMessageConverter(messageConverter);
出厂设置接收超时(10L);
返回工厂;
}
}

只要侦听器捕捉到异常,消息就会从队列中删除


如果您的侦听器引发异常,则默认情况下会重新查询该异常;可以通过引发
AmqpRejectAndDontRequeueException
或设置
defaultRequeueRejected
属性来修改该行为-请参阅。

只要您的侦听器捕捉到异常,消息将从队列中删除


如果你的监听器抛出异常,默认情况下它将被重新调用;可以通过抛出
AmqpRejectAndDontRequeueException
或设置
defaultRequeueRejected
属性来修改该行为-请参阅。

我不知道spring api或rmq的配置,但是

一旦消息到达使用者,无论是成功处理还是遇到错误,我都必须从队列中显式删除消息


这正是您设置自动确认标志时所发生的情况。这样,消息一经使用就会被确认-因此从队列中消失了。

我不知道spring api或rmq的配置,但是

一旦消息到达使用者,无论是成功处理还是遇到错误,我都必须从队列中显式删除消息


这正是您设置自动确认标志时所发生的情况。这样,消息一经消费就被确认-因此从队列中消失了。

谢谢Gary。我们在github中有一些示例,以便我可以阅读和实现吗?请参见。@GaryRussell,据我所知,rabbitmq在获得确认后会从队列中删除消息,是吗?所以当spring boot发送ACK时?在任意情况下(除了
AmqpRejectAndDontRequeueException
)侦听器未捕获异常?可以,但在我自己的转换器未捕获异常(例如解析器异常)的情况下会发生什么?查看我的答案。您好,您能更新链接吗。它说无效。谢谢Gary。我们在github中有一些示例,以便我可以阅读和实现吗?请参阅。@GaryRussell,据我所知,rabbitmq在收到ACK后会从队列中删除消息,是吗?那么当spring boot发送ACK时?以防出现任意情况(除了
AmqpRejectAndDontRequeueException
)来自侦听器的未捕获异常?好的,但是如果来自我自己的转换器的未捕获异常(例如解析器异常)会怎么样?请查看我的答案。您好,请更新链接。它表示无效。