11.3 JMS
This topic provides information on JMS.
If the deployment is on Apache Tomcat, JMS (Java Message Service) is not supported and It is recommended to configure and use Apache Kafka for messaging instead.
JMSUtility and TopicUtility is now
deprecated.MessageProducerUtilityshould be used for producing messages to JMS
destinations. MessageProducerUtility requires entries of the JMS destinations to
be present in the table DIGX_FW_DESTINATION_METADATA.
- For any new as well as existing customized JMS queues or topics, Please ensure to
add entries in this table with relevant metadata for topic/queue maintenance. The
table has three columns:
DESTINATION: The name of the topic or queue.CONNECTION_FACTORY: The connection factory used.DESTINATION_TYPE: The type (e.g., topic or queue).
For example,
INSERT INTO DIGX_FW_DESTINATION_METADATA values ('PoliciesTopic','POLICIESQCF', 'TOPIC'); - Add below dependency to build.gradle of the JMS listener
project.
implementation "com.ofss.digx.infra:com.ofss.digx.infra.events:$libs_digxVersion" - For message processing logic, create a class implementing com.ofss.digx.infra.events.processor.IMessageProcessor interface, override the process method and call this method from the JMS listener class. Refer Section3: Implementing Event Processing Logicof New Topic Creation With Producer and Consumer chapter for the same.
- Sample code for JMS
listener
package com.ofss.digx.jms.sms.listener.authorization.policy; import com.ofss.common.platform.server.ServerPlatformUtils; import com.ofss.digx.app.sms.dto.authorization.policy.PolicyMapDTO; import com.ofss.digx.app.sms.processors.authorization.policy.PoliciesMessageProcessor; import com.ofss.digx.infra.jms.listener.IJMSTopicListener; import org.slf4j.Logger;import org.slf4j.LoggerFactory; import javax.jms.JMSException;import javax.jms.Message; import javax.jms.ObjectMessage; import java.io.Serializable; public class PoliciesTopicListener implements IJMSTopicListener { /** * Stores the name of the entity(class)represented by this {@code Class} object * as a {@code String} */ private static final String THIS_COMPONENT_NAME = PoliciesTopicListener.class.getName(); private static final transient Logger logger = LoggerFactory.getLogger(THIS_COMPONENT_NAME); /** * Property which stores the topic JNDI name. */ private static final String POLICIES_TOPIC = "PoliciesTopic"; /** * Property which stores the topic connection factory JNDI name. */ private static final String POLICIES_QCF = "POLICIESQCF"; private final PoliciesMessageProcessor processor = new PoliciesMessageProcessor(); @Override public String getConnectionFactoryName() { return getJNDIName(POLICIES_QCF); } @Override public String getTopicName() { return getJNDIName(POLICIES_TOPIC); } @Override public void onMessage(Message message) { logger.debug("Entered into onMessage() of policy topic listener in class {} ", THIS_COMPONENT_NAME); Serializable obj = null; if (message instanceof ObjectMessage) { ObjectMessage objMessage = (ObjectMessage)message; try { obj = objMessage.getObject(); if (obj instanceof PolicyMapDTO) { @SuppressWarnings("unchecked") PolicyMapDTO applicationRoles = (PolicyMapDTO) obj; processor.process(null, applicationRoles); } } catch (JMSException | ClassCastException e) { logger.error("Exception encountered while invoking the service {} in onMessage", THIS_COMPONENT_NAME, e); } catch(java.lang.Exception e) { logger.error("Exception encountered while invoking the service {} in onMessage", THIS_COMPONENT_NAME, e); } } } private String getJNDIName(String name) { return ServerPlatformUtils.detectServerPlatform().platformJNDIName(name); } }
Parent topic: Messaging System Integration for OBDX