一个菜鸟的自我救赎,踩了不少坑。有些自己都没记。我先从安装弄起来吧,首先介绍环境,windows下使用idea+phpstorm开发工具,重点不是这个就不介绍了,安装activemqwindows版本,去官网下载,根据你的jdk来安装我是jdk1.8的所以我安装5.14.0,
下载解压,进入bin----->win64----->点击activemq.bat。
出现这个页面表示ok了,接着可以去http://localhost:8161/admin,账号密码均为admin。
由于php传递消息还需要使用stomp,地址:官网下载,请根据你自己的php版本来选择下载安装windows下我使用的php是5.6所以我使用的1.0.9。windows记住下载dll,
将php_stomp.dll文件复制到php安装目录下中的ext的目录下。然后打开php.ini配置文件添加一行extension=php_stomp.dll,去phpinfo.php页面即可看到是否安装成功。
下面进入代码,下面是我的php页面,
<?php
$queue = '/queue/foo01=2';
try {
$stomp = new Stomp('tcp://127.0.0.1:61613');
$obj = new Stdclass();
$obj->id = '001';
$obj->name = 'test';
$obj->area = '上海';
$obj->age = '123';
$stomp->send($queue, json_encode($obj));
} catch (StompException $e) {
die('Connection failed: ' . $e->getMessage());
}
然后这是我的java消费者
package com.bhg.testActiveMQ;
import com.alibaba.fastjson.JSONObject;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.activemq.RedeliveryPolicy;
import javax.jms.*;
public class HelloQueueConsumer implements MessageListener {
@Override
public void onMessage(Message message) {
//如果消息是TextMessage
if (message instanceof TextMessage) {
//强制转换一下
TextMessage txtMsg = (TextMessage) message;
try {
//输出接收到的消息
System.out.println("HaHa: I'v got " + txtMsg.getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
// 如果是Map消息
if (message instanceof MapMessage) {
MapMessage mm = (MapMessage) message;
try {
System.out.println(" get textMessage:\t" + mm.getString("msgId"));
} catch (JMSException e) {
e.printStackTrace();
}
}
// 如果是Object消息
if (message instanceof ObjectMessage) {
ObjectMessage om = (ObjectMessage) message;
Student exampleUser = null;
try {
exampleUser = (Student) om.getObject();
} catch (JMSException e) {
e.printStackTrace();
}
System.out.println(" get ObjectMessage:\t" + exampleUser.getArea());
}
// 如果是bytes消息,读取php的消息转化为我要的数据
if (message instanceof BytesMessage) {
byte[] b = new byte[1024];
int len;
BytesMessage bm = (BytesMessage) message;
try {
while ((len = bm.readBytes(b)) != -1) {
System.out.println(new String(b, 0, len));
String obj01= new String(b, 0, len);
Student p1= JSONObject.parseObject(obj01, Student.class);
System.out.println("********");
System.out.println(p1.getAge());
}
} catch (JMSException e) {
e.printStackTrace();
}
}
// 如果是Stream消息
if (message instanceof StreamMessage) {
StreamMessage sm = (StreamMessage) message;
try {
System.out.println(sm.readString());
System.out.println(sm.readInt());
} catch (JMSException e) {
e.printStackTrace();
}
}
if (message instanceof ObjectMessage) {
ObjectMessage objectMessage = (ObjectMessage) message;
try {
Student stu = (Student) objectMessage.getObject();
System.out.println(stu.getAge());
} catch (JMSException e) {
System.out.println("出错了!");
e.printStackTrace();
}
}
}
public void receive() {
// 消费者的主要流程
Connection connection = null;
RedeliveryPolicy policy = null;
try {
// 1.初始化connection工厂
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory();
policy = new RedeliveryPolicy();
policy.setMaximumRedeliveries(1);
// 2.创建Connection
connection = connectionFactory.createConnection();
// 3.打开连接
connection.start();
// 4.创建session
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 5.创建消息目标
Destination destination = session.createQueue("foo01=2");
//6.创建消费者
MessageConsumer consumer = session.createConsumer(destination);
//7.配置监听
consumer.setMessageListener(this);
} catch (JMSException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new HelloQueueConsumer().receive();
}
}
项目是maven配置的,所以pom也给上一份吧,使用了阿里的fastjson。
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-core</artifactId>
<version>5.7.0</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
</dependencies>
说实话,原来php传递的obj类型是byte类型的我试了N久呀,弄的我头大。还好弄出来了。友情提示java代码不必看太多了你若需要只有头尾和byte类型的接受,其他的都是我测试。菜的抠脚还望见谅,希望给需要的人一点点小小的提示吧。