windows下php使用activemq传递消息java接受(最简单queue)demo

3 篇文章 0 订阅
3 篇文章 0 订阅

       一个菜鸟的自我救赎,踩了不少坑。有些自己都没记。我先从安装弄起来吧,首先介绍环境,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类型的接受,其他的都是我测试。菜的抠脚还望见谅,希望给需要的人一点点小小的提示吧。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值