Activemq 使用Stomp方式接收、过滤 topic 数据

因业务需要,本人在测试机上部署了一个activemq。突然奇想 要用 Stomp方式请求 TOPIC 数据。

打开activemq stomp 文档,发现内容十分的节省啊,不过还好给了两个demo.

官方文档http://activemq.apache.org/stomp.html


1.安装好 activiemq

2.向topic中传入数据 , 你可以使用 tcp方式,或者stomp,这个没要求。

3.使用stomp访问、过滤数据


4. 要想 支持过滤, 在对象进行序列化 发送前, 要进行 messageProperty 设置。序列化 贴出一点代码:

@Override
	public Message toMessage(Object object, Session session)
			throws JMSException, MessageConversionException {
		Kaas kaas = (Kaas ) object;
		Map<String, Object> map = kaasFormat.toMap(kaas);
		byte[] data = ObjectAmfUtil.objectToAmf3Bytes(map);
		BytesMessage message = session.createBytesMessage();
		message.writeBytes(data);
		kaasFormat.messageProperty(message, kaasEvent);
		return message;
	}


	public void messageProperty(Message message, Kaas kaas)
			throws JMSException {
		message.setLongProperty("record_id", kaas.getRecordId());
		message.setStringProperty("event_id", kaas.getEventId());
		message.setStringProperty("object_id", kaas.getObjectId());
		message.setIntProperty("ack_tag", kaas.getAckTag());
		message.setStringProperty("ack_user", kaas.getAckUser());
		message.setIntProperty("clear_tag", kaas.getClearTag());
                 ...........
        }



我这里因为 对象序列化使用了flex,所以,blazeds-core-3.2.0.3978.jar ,blazeds-common-3.2.0.3978.jar。

activemq-protobuf-1.1.jar    activemq-core-5.6.0.jar  jms-1.1.jar    

     加上 <dependency>
            <groupId>com.thoughtworks.xstream</groupId>
            <artifactId>xstream</artifactId>
            <version>1.4.3</version>
        </dependency>


其他jar,缺类的话,你需要自己去 下载,   The Central Repository Search Engine  使用高级方式. 其中 有按 类名 查找的。

接收代码如下

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;

import org.apache.activemq.transport.stomp.Stomp.Headers.Subscribe;
import org.apache.activemq.transport.stomp.StompConnection;
import org.apache.activemq.transport.stomp.StompFrame;

import com.eastcom.intsight.fault.util.ObjectAmfUtil;

import flex.messaging.io.SerializationContext;
import flex.messaging.io.amf.Amf3Input;

public class StompReceiver {

	public static void main(String[] args) throws Exception {
		//
		String tx = "StompTransaction";
		StompConnection connection = new StompConnection();
		connection.open("10.221.213.85", 61614);  //stomp 默认端口是 61613,我这里改成 61614
		// connection.connect("system", "manager"); 
		connection.connect("", "");   // 测试说明, 用户名、密码传啥都行,估计mq默认无认证

		// add a consumer
		HashMap<String, String> filter = new HashMap<String, String>();
		filter.put("selector", "device_vendor = '华为'");      //<pre name="code" class="java"><pre name="code" class="java">selector 放过滤的sql , sql92 的语法规范,记住 字符串 要用 '' 
 // filter.put("priority","9"); 

connection.subscribe("/topic/fm.push.kaas", // topic 名称 其实是 fm.push.kaas,访问topic,要加 /topic ,队列的话,要加/queue
Subscribe.AckModeValues.CLIENT, filter);
for (int i = 0; i < Long.MAX_VALUE; i++) {
try {connection.begin(tx);StompFrame message = connection.receive(60 * 1000);// 60// 秒钟timeout
Map<String, Object> map = (Map<String, Object>) ObjectAmfUtil.afm3BytesToObject(message.getContent()); //反序列化, 方法是从jar包中捞出来的,呵呵
System.out.println(map);
} catch (Exception e) {
System.out.println(e.toString());
} finally {
connection.commit(tx);
}
Thread.sleep(500);
}connection.disconnect();
}

public static Object afm3BytesToObject(byte[] buf) {
Amf3Input amf3Input = new Amf3Input(SerializationContext.getSerializationContext());
InputStream inputStream = null;
try {
inputStream = new ByteArrayInputStream(buf);
amf3Input.setInputStream(inputStream);
Object obj = amf3Input.readObject();return obj;
} catch (Exception e) {throw new RuntimeException(e);
} finally {
try {amf3Input.close();
} catch (IOException e) {}
try {inputStream.close();
} catch (IOException e) {}}}
}
 








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值