package com.sunda.spmsweb.ibmmq;

import com.ibm.mq.jms.MQQueueConnectionFactory;
import com.ibm.msg.client.wmq.WMQConstants;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.jms.connection.CachingConnectionFactory;
import org.springframework.jms.connection.UserCredentialsConnectionFactoryAdapter;
import org.springframework.jms.core.JmsOperations;
import org.springframework.jms.core.JmsTemplate;

/**
 * @program: spms
 * @description: Jms config - message out. 封装消息传给外围系统。
 * @author: Wayne Wu
 * @create: 2020-11-03 14:00
 **/
@Configuration
public class JmsConfigOut {

    /** 开发测试环境队列配置 */
    //public static final String queue = "IBM.SERVICE.POSUPDATA.REQUESTER.IN";

    /** 生产环境队列配置 */
    //public static final String queue = "IBM.SERVICE.POSUPDATA.REQUESTER.IN";

    public static String queue;
    @Value("${project.mq.queue}")
    public void setQueue(String queue){
        JmsConfigOut.queue = queue;
    }

    @Value("${project.mq.host}")
    private String host;
    @Value("${project.mq.port}")
    private Integer port;
    @Value("${project.mq.queue-manager}")
    private String queueManager;
    @Value("${project.mq.channel}")
    private String channel;
    @Value("${project.mq.username}")
    private String username;
    @Value("${project.mq.password}")
    private String password;
    @Value("${project.mq.receive-timeout}")
    private int receiveTimeout;
    @Value("${project.mq.ccsid}")
    private int CCSID;
    @Bean(name = "PIN_OUT")
    public MQQueueConnectionFactory mqQueueConnectionFactoryOut() {
        MQQueueConnectionFactory mqQueueConnectionFactory = new MQQueueConnectionFactory();
        mqQueueConnectionFactory.setHostName(host);
        try {
            mqQueueConnectionFactory.setTransportType(WMQConstants.WMQ_CM_CLIENT);
            mqQueueConnectionFactory.setCCSID(CCSID);
            mqQueueConnectionFactory.setChannel(channel);
            mqQueueConnectionFactory.setPort(port);
            mqQueueConnectionFactory.setQueueManager(queueManager);
            mqQueueConnectionFactory.setClientReconnectTimeout(receiveTimeout);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return mqQueueConnectionFactory;
    }
    @Bean(name = "PIN_OUT1")
    UserCredentialsConnectionFactoryAdapter userCredentialsConnectionFactoryAdapterOut(@Qualifier(value = "PIN_OUT") MQQueueConnectionFactory mqQueueConnectionFactory) {
        UserCredentialsConnectionFactoryAdapter userCredentialsConnectionFactoryAdapter = new UserCredentialsConnectionFactoryAdapter();
        userCredentialsConnectionFactoryAdapter.setUsername(username);
        userCredentialsConnectionFactoryAdapter.setPassword(password);
        userCredentialsConnectionFactoryAdapter.setTargetConnectionFactory(mqQueueConnectionFactory);
        return userCredentialsConnectionFactoryAdapter;
    }
    @Bean(name = "PIN_OUT2")
    @Primary
    public CachingConnectionFactory cachingConnectionFactoryOut(@Qualifier(value = "PIN_OUT1") UserCredentialsConnectionFactoryAdapter userCredentialsConnectionFactoryAdapter) {
        CachingConnectionFactory cachingConnectionFactory = new CachingConnectionFactory();
        cachingConnectionFactory.setTargetConnectionFactory(userCredentialsConnectionFactoryAdapter);
        cachingConnectionFactory.setSessionCacheSize(500);
        cachingConnectionFactory.setReconnectOnException(true);
        return cachingConnectionFactory;
    }

    @Bean(name = "PIN_OUT3")
    public JmsOperations jmsOperationsOut(@Qualifier(value = "PIN_OUT2") CachingConnectionFactory cachingConnectionFactory) {
        JmsTemplate jmsTemplate = new JmsTemplate(cachingConnectionFactory);
        jmsTemplate.setReceiveTimeout(receiveTimeout);
        return jmsTemplate;
    }

}
