All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.virtualan.message.core.jms.JMSMessageSender Maven / Gradle / Ivy

package io.virtualan.message.core.jms;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.stream.Collectors;
import javax.annotation.PostConstruct;
import javax.jms.ConnectionFactory;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session;
import lombok.extern.slf4j.Slf4j;
import org.json.JSONArray;
import org.json.JSONObject;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.beans.factory.support.GenericBeanDefinition;
import org.springframework.boot.autoconfigure.condition.ConditionalOnResource;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
import org.springframework.jms.listener.DefaultMessageListenerContainer;
import org.springframework.stereotype.Service;

@Service("jmsMessageSender")
@ConditionalOnResource(resources = {"classpath:conf/jms-config.json"})
@Slf4j
public class JMSMessageSender {

  List virtualanJMSConnectionFactory;

  @Autowired
  private BeanFactory beanFactory;

  static void sendMessage(String inboundTopic, String outboudTopic, String message) {
    log.info(JMSTemplateLookup.getJmsTemplateMap().toString());
    log.info("sending:{} " , message);

    JMSTemplateLookup.getJmsTemplate(inboundTopic).send(outboudTopic, new MessageCreator() {
      @Override
      public Message createMessage(Session session) throws JMSException {
        return session.createTextMessage(message);
      }
    });
  }

  @Autowired
  private void  allVirtualanJMSConnectionFactory(List virtualanJMSConnectionFactory) {
    this.virtualanJMSConnectionFactory = virtualanJMSConnectionFactory;
  }


  private ConnectionFactory connectionFactory(JMSConfigurationDomain conf) throws JMSException {
      for(VirtualanJMSConnectionFactory virtualanJMSConnection : this.virtualanJMSConnectionFactory){
        if(conf.getJmsType().equalsIgnoreCase(virtualanJMSConnection.getJMSType())) {
          return virtualanJMSConnection.connectionFactory(conf);
        }
      }
      log.warn("JMS Conf JMSType {} :: {} ",  conf.getJmsType() , conf );
      throw new JMSException("JMS Conf JMSType is not found" + conf.getJmsType());
  }


  private String readString(InputStream inputStream) throws IOException {
    try (BufferedReader br = new BufferedReader(new InputStreamReader(inputStream))) {
      return br.lines().collect(Collectors.joining(System.lineSeparator()));
    }
  }

  @PostConstruct
  public void init() throws IOException {
    try {
      JSONObject jmsConfigurations = getJMSConfiguration();
      Iterator keys = jmsConfigurations.keys();
      while(keys.hasNext()) {
        String key = keys.next();
        JSONArray array = jmsConfigurations.getJSONArray(key);
        if(array != null && array.length() > 0) {
          buildJMSListener(array, key);
        }
      }
    } catch (Exception e) {
      log.error("JMS conf is not loaded {}", e.getMessage());
    }
  }

  private void buildJMSListener(JSONArray array, String jmsType){
    for (int i = 0; i < array.length(); i++) {
      JSONObject object = array.optJSONObject(i);
      JMSConfigurationDomain conf = getJmsConfigurationDomain(object, jmsType);
      if (conf.getReceiverQueueName().contains(conf.getSenderQueueName())) {
        log.info("JMS conf is not valid to be loaded : {} " , conf);
        continue;
      }
      if (conf.getReceiverQueueName() != null) {
        registerListenerBeans(conf);
      }
      if (conf.getSenderQueueName() != null) {
        try {
          JmsTemplate jmsTemplate = new JmsTemplate(connectionFactory(conf));
          for (String queue : conf.getReceiverQueueName()) {
            JMSTemplateLookup.loadTemplate(queue, jmsTemplate);
          }
          log.info(JMSTemplateLookup.getJmsTemplateMap().toString());
        }catch (JMSException e){
          log.warn("JMS Exception error : {} : conf : {}", e.getMessage(), conf);
        }
      }
      log.info("JMS conf loaded : {} " , conf);
    }
  }

  private JSONObject getJMSConfiguration() throws IOException {
    InputStream stream = JMSMessageSender.class.getClassLoader()
        .getResourceAsStream("conf/jms-config.json");
    String jmsConfigJson = readString(stream);
    return new JSONObject(jmsConfigJson);
  }

  private List getReceiverQueues(JSONObject object)  {
    List receiverQueue = new ArrayList<>();
    for(int i=0; i < object.getJSONArray("receiver-queue").length(); i++) {
      receiverQueue.add((String) object.getJSONArray("receiver-queue").get(i));
    }
    return receiverQueue;
  }

  private JMSConfigurationDomain getJmsConfigurationDomain(JSONObject object, String jmsType) {
    JMSConfigurationDomain conf = new JMSConfigurationDomain();
    conf.setJmsType(jmsType);
    if("IBMMQ".equalsIgnoreCase(jmsType)) {
     conf.setSystem(object.getString("systemName"));
     conf.setHost(object.getString("host"));
     conf.setPort(object.getInt("port"));
     conf.setQueueMgr(object.getString("queue-mgr"));
     conf.setChannel(object.getString("channel"));
     conf.setUserName(object.optString("username"));
     conf.setPassword(object.optString("password"));
     conf.setReceiverQueueName(getReceiverQueues(object));
     conf.setSenderQueueName(object.optString("response-queue"));
   } else {
     conf.setSystem(object.getString("systemName"));
     conf.setBrokerUrl(object.getString("broker-url"));
     conf.setUserName(object.optString("user"));
     conf.setPassword(object.optString("password"));
     conf.setReceiverQueueName(getReceiverQueues(object));
     conf.setSenderQueueName(object.optString("response-queue"));
    }
    return conf;
  }

  private void registerListenerBeans(JMSConfigurationDomain conf) {
    for(String queue : conf.getReceiverQueueName()) {
      try {
        GenericBeanDefinition jmsBean = new GenericBeanDefinition();
        jmsBean.setBeanClass(JMSListener.class);
        BeanDefinitionBuilder bean = BeanDefinitionBuilder
            .rootBeanDefinition(DefaultMessageListenerContainer.class)
            .addPropertyValue("connectionFactory", connectionFactory(conf))
            .addPropertyValue("destinationName", queue)
            .addPropertyValue("messageListener", jmsBean);
        DefaultListableBeanFactory beanRegistry = (DefaultListableBeanFactory) beanFactory;
        beanRegistry.registerBeanDefinition(conf.getSystem().concat(queue), bean.getBeanDefinition());

        DefaultMessageListenerContainer messageListenerContainer = beanFactory
            .getBean(conf.getSystem().concat(queue), DefaultMessageListenerContainer.class);
        if (!messageListenerContainer.isRunning()) {
          log.info( "{} bean registered successfully.. and Started JmsListenerContainer", conf.getSystem());
          messageListenerContainer.start();
        }
      }catch (JMSException e){
        log.warn("JMS  Listener register Exception error : {} : conf : {}" , e.getMessage(), conf);
      }
    }
  }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy