Java 如何从activemq中删除已使用的消息?

Java 如何从activemq中删除已使用的消息?,java,spring-boot,activemq,Java,Spring Boot,Activemq,我需要在使用activemq后立即将其删除。例如,我向队列发送一条消息,然后使用它,需要将其从队列中删除。我在这里使用了messagestorage和clear()方法。消息被添加到队列中,并仅从消息存储中删除,而不从队列中删除。我需要一种从队列中删除消息的方法。谢谢你的帮助 我试过下面的代码 制作人 消费者 控制器 @PostMapping(value=“/api/customer”) 公共客户后客户(@RequestBody-Customer){ jmsProducer.send(客户);

我需要在使用activemq后立即将其删除。例如,我向队列发送一条消息,然后使用它,需要将其从队列中删除。我在这里使用了messagestorage和clear()方法。消息被添加到队列中,并仅从消息存储中删除,而不从队列中删除。我需要一种从队列中删除消息的方法。谢谢你的帮助

我试过下面的代码

制作人 消费者 控制器
@PostMapping(value=“/api/customer”)
公共客户后客户(@RequestBody-Customer){
jmsProducer.send(客户);
退货客户;
}
@GetMapping(value=“/api/customers”)
公共列表getAll(){
List customers=customerStorage.getAll();
返回客户;
}
@DeleteMapping(value=“/api/customers/clear”)
公共字符串clearCustomerStorage(){
customerStorage.clear();
返回“清除所有客户存储!”;
}
消息存储
公共类消息存储{
private List customers=new ArrayList();
公共作废添加(客户){
客户。添加(客户);
}
公共空间清除(){
客户。清除();
}
公共列表getAll(){
返回客户;
}
}
连接工厂配置
@配置
公共类ConnectionFactoryConfiguration{
@值(${gkz.activemq.broker.url})
断线器;
@值(${gkz.activemq.borker.username})
字符串用户名;
@值(${gkz.activemq.borker.password})
字符串密码;
@豆子
公共连接工厂连接工厂(){
ActiveMQConnectionFactory connectionFactory=新的ActiveMQConnectionFactory();
connectionFactory.setBrokerURL(brokerUrl);
connectionFactory.setUserName(用户名);
connectionFactory.setPassword(密码);
返回连接工厂;
}
@豆子
公共消息转换器jacksonJmsMessageConverter(){
MappingJackson2MessageConverter=新的MappingJackson2MessageConverter();
setTargetType(MessageType.TEXT);
converter.setTypeIdPropertyName(“_-type”);
回流转换器;
}
//用于接收消息
@豆子
公共JmsListenerContainerFactory jsaFactory(连接工厂连接工厂,
DefaultJmsListenerContainerFactoryConfigurer(配置器){
DefaultJmsListenerContainerFactory=新的DefaultJmsListenerContainerFactory();
setMessageConverter(jacksonJmsMessageConverter());
configurer.configure(工厂、连接工厂);
返回工厂;
}
//用于发送消息。
@豆子
公共JmsTemplate JmsTemplate(){
JmsTemplate=new JmsTemplate();
setMessageConverter(jacksonJmsMessageConverter());
setConnectionFactory(connectionFactory());
返回模板;
}
}

整个代码可在

中找到,这是队列的用途。您真的看到您的消息在消费后没有被删除吗?您在
@JmsListener
中定义的
jsaFactory
如何?你在那里覆盖了什么样的配置?你能在你的问题中加上这个吗?你能不用任何定制的
containerFactory
?还有
@EnableJms
注释吗?您确定您正在使用邮件吗?你看到那些
System.out.println(“收到的消息:+customer”)?是否保留邮件?默认情况下,我认为消息在使用时会被直接删除。对于度量值,只有一个
出列的
计数器。您显示的只是度量值!它用于监视队列并查看消息是否正确使用。消息一旦在队列中被使用就会被删除,这是队列的要点,您不需要做任何事情。这是队列的目的。您真的看到您的消息在消费后没有被删除吗?您在
@JmsListener
中定义的
jsaFactory
如何?你在那里覆盖了什么样的配置?你能在你的问题中加上这个吗?你能不用任何定制的
containerFactory
?还有
@EnableJms
注释吗?您确定您正在使用邮件吗?你看到那些
System.out.println(“收到的消息:+customer”)?是否保留邮件?默认情况下,我认为消息在使用时会被直接删除。对于度量值,只有一个
出列的
计数器。您显示的只是度量值!它用于监视队列并查看消息是否正确使用。消息一旦在队列中被使用就会被删除,这是队列的要点,您不需要做任何事情。
@Component
public class JmsProducer {

    @Autowired
    JmsTemplate jmsTemplate;
    
    @Value("${gkz.activemq.queue}")
    String queue;
    
    public void send(Customer customer){
        jmsTemplate.convertAndSend(queue, customer);
    }
}
@Component
public class JmsConsumer {
    @Autowired
    private MessageStorage customerStorage;

    @JmsListener(destination = "${gkz.activemq.queue}",containerFactory="jsaFactory")
    public void receive(Customer customer){
        System.out.println("Recieved Message: " + customer);
        customerStorage.add(customer);
    }
}
@PostMapping(value="/api/customer")
public Customer postCustomer(@RequestBody Customer customer){
    jmsProducer.send(customer);
    return customer;
}

@GetMapping(value="/api/customers")
public List<Customer> getAll(){
    List<Customer> customers = customerStorage.getAll();
    return customers;
}

@DeleteMapping(value="/api/customers/clear")
public String clearCustomerStorage() {
    customerStorage.clear();
    return "Clear All CustomerStorage!";
}
public class MessageStorage {
    private List<Customer> customers = new ArrayList<>();

    public void add(Customer customer) {
        customers.add(customer);
    }

    public void clear() {
        customers.clear();
    }

    public List<Customer> getAll(){
        return customers;
    }
}
@Configuration
public class ConnectionFactoryConfiguration {
    
    @Value("${gkz.activemq.broker.url}")
    String brokerUrl;
    
    @Value("${gkz.activemq.borker.username}")
    String userName;
    
    @Value("${gkz.activemq.borker.password}")
    String password;
    
    @Bean
    public ConnectionFactory connectionFactory(){
        ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory();
        connectionFactory.setBrokerURL(brokerUrl);
        connectionFactory.setUserName(userName);
        connectionFactory.setPassword(password);
        return connectionFactory;
    }
    
    @Bean
    public MessageConverter jacksonJmsMessageConverter() {
        MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter();
        converter.setTargetType(MessageType.TEXT);
        converter.setTypeIdPropertyName("_type");
        return converter;
    }
    
    
    //Used for Receiving Message
    @Bean
    public JmsListenerContainerFactory<?> jsaFactory(ConnectionFactory connectionFactory,
                                                    DefaultJmsListenerContainerFactoryConfigurer configurer) {
        DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
        factory.setMessageConverter(jacksonJmsMessageConverter());
        configurer.configure(factory, connectionFactory);
        return factory;
    }
 
    
    //Used for Sending Messages.
    @Bean
    public JmsTemplate jmsTemplate(){
        JmsTemplate template = new JmsTemplate();
        template.setMessageConverter(jacksonJmsMessageConverter());
        template.setConnectionFactory(connectionFactory());
        return template;
    }
    
}