JMS穿透场景:即JMS代理服务直接关联一个JMS业务服务,由业务服务完成所代理的服务请求。在JMS Transport中配置Broker、端口号,队列,在JMS Endpoint中关联JMS Transport。

JMS代理服务、JMS业务服务分别对应一个队列,消息生产者发送消息到队列中,JMS代理服务从中取出消息后传递给JMS业务服务,JMS业务服务再转发消息到另一个队列中,供消费者获取。JMS服务默认是不带确认消息的单向请求。

本节讲述了JMS协议穿透场景的创建过程,包括创建工程、创建JMS协议相关的服务、部署、监控和运行。通过本节你将了解到如下内容:

  1. 如何创建JMS协议穿透场景;
  2. 如何在Studio中测试运行开发的业务逻辑;
  3. 如果通过APIGateway Console部署JMS相关的Module;
  4. 如何通过Monitor监控JMS的信息;

示例如附件所示:jms.zip (opens new window)

# 创建工程

  1. 打开APIGateway Studio,在资源管理器中,点击右键,选择"创建 > ESB项目"菜单项,创建工程,如下图所示。
     3.3.4 JMS穿透 > image2018-10-10 17:56:4.png

  2. 在工程创建向导中,填写工程的基本信息,如工程名称等,这里我们创建一个名为"jms"的工程,如下图所示。
     3.3.4 JMS穿透 > image2020-6-2 15:15:4.png

  3. 单击“下一步”,设置工程的引用库,这里使用缺省设置,如下图所示。
     3.3.4 JMS穿透 > image2020-4-9 17:29:9.png

  4. 单击“完成”,完成创建工程。创建工程后,资源管理器如下图所示。
     3.3.4 JMS穿透 > image2020-6-2 15:15:31.png

# 创建公共Module

  1. 在资源管理器中,选中创建好的项目,鼠标右键选择“创建 > 公共Module”,创建公共Module,如下图所示。
     3.3.4 JMS穿透 > image2020-6-2 15:16:28.png

  2. 在“公共Module”对话框中,填写Module名称等信息,如下图所示。
     3.3.4 JMS穿透 > image2020-6-2 15:16:28.png

  3. 单击“完成”,公共Module创建完成,如下图所示。
     3.3.4 JMS穿透 > image2020-6-2 15:17:9.png

# 创建JMS Transport

  1. 在创建的ESB项目的“Transport”上,右键选择“创建 > JMS类型Transport”,如下图所示。
     3.3.4 JMS穿透 > image2020-6-2 15:18:24.png

  2. 在弹出的“创建JMS类型Transport”界面,选择当前的工程、Module,并输入文件名及显示名称,如下图所示。
     3.3.4 JMS穿透 > image2020-6-2 15:16:28.png

  3. 单击“完成”,打开JMS Transport编辑器,修改相关参数,JMS Transport创建完成,如下图所示。
     3.3.4 JMS穿透 > image2020-6-2 15:20:4.png

# 创建JMS Endpoint

  1. 在创建的ESB项目的“Endpoint”上,右键选择“创建 > JMS类型Endpoint”,如下图所示。
     3.3.4 JMS穿透 > image2020-6-2 15:21:6.png

  2. 在弹出的“创建JMS类型Endpoint”界面,选择当前的工程、Module,并输入文件名及显示名称,如下图所示。
     3.3.4 JMS穿透 > image2020-6-2 15:16:28.png

  3. 单击“完成”,打开JMS Endpoint编辑器,修改相关参数,JMS Endpoint创建完成,如下图所示。
     3.3.4 JMS穿透 > image2020-6-2 15:22:5.png

# 创建业务Module

  1. 在资源管理器中,选中创建好的项目,鼠标右键选择“创建 > 业务Module”,创建业务Module,如下图所示。
     3.3.4 JMS穿透 > image2020-6-2 15:24:29.png

  2. 在“业务Module”对话框中,填写Module名称等信息,如下图所示。
     3.3.4 JMS穿透 > image2020-6-2 15:24:50.png

  3. 单击“完成”,业务Module创建完成,如下图所示。
     3.3.4 JMS穿透 > image2020-6-2 15:25:13.png

# 创建JMS业务服务

  1. 在资源管理器中,在新建的“业务服务”上,鼠标右键选择“创建 > JMS业务服务”,创建JMS业务服务,如下图所示。
     3.3.4 JMS穿透 > image2020-6-2 17:12:19.png

  2. 在打开的“创建JMS业务服务”对话框中,输入类别信息,如下图所示。
     3.3.4 JMS穿透 > image2020-6-2 17:13:1.png

  3. 单击“完成”,在打开的“JMS业务服务”的编辑界面中,设置显示名称、Endpoint,如下图所示。
     3.3.4 JMS穿透 > image2020-6-2 17:14:44.png

  4. 单击工具栏的保存。

# 创建JMS代理服务

  1. 在资源管理器中,在“代理服务”上,鼠标右键选择“创建 > JMS代理服务”,创建JMS代理服务,如下图所示。
     3.3.4 JMS穿透 > image2020-6-2 17:16:2.png

  2. 在打开的“创建JMS代理服务”对话框中,输入类别信息,如下图所示。
     3.3.4 JMS穿透 > image2020-6-2 17:16:24.png

  3. 单击“完成”,在JMS代理服务的编辑界面中,设置JMS代理服务的配置,如下图所示。
     3.3.4 JMS穿透 > image2020-6-2 17:17:49.png

  4. 单击工具栏的保存,完成JMS代理服务的创建。

# 导出部署包

  1. 在资源管理器中,选中创建好的项目,鼠标右键单击“导出”,如下图所示。
     3.3.4 JMS穿透 > image2020-6-2 17:22:6.png

  2. 在"导出"界面中,选择"ESB > 导出部署包",单击"下一步",如下图所示。
     3.3.4 JMS穿透 > image2020-6-2 17:23:55.png

  3. 在弹出的"导出部署包"窗口中选择这两个Module,并指定"保存位置",将部署包命名为jms.ecd,单击"下一步",如下图所示。
     3.3.4 JMS穿透 > image2020-7-21 16:6:27.png

  4. 单击“完成”,提示“导出成功”,表明已经成功导出这两个Module,如下图所示。
     3.3.4 JMS穿透 > image2020-6-2 17:28:18.png

# 部署

  1. 使用开发账户登陆开发门户,单击左侧导航树上的 “模型部署 >新建部署” ,弹出 “新建部署” 界面。
    img

  2. 单击“新建部署“,显示新建部署页面,选取文件。
    img

  3. 点击上传,选择服务器,点击部署。
    img

  4. 部署成功。
    img

# 运行JMS客户端

  1. 启动APIGateway ESBServer:

  2. 通过JMS Producer代码往队列proxyJmsQueue1中发送文本类型的消息,消息体为"Hello, Primeton APIGateway"。然后,通过JMS Consumer从QueueOut队列中消费消息。JMS Client代码包括SimpleProducer和SimpleConsumer,分别用于发送和接收消息。代码如下所示。

package com.primeton.esb.jms.client;

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageProducer;
import javax.jms.Session;
import com.primeton.pmq.PMQConnectionFactory;


public class SimpleProducer {
	private String url;
	private String queueName;
	protected ConnectionFactory connectionFactory;
	protected Connection connection;
	protected Session session;
	protected Destination destination;
	protected MessageProducer producer;

	public SimpleProducer(String url, String queueName) {
		this.url = url;
		this.queueName = queueName;
	}

	/**
	 * 初始化
	 *
	 */
	public void init() {
		connectionFactory = new PMQConnectionFactory(this.url);
		try {
			connection = connectionFactory.createConnection();
			connection.start();
			session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
			destination = session.createQueue(this.queueName);
			producer = session.createProducer(destination);
		} catch (JMSException e) {
			// @REVIEW Auto-generated catch block
			e.printStackTrace();
		}
	}

	/**
	 * 发送消息
	 *
	 * @param text 消息体
	 */
	public void sendMessage(String text) {
		try {
			Message message = session.createTextMessage(text);
			producer.send(message);
			System.out.println("发送消息 : " + text);
		} catch (JMSException e) {
			// @REVIEW Auto-generated catch block
			e.printStackTrace();
		}
	}

	/**
	 * 释放资源
	 *
	 */
	public void close() {
		System.out.println("释放生产者资源。");
		try {
			if (producer != null) {
				producer.close();
				producer = null;
			}
			if (session != null) {
				session.close();
				session = null;
			}
			if (connection != null) {
				connection.close();
				connection = null;
			}
		} catch (JMSException e) {
			// @REVIEW Auto-generated catch block
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		String url = "tcp://localhost:61616";
		String queueName = "proxyJmsQueue1";
		String text = "Hello , Primeton APIGateway";
		SimpleProducer producer = new SimpleProducer(url, queueName);
		producer.init();
		producer.sendMessage(text);
		producer.close();
	}
}



package com.primeton.esb.jms.client;

import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.Session;
import javax.jms.TextMessage;

import org.apache.activemq.ActiveMQConnectionFactory;
 
/**
 * JMS消费者
 * @author primeton
 *
 */
public class SimpleConsumer {
    private String url;
    
    private String queueName;

    protected ConnectionFactory connectionFactory;

    protected Connection connection;

    protected Session session;

    protected Destination destination;

    protected MessageConsumer consumer;

    public SimpleConsumer(String url, String queueName) {
            this.url = url;
            this.queueName = queueName;
    }

    /**
     * 初始化
     *
     */
    public void init() {
            connectionFactory = new ActiveMQConnectionFactory(this.url);
            try {
                     connection = connectionFactory.createConnection();
                     connection.start();
                     session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
                     destination = session.createQueue(this.queueName);
                     consumer = session.createConsumer(destination);
            } catch (JMSException e) {
                     // @REVIEW Auto-generated catch block
                     e.printStackTrace();
            }
    }

    /**
     * 接收消息
     *
     */
    public void receiveMessage() {
            try {
                     Message message = consumer.receive(2000);
                     if (message instanceof TextMessage) {
                              TextMessage textMessage = (TextMessage) message;
                              System.out.println("接收到消息 : " + textMessage.getText());
                     }
            } catch (JMSException e) {
                     // @REVIEW Auto-generated catch block
                     e.printStackTrace();
            }
    }

    /**
     * 释放资源
     *
     */
    public void close() {
            System.out.println("释放消费者的资源。");
            try {
                     if (consumer != null) {
                              consumer.close();
                              consumer = null;
                     }
                     if (session != null) {
                              session.close();
                              session = null;
                     }
                     if (connection != null) {
                              connection.close();
                              connection = null;
                     }
            } catch (JMSException e) {
                     // @REVIEW Auto-generated catch block
                     e.printStackTrace();
            }
    }

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO 自动生成方法存根
        String url = "tcp://localhost:61616";
        String queueName = "jmsQueue1";//JMS穿透服务中业务服务的队列
        //String queueName = "dynamicQueue";//JmsToJms中介服务中动态设置的业务服务队列

        SimpleConsumer receive = new SimpleConsumer(url, queueName);
        receive.init();
        receive.receiveMessage();
        receive.close();
	}

}

 

# 监控JMS消息

  1. 使用运维账户登陆,单击左侧导航树上的 “监控统计 >资源监控> 队列监控” ,右侧区域显示 “队列监控” 界面。
     3.3.4 JMS穿透 > image2023-10-8_11-45-44.png