JMS穿透场景:即JMS代理服务直接关联一个JMS业务服务,由业务服务完成所代理的服务请求。在JMS Transport中配置Broker、端口号,队列,在JMS Endpoint中关联JMS Transport。
JMS代理服务、JMS业务服务分别对应一个队列,消息生产者发送消息到队列中,JMS代理服务从中取出消息后传递给JMS业务服务,JMS业务服务再转发消息到另一个队列中,供消费者获取。JMS服务默认是不带确认消息的单向请求。
本节讲述了JMS协议穿透场景的创建过程,包括创建工程、创建JMS协议相关的服务、部署、监控和运行。通过本节你将了解到如下内容:
- 如何创建JMS协议穿透场景;
- 如何在Studio中测试运行开发的业务逻辑;
- 如果通过APIGateway Console部署JMS相关的Module;
- 如何通过Monitor监控JMS的信息;
示例如附件所示:jms穿透.zip
# 创建工程
打开ESB Studio,在资源管理器中,点击右键,选择"创建 > ESB项目"菜单项,创建工程,如下图所示。
在工程创建向导中,填写工程的基本信息,如工程名称等,这里我们创建一个名为"jms"的工程,如下图所示。
单击“下一步”,设置工程的引用库,这里使用缺省设置,如下图所示。
单击“完成”,完成创建工程。创建工程后,资源管理器如下图所示。
# 创建公共Module
在资源管理器中,选中创建好的项目,鼠标右键选择“创建 > 公共Module”,创建公共Module,如下图所示。
在“公共Module”对话框中,填写Module名称等信息,如下图所示。
单击“完成”,公共Module创建完成,如下图所示。
# 创建JMS Transport
在创建的ESB项目的“Transport”上,右键选择“创建 > JMS类型Transport”,如下图所示。
在弹出的“创建JMS类型Transport”界面,选择当前的工程、Module,并输入文件名及显示名称,如下图所示。
单击“完成”,打开JMS Transport编辑器,修改相关参数,JMS Transport创建完成,如下图所示。
# 创建JMS Endpoint
在创建的ESB项目的“Endpoint”上,右键选择“创建 > JMS类型Endpoint”,如下图所示。
在弹出的“创建JMS类型Endpoint”界面,选择当前的工程、Module,并输入文件名及显示名称,如下图所示。
单击“完成”,打开JMS Endpoint编辑器,修改相关参数,JMS Endpoint创建完成,如下图所示。
# 创建业务Module
在资源管理器中,选中创建好的项目,鼠标右键选择“创建 > 业务Module”,创建业务Module,如下图所示。
在“业务Module”对话框中,填写Module名称等信息,如下图所示。
单击“完成”,业务Module创建完成,如下图所示。
# 创建JMS业务服务
在资源管理器中,在新建的“业务服务”上,鼠标右键选择“创建 > JMS业务服务”,创建JMS业务服务,如下图所示。
在打开的“创建JMS业务服务”对话框中,输入类别信息,如下图所示。
单击“完成”,在打开的“JMS业务服务”的编辑界面中,设置显示名称、Endpoint,如下图所示。
单击工具栏的保存。
# 创建JMS代理服务
在资源管理器中,在“代理服务”上,鼠标右键选择“创建 > JMS代理服务”,创建JMS代理服务,如下图所示。
在打开的“创建JMS代理服务”对话框中,输入类别信息,如下图所示。
单击“完成”,在JMS代理服务的编辑界面中,设置JMS代理服务的配置,如下图所示。
单击工具栏的保存,完成JMS代理服务的创建。
# 导出部署包
在资源管理器中,选中创建好的项目,鼠标右键单击“导出”,如下图所示。
在"导出"界面中,选择"ESB > 导出部署包",单击"下一步",如下图所示。
在弹出的"导出部署包"窗口中选择这两个Module,并指定"保存位置",将部署包命名为jms.ecd,单击"下一步",如下图所示。
单击“完成”,提示“导出成功”,表明已经成功导出这两个Module,如下图所示。
# 部署
使用开发账户登录开发门户,单击左侧导航树上的 “模型部署 >新建部署” ,弹出 “新建部署” 界面。
单击“新建部署“,显示新建部署页面,选取文件。
点击上传,选择服务器,点击部署。
部署成功。
# 运行JMS客户端
启动ESB Server:
通过JMS Producer代码往队列proxyJmsQueue1中发送文本类型的消息,消息体为"Hello, ESB"。然后,通过JMS Consumer从QueueOut队列中消费消息。JMS Client代码包括SimpleProducer和SimpleConsumer,分别用于发送和接收消息。代码如下所示。
SimpleProducer.java
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 , ESB";
SimpleProducer producer = new SimpleProducer(url, queueName);
producer.init();
producer.sendMessage(text);
producer.close();
}
}
SimpleConsumer.java |
---|
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消息
使用运维账户登录,单击左侧导航树上的 “监控统计 >资源监控> 队列监控” ,右侧区域显示 “队列监控” 界面。