因业务需要,本人在测试机上部署了一个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) {}}}
}