【问题标题】:Spring JmsTemplate release resource (IBM model queue)Spring JmsTemplate 发布资源(IBM 模型队列)
【发布时间】:2021-09-28 00:44:40
【问题描述】:

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

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

如果不再使用资源,队列可以被 QueueManager 关闭,我该怎么办?

以下是Producer的实现。

@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) {
        ...
    }
}

希望你能帮助我。

【问题讨论】:

    标签: java spring spring-boot jms ibm-mq


    【解决方案1】:

    检查您的模型队列定义。由于 TDQ 不能是共享队列(使用耦合工具),因此您必须使用永久动态队列,该队列将在关闭后继续存在。

    【讨论】:

    • 嗨,马克,我是 qmgr 的 Patrick 的管理员。我们的环境中有管理作业来删除这些队列,但他的应用程序仍在使用它们 (OPPROC>0)。
    • 你是对的,队列是动态共享的:DEFINE QMODEL('LOHNID.SIGNATUR.MODEL') QSGDISP(GROUP) DEFTYPE(SHAREDYN) CFSTRUCT('QUEUET') USAGE(NORMAL) INDXTYPE( NONE) STGCLASS('LOHNID') MAXDEPTH(5000) MAXMSGL(200) DEFPRTY(0) DEFPSIST(NO) DEFPRESP(SYNC) MSGDLVSQ(PRIORITY) SHARE DEFSOPT(SHARED) NOTRIGGER
    猜你喜欢
    • 1970-01-01
    • 2015-02-19
    • 2014-03-18
    • 2011-01-01
    • 2011-10-03
    • 1970-01-01
    • 2011-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多