WSO2 ESB 5.0.0 配置 JMS 传输(ActiveMQ)- 主题消息发布与订阅

在此示例中,在 ActiveMQ 中创建主题,然后在 WSO2 ESB 中添加充当发布者和订阅者的代理服务。
在这里插入图片描述

一、在 ESB 中配置 ActiveMQ

在 ESB 中配置 ActiveMQ

二、配置发布者

1、在 ActiveMQ 创建主题

在 ActiveMQ 创建名为 SimplePublishSubscribeService 的主题
在这里插入图片描述
在这里插入图片描述

2、在 ESB 中添加代理服务

添加一个名为 PublishSubscribe 的代理服务并将其配置为发布到主题 SimplePublishSubscribeService。 可以使用管理控制台将代理服务添加到 ESB,方法是在设计视图中构建代理服务,或者将 XML 配置复制到源视图中。 或者,可以将名为 PublishSubscribe.xml 的 XML 文件添加到 <ESB_HOME>/repository/deployment/server/synapse-configs/default/proxy-services。 下面给出了定义代理服务的示例 XML 代码段。 请注意,地址 URI 指定了用于配置 JMS 传输的属性。
在这里插入图片描述
在这里插入图片描述

URI:jms:/主题名称?transport.jms.ConnectionFactoryJNDIName=JMS侦听器配置的jdni名称&amp;java.naming.factory.initial=org.apache.activemq.jndi.ActiveMQInitialContextFactory&amp;java.naming.provider.url=tcp://ActiveMQ服务器地址:61616&amp;transport.jms.DestinationType=topic

<?xml version="1.0" encoding="UTF-8"?>
<proxy name="PublishSubscribe" startOnLoad="true" transports="jms" xmlns="http://ws.apache.org/ns/synapse">
    <target>
        <endpoint>
            <address uri="jms:/SimplePublishSubscribeService?transport.jms.ConnectionFactoryJNDIName=TopicConnectionFactory&amp;java.naming.factory.initial=org.apache.activemq.jndi.ActiveMQInitialContextFactory&amp;java.naming.provider.url=tcp://192.168.131.128:61616&amp;transport.jms.DestinationType=topic"/>
        </endpoint>
        <inSequence>
            <property name="OUT_ONLY" scope="default" type="STRING" value="true"/>
        </inSequence>
        <outSequence/>
        <faultSequence/>
    </target>
</proxy>

在 ESB 发布 PublishSubscribe 代理服务后,ESB 会在 ActiveMQ 创建名为 PublishSubscribe 的队列。
。

三、配置订阅者

接下来,配置两个订阅 JMS 主题 SimplePublishSubscribeService 的代理服务,以便每当该主题收到消息时,它就会发送到这些订阅代理服务。 以下是这些代理服务的示例配置。

1、订阅者 1 配置

<?xml version="1.0" encoding="UTF-8"?>
<proxy name="SimplePublishSubscribeService1" startOnLoad="true" transports="jms" xmlns="http://ws.apache.org/ns/synapse">
    <target>
        <inSequence>
            <property name="OUT_ONLY" scope="default" type="STRING" value="true"/>
            <property expression="json-eval($.)" name="jsondata" scope="default" type="STRING"/>
            <log level="custom">
                <property name="Subscriber1" value="I am Subscriber1"/>
            </log>
            <class name="com.SimplePublishSubscribeService1">
                <property name="property_name" value="jsondata"/>
            </class>
            <payloadFactory media-type="json">
                <format>$1</format>
                <args>
                    <arg evaluator="xml" expression="get-property(&quot;datainfos&quot;)"/>
                </args>
            </payloadFactory>
            <drop/>
        </inSequence>
        <outSequence>
            <send/>
        </outSequence>
        <faultSequence/>
    </target>
    <parameter name="transport.jms.DestinationType">topic</parameter>
    <parameter name="transport.jms.Destination">SimplePublishSubscribeService</parameter>
    <parameter name="transport.jms.ContentType">
        <rules>
            <jmsProperty>contentType</jmsProperty>
            <default>application/json</default>
        </rules>
    </parameter>
    <parameter name="transport.jms.ConnectionFactory">myTopicConnectionFactory</parameter>
</proxy>

指定主题消息的类型,json/xml/text 等。
在这里插入图片描述

特别特别注意!!!!!!transport.jms.ConnectionFactory 配置的是 JMS 传输侦听器中的 parameter 名字
在这里插入图片描述
ClassMediator

package com;

import org.apache.synapse.MessageContext; 
import org.apache.synapse.mediators.AbstractMediator;

public class SimplePublishSubscribeService1 extends AbstractMediator { 

	private String property_name;

	public String getProperty_name() {
		return property_name;
	}

	public void setProperty_name(String property_name) {
		this.property_name = property_name;
	}
	
	
	public boolean mediate(MessageContext context) { 
		// TODO Implement your mediation logic here 
		
		String topic_data = (String) context.getProperty(property_name);
		
		System.out.println("订阅者1接收到的数据:" + topic_data);
		
		context.setProperty("datainfos", topic_data);
		
		return true;
	}
}

2、订阅者 2 配置

<?xml version="1.0" encoding="UTF-8"?>
<proxy name="SimplePublishSubscribeService2" startOnLoad="true" transports="jms" xmlns="http://ws.apache.org/ns/synapse">
    <target>
        <inSequence>
            <property name="OUT_ONLY" scope="default" type="STRING" value="true"/>
            <log level="custom">
                <property name="Subscriber2" value="I am Subscriber2"/>
            </log>
            <drop/>
        </inSequence>
        <outSequence>
            <send/>
        </outSequence>
        <faultSequence/>
    </target>
    <parameter name="transport.jms.DestinationType">topic</parameter>
    <parameter name="transport.jms.Destination">SimplePublishSubscribeService</parameter>
    <parameter name="transport.jms.ContentType">
        <rules>
            <jmsProperty>contentType</jmsProperty>
            <default>application/json</default>
        </rules>
    </parameter>
    <parameter name="transport.jms.ConnectionFactory">myTopicConnectionFactory</parameter>
</proxy>

指定主题消息的类型,json/xml/text 等。
在这里插入图片描述

特别特别注意!!!!!!transport.jms.ConnectionFactory 配置的是 JMS 传输侦听器中的 parameter 名字
在这里插入图片描述

四、发布 ESB 代理服务

发布 SimplePublishSubscribeService1 和 SimplePublishSubscribeService2 代理服务。
在这里插入图片描述
订阅者发布成功!

五、测试消息发布与订阅

在本实例中,ESB 中创建了名为 PublishSubscribe 的代理服务,该服务是作用是监听 ActiveMQ 的 PublishSubscribe 队列,如果该队列有消息,则把消息发布到 ActiveMQ 中的 SimplePublishSubscribeService 主题,代理服务 SimplePublishSubscribeService1 和 SimplePublishSubscribeService1 订阅了主题 SimplePublishSubscribeService,如果收到主题发布的消息,则会打印出日志。
测试方法:向 ESB 的 PublishSubscribe 代理服务发送消息,或者向 ActiveMQ 的 PublishSubscribe 队列发送消息,或者向 ActiveMQ 的 SimplePublishSubscribeService 主题发布消息, SimplePublishSubscribeService1 和 SimplePublishSubscribeService1 都会收到所订阅主题的消息。

向 ActiveMQ 的 SimplePublishSubscribeService 主题发布消息
在这里插入图片描述

WSO2 ESB 收到订阅消息
在这里插入图片描述

在这里插入图片描述

六、示例代码

库文件 <AMQ_HOME>/activemq-all-x.x.x.jar

1、主题消息发布者

package topic.producer;

import javax.jms.*;

import org.apache.activemq.ActiveMQConnectionFactory;

import com.alibaba.fastjson.JSONObject;

public class TopicMsgProducer {

	private static final String DEFAULT_BROKER_HOST = "192.168.131.128";
	private static final String DEFAULT_BROKER_PORT = "61616";
	private static final String defaultURL = "tcp://" + DEFAULT_BROKER_HOST + ":" + DEFAULT_BROKER_PORT;

	private static final String USER_NAME = "user";
	private static final String PASSWORD = "user";

	private static final String TOPIC_NAME = "SimplePublishSubscribeService";

	public static void main(String[] args) {
		new TopicMsgProducer().send();
	}

	public void send() {
		// 创建连接工厂
		ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory();

		Connection conn = null;
		try {

			factory.setBrokerURL(defaultURL);
			factory.setUserName(USER_NAME);
			factory.setPassword(PASSWORD);

			// 创建连接
			conn = factory.createConnection();
			conn.start();
			// 创建会话
			Session session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
			// 创建地点
			Topic topic = session.createTopic(TOPIC_NAME);
			// 创建生产者
			MessageProducer producer = session.createProducer(topic);
			producer.setDeliveryMode(DeliveryMode.PERSISTENT);
			producer.setTimeToLive(Message.DEFAULT_TIME_TO_LIVE);

			TextMessage tmsg = session.createTextMessage();
			
			JSONObject jsonObject = new JSONObject();
			jsonObject.put("text", "Hello, CalvinChan!");
			
			for(int i = 0; i < 10; i++) {
				tmsg.setText(jsonObject.toJSONString());
				producer.send(tmsg);
				System.out.println("发送的消息:" + tmsg.getText());
				
				Thread.sleep(2000);
			}
			
		} catch (JMSException | InterruptedException e) {
			e.printStackTrace();
		} finally {
			try {
				if (conn != null)
					conn.close();
			} catch (Throwable ignore) {
			}
		}
	}

}

2、主题消息订阅者

①、Consumer

package topic.consumer;

import javax.jms.*;

import org.apache.activemq.ActiveMQConnectionFactory;

public class TopicMsgConsumer {

	private static final String DEFAULT_BROKER_HOST = "192.168.131.128";
	private static final String DEFAULT_BROKER_PORT = "61616";
	private static final String defaultURL = "tcp://" + DEFAULT_BROKER_HOST + ":" + DEFAULT_BROKER_PORT;
	
	private static final String USER_NAME = "user";
	private static final String PASSWORD = "user";
	
	private static final String TOPIC_NAME = "SimplePublishSubscribeService";
	
	private static final String CLIENT_ID = "calvinchan";
	
	
	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		new TopicMsgConsumer().receive();
	}

	public void receive() {
		ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory();
		Connection conn = null;
		try {
			factory.setBrokerURL(defaultURL);
			factory.setUserName(USER_NAME);
			factory.setPassword(PASSWORD);
			
			conn = factory.createConnection();
			conn.setClientID(CLIENT_ID);
			conn.start();
			Session session = conn.createSession(false, Session.CLIENT_ACKNOWLEDGE);
			// 订阅发布模式的 Topic对象 不是Destination
			Topic topic = session.createTopic(TOPIC_NAME);
			TopicSubscriber subsriber = session.createDurableSubscriber(topic, CLIENT_ID);
			subsriber.setMessageListener(new MessageListenerCallBack(session));
			while (true);
		} catch (JMSException e) {
			e.printStackTrace();
		} finally {
			if (conn != null) {
				try {
					conn.close();
				} catch (JMSException e) {
					e.printStackTrace();
				}
			}
		}
	}
}

②、MessageListenerCallBack

package topic.consumer;

import java.text.SimpleDateFormat;
import java.util.Date;

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.Session;
import javax.jms.TextMessage;

public class MessageListenerCallBack implements MessageListener {

	private Session session;
	
	private SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");

	public MessageListenerCallBack(Session session) {
		this.session = session;
	}
	
	@Override
	public void onMessage(Message message) {
		// TODO 自动生成的方法存根
		TextMessage textMessage = (TextMessage) message;
		
		try {
			if (textMessage != null) { 
				// 接收到消息
				System.out.println("["+ simpleDateFormat.format(new Date()) + "] 接收到消息:" + textMessage.getText());
				message.acknowledge();
			} else {
				//没有接收到消息,通知producer重新发送
				this.session.recover();
			}
		} catch (JMSException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}
	}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
WSO2 Integration Studio是一个基于Eclipse的集成开发环境(IDE),专门用于构建和部署企业级集成解决方案。它是WSO2企业级集成平台的核心组件之一。 WSO2 Integration Studio提供了一套强大的工具和功能,帮助开发人员简化和加快集成解决方案的开发过程。它支持多种集成模式和技术,包括SOAP和RESTful Web服务、JMS消息传递、企业服务总线(ESB)、API管理、数据服务和业务流程等。 使用WSO2 Integration Studio,开发人员可以轻松创建和编辑集成流程。它提供了一个可视化界面,允许开发人员将各个集成组件(例如消息源、中间件、数据变换器等)拖放到工作区,并定义它们之间的流程和交互。此外,它还提供了丰富的调试和测试工具,以帮助开发人员验证和调优集成解决方案。 WSO2 Integration Studio还具有强大的部署和管理功能。开发人员可以使用它将集成解决方案打包为可执行文件,然后在生产环境中部署和运行。此外,它还提供了监控和管理集成解决方案的功能,开发人员可以实时查看和分析解决方案的性能和运行状况。 总的来说,WSO2 Integration Studio是一个强大且易于使用的集成开发环境,可以帮助开发人员快速构建和部署复杂的企业集成解决方案。它提供了丰富的工具和功能,支持各种集成模式和技术。无论是构建Web服务、消息传递还是API管理,WSO2 Integration Studio都能提供强大的支持,并帮助开发人员将集成解决方案以高效和可靠的方式交付给客户。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菠萝蚊鸭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值