Metamorphosis(Metaq)在项目中的使用
metaq的wiki介绍参考如下:metaq-wiki;服务端下载地址:http://download.csdn.net/detail/facetoqiang/9595008 也可以在google资源库重下载(记得翻墙):http://code.google.com/p/meta-queue/downloads/list。
需要准备安装的软件有:
- jdk
- zookeeper
本文从以下开始说明:
- metaq服务端安装配置
- metaq客户端引入使用
- metaq使用总结
1. metaq服务端安装配置
解压下载的server如下: 项目结构如下:
metamorphosis-server-wrapper
bin ------ 二进制命令文件夹
env.bat ------
env.sh ------ 环境配置 可以修改 java_home
localMetaServer.bat ------ 日志配置文件
log4j.dtd ------ 日志配置文件
log4j.properties ------ 日志配置文件
log4j.xml ------ 日志配置文件
metaServer.bat ------ win 主二进制文件
metaServer.sh ------ lin 主二进制文件
slave-reloadconfig.sh ------ 动态添加 topic 需要执行该命令
tools_log4j.properties ------ 日志配置文件
tools-monitor-start.sh ------ 工具监控【不可用】
tools-run-class.sh ------ 工具方法【不可用】
conf ------ 所有配置文件文件夹
async_slave.properties ------
gregor_slave.properties ------
jettyBroker.properties ------
monitor.properties ------
notifyadaper ------
notifySlave.properties ------
sample.server.ini ------
samsa_master.properties ------
server.ini ------ 主配置文件 可以配置端口等
timetunnel.properties ------
zk.properties ------ zk 配置
lib ------
logs ------ 生成日志的目录
meta-monitor.log ------ 监控日志
metaServer.log ------ 消息中间件运行时日志
provided ------ 【不可用】
README ------ 使用说明
执行以下命令:
./metaServer.sh
看到详细使用说明:
1.1 开始启动metaq
使用如下命令启动:
./metaServer.sh start
看到如下表示启动成功:
[INFO] [main] 08-04 16:31:32,223 [MetaMorphosisBroker] - Starting metamorphosis server...
[INFO] [main] 08-04 16:31:32,232 [MetaMorphosisBroker] - Start metamorphosis server successfully
[INFO] [main] 08-04 16:31:34,820 [Server] - Starting dashboard http server at port 9199
[INFO] [main] 08-04 16:31:34,829 [Server] - jetty-7.6.1.v20120215
[INFO] [main] 08-04 16:31:34,855 [AbstractConnector] - Started SelectChannelConnector@0.0.0.0:9199
[INFO] [main] 08-04 16:31:34,856 [Server] - Started dashboard http server successfully.
1.2 启动成功
启动成功后运行效果图 开始你的metaq之旅吧。
2. metaq客户端引入使用
2.1 客户端引入类库
客户端程序需要引入metaq的客户端jar通过如下pom引入:
<properties>
<metamorphosis_client>1.4.6.2</metamorphosis_client>
</properties>
<dependency>
<groupId>com.taobao.metamorphosis</groupId>
<artifactId>metamorphosis-client</artifactId>
<version>${metamorphosis_client}</version>
</dependency>
<dependency>
<groupId>com.taobao.metamorphosis</groupId>
<artifactId>metamorphosis-client-extension</artifactId>
<version>${metamorphosis_client}</version>
</dependency>
<dependency>
<groupId>com.taobao.metamorphosis</groupId>
<artifactId>metamorphosis-storm-spout</artifactId>
<version>${metamorphosis_client}</version>
</dependency>
2.2 结合spring配置文件配置
2.2.1 创建meta.properties文件
文件内容如下:
# Topics section
meta.topic=test
meta.topic.group=sys-mc-group-1
meta.topic.maxBufferSize=16384
#zookeeper config
zk.zkConnect=192.168.1.131:2181
zk.zkSessionTimeoutMs=30000
zk.zkConnectionTimeoutMs=30000
zk.zkSyncTimeMs=5000
2.2.2 创建metaq spring的配置文件
需要分别创建两个文件: spring-metaq-common.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<!-- 配置文件读取配置 -->
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="order" value="2" />
<property name="ignoreUnresolvablePlaceholders" value="true" />
<property name="locations">
<list>
<value>classpath:metaq/meta.properties</value>
</list>
</property>
</bean>
<!-- message session factory -->
<bean id="messageSessionFactory" class="com.taobao.metamorphosis.client.extension.spring.MetaqMessageSessionFactoryBean">
<property name="zkConnect" value="${zk.zkConnect}"/>
<property name="zkSessionTimeoutMs" value="${zk.zkSessionTimeoutMs}"/>
<property name="zkConnectionTimeoutMs" value="${zk.zkConnectionTimeoutMs}"/>
<property name="zkSyncTimeMs" value="${zk.zkSyncTimeMs}"/>
</bean>
<!-- message body converter using java serialization. -->
<bean id="messageBodyConverter"
class="com.taobao.metamorphosis.client.extension.spring.JavaSerializationMessageBodyConverter"/>
<!-- template to send messages. -->
<bean id ="metaqTemplate" class="com.taobao.metamorphosis.client.extension.spring.MetaqTemplate">
<property name="messageSessionFactory" ref="messageSessionFactory"/>
<property name="messageBodyConverter" ref="messageBodyConverter"/>
</bean>
</beans>
spring-metaq-server.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<!-- topics to be subscribed. -->
<bean id = "metaMcTopic" class="com.taobao.metamorphosis.client.extension.spring.MetaqTopic">
<!-- consumer group -->
<property name="group" value="${meta.topic.group}"/>
<!-- topic -->
<property name="topic" value="${meta.topic}"/>
<!-- max buffer size to fetch messages -->
<property name="maxBufferSize" value="${meta.topic.maxBufferSize}"/>
</bean>
<!-- 服务端 配置项 -->
<bean id= "metaMcListener" class="com.huaying.sys.mc.listener.SysMessageListener">
<!-- threads to process these messages. -->
<property name="processThreads" value="10"/>
</bean>
<!-- listener container to subscribe topics -->
<bean id ="listenerContainer"
class="com.taobao.metamorphosis.client.extension.spring.MessageListenerContainer">
<property name="messageSessionFactory" ref="messageSessionFactory"/>
<property name="messageBodyConverter" ref="messageBodyConverter"/>
<property name="subscribers">
<map>
<entry key-ref="metaMcTopic" value-ref="metaMcListener"/>
</map>
</property>
</bean>
</beans>
####2.2.3 定义生产者和消费者 SysMessageListener类消费消息简单如下:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.taobao.metamorphosis.Message;
import com.taobao.metamorphosis.client.extension.spring.DefaultMessageListener;
import com.taobao.metamorphosis.client.extension.spring.MetaqMessage;
/**
*
* <P>
* File name : SysMessageListener.java
* </P>
* <P>
* Author : zhangyq
* </P>
* <P>
* Date : 2015年8月10日下午4:11:12
* </P>
* <P>
* Desc : 监听程序 类似消费者
* </P>
* <P>
* Update History :
* <ul>
* <li></li>
* <li></li>
* </ul>
* </P>
*/
// @Component
public class SysMessageListener extends DefaultMessageListener<String> {
private Logger LOG = LoggerFactory.getLogger(this.getClass());
@SuppressWarnings("unchecked")
@Override
public void onReceiveMessages(MetaqMessage<String> msg) {
String body = msg.getBody();
Message message = msg.getRawMessage();
LOG.info("消息ID:{},消息topic:{},消息Partition:{},消息attribute:{},消息内容为:{}", new Object[] { message.getId(),
message.getTopic(), message.getPartition(), message.getAttribute(), body });
}
}
生产消息的类:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import com.taobao.metamorphosis.client.extension.spring.MessageBuilder;
import com.taobao.metamorphosis.client.extension.spring.MetaqTemplate;
import com.taobao.metamorphosis.client.extension.spring.MetaqTopic;
import com.taobao.metamorphosis.client.producer.SendResult;
/**
* <P>File name : MessageCenterSOAService.java </P>
* <P>Author : zhangyq </P>
* <P>Date : 2016年8月4日下午4:50:31 </P>
* <P>Desc : 发送消息的类</P>
* <P>Update History : <ul>
* <li></li>
* <li></li>
* </ul>
* </P>
*/
public class MessageCenterSOAService {
private Logger LOG = LoggerFactory.getLogger(this.getClass());
@Autowired
private MetaqTemplate metaqTemplate;
@Autowired
@Qualifier("metaMcTopic")
private MetaqTopic metaMcTopic;
// @Override
public String productionMessage(String jsonMessage) {
// send message
SendResult sendResult = null;
try {
sendResult = metaqTemplate.send(
MessageBuilder.withTopic(metaMcTopic.getTopic()).withAttribute("sys").withBody(jsonMessage)
);
if (sendResult.isSuccess()) {
LOG.info("发送成功!");
}else{
LOG.error("发送消息失败:"+sendResult.getErrorMessage());
}
} catch (InterruptedException e) {
}
return sendResult.toString();
}
}
调用生产者类生产一条消息试试吧。 通过查看你的消息消费情况:
3. metaq使用总结
更多特性请参考:Java-Client-Guide