首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring JmsTemplate发布资源(IBM model queue)

Spring JmsTemplate发布资源(IBM model queue)
EN

Stack Overflow用户
提问于 2021-07-20 21:44:28
回答 1查看 79关注 0票数 0

我目前正在实现一个写入动态创建的SpringBoot队列(模型队列)的IBM应用程序。在写入之后,这些队列不再被释放,因此耦合设施充满了队列,并且不能创建新的模型队列。

在我的SpringBoot应用程序中,我使用JMSTemplate将TextMessages写入模型队列(目的地)。

如果队列不再被使用,我必须做什么,资源被释放,并且队列可以被QueueManager关闭?

下面是Producer的实现。

代码语言:javascript
复制
@Service
public class MessageSender {

    private final JmsTemplate jmsTemplate;

    public MessageSender(JmsTemplate jmsTemplate) {
        this.jmsTemplate = jmsTemplate;
    }

    /**
     * Verschickt eine Bytesmessage an die angegebene Destination
     *
     * @param destination Zieladresse
     * @param text        Inhalt der Nachricht
     */
    public void sendMessage(Destination destination, String text) {
        try {
            jmsTemplate.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
            jmsTemplate.setDefaultDestination(destination);
            jmsTemplate.send(destination, session -> {
                TextMessage message = session.createTextMessage(text);
                message.setJMSDeliveryMode(DeliveryMode.NON_PERSISTENT);
                return message;
            });
            jmsTemplate.
        } catch (InvalidDestinationException e) {
            StatisticLogger.logMessageSenderError(destination, text);
        }
    }
    
}

@Configuration
@EnableJms
public class JmsConfiguration {

    /**
     * Erstellt ein neues JMS-Template
     * @param connectionFactory Connection-Factory
     * @return JMS-Template
     */
    @Bean
    public JmsTemplate jmsTemplate(ConnectionFactory connectionFactory) {
        JmsTemplate jmsTemplate = new JmsTemplate();
        
        jmsTemplate.setConnectionFactory(connectionFactory);
        jmsTemplate.setExplicitQosEnabled(true);
        // Der Delivery-Mode muss NON_PERSISTANT sein, da die dynamische Rueckantwort-Queue keine persistenten 
        // Nachrichten verarbeiten kann!
        jmsTemplate.setDeliveryPersistent(false);
        
        return jmsTemplate;
    }
    
}

@JmsListener(destination = "${ibm.mq.queue}")
public void receiveMessage(Message message) {
    long start = System.currentTimeMillis();
    Destination destination = null;
    try {
        destination = message.getJMSReplyTo();
        if (destination == null) {
            LOGGER.error(ERROR_MARKER, "Keine ReplyTo-Destination gegeben.");
            return;
        }
        byte[] bytes = getBytesFromByteMessage(message);
        Daten daten = processor.generateDatenFromBytes(bytes);
        messageSender.sendMessage(destination, buildRzDatenMessage(daten));

    } catch (JMSException e) {
        ...
    }
}

我希望你能帮助我。

EN

回答 1

Stack Overflow用户

发布于 2021-07-20 22:06:47

检查您的模型队列定义。由于TDQ不能是共享队列(使用耦合设施),因此您必须使用一个永久的动态队列,该队列将在关闭之后仍然存在。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68455975

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档