阿里云实现amqp

在这里插入代码片<?php
namespace app\api\controller;

use library\Controller;
use Stomp\Client;
use Stomp\Exception\StompException;
use Stomp\Network\Observer\Exception\HeartbeatException;
use Stomp\Network\Observer\ServerAliveObserver;
use Stomp\StatefulStomp;
use Exception;
use think\Db;
use think\worker\Server;

class Subscribe extends Controller
{
//参数说明,请参见AMQP客户端接入说明文档。
public $accessKey = “”;
public $accessSecret = “”;
//消费组id 在对应实例的消息转发 > 服务端订阅 > 消费组列表查看您的消费组ID
public $consumerGroupId = “”;
public $clientId = “”;
//iotInstanceId:实例ID。
public $iotInstanceId = “”;
public $timeStamp = ‘’;
//签名方法:支持hmacmd5,hmacsha1和hmacsha256。
public $signMethod = “hmacsha1”;

public function initialize()
{
    $this->accessKey = sysconf('storage_oss_keyid');
    $this->accessSecret = sysconf('storage_oss_secret');
    $this->timeStamp = round(microtime(true) * 1000);
    $this->iotInstanceId = sysconf('storage_aliyun_iotInstanceId');
    $this->consumerGroupId = sysconf('storage_aliyun_consumerGroupId');
    $this->clientId = $this->uuid();
    $this->hostUrl = ""; //按阿里云文档拼接url
}
public function sub()
{
    $client  = $this->createClient();
    try {
        $client->connect();
    } catch (StompException $e) {
        echo "failed to connect to server, msg:" . $e->getMessage(), PHP_EOL;
    }
    //无异常时继续执行。
    $stomp = new StatefulStomp($client);
    //查询设备,根据设备拼装topic
    $stomp->subscribe("/topic/#");
    echo "connect success";
    while (true) {
        try {
            // 检查连接状态
            if (!$client->isConnected()) {
                echo "connection not exists, will reconnect after 10s.", PHP_EOL;
                sleep(10);
                //需要重新创建连接,官方给出的$client->connect()会报错
                $client  = $this->createClient();
                $stomp = new StatefulStomp($client);
                $stomp->subscribe("/topic/#");
                echo "connect success", PHP_EOL;
            }
            //处理消息业务逻辑。会监听到所有的topic,根据topic来处理数据
            $msg = $stomp->read();
            $headers = $msg->getHeaders();
            $readBody = $msg->getBody();
            $this->doBusiness($headers,$readBody);

        } catch (HeartbeatException $e) {
            echo 'The server failed to send us heartbeats within the defined interval.', PHP_EOL;
            $stomp->getClient()->disconnect();
        } catch (Exception $e) {
            echo 'process message occurs error: ' . $e->getMessage(), PHP_EOL;
            $stomp->getClient()->disconnect();
        }
    }
}





private function createClient()
{
    $userName = $this->clientId . "|authMode=aksign"
        . ",signMethod=" . $this->signMethod
        . ",timestamp=" . $this->timeStamp
        . ",authId=" . $this->accessKey
        . ",iotInstanceId=" . $this->iotInstanceId
        . ",consumerGroupId=" . $this->consumerGroupId
        . "|";
    $signContent = "authId=" . $this->accessKey . "&timestamp=" . $this->timeStamp;
    //计算签名,password组装方法,请参见AMQP客户端接入说明文档。
    $password = base64_encode(hash_hmac("sha1", $signContent, $this->accessSecret, $raw_output = TRUE));
    //接入域名,url请参见AMQP客户端接入说明文档。
    $client = new Client('ssl://url:61614');
    $sslContext = ['ssl' => ['verify_peer' => true, 'verify_peer_name' => false],];
    $client->getConnection()->setContext($sslContext);

    //服务端心跳监听。
    $observer = new ServerAliveObserver();
    $client->getConnection()->getObservers()->addObserver($observer);
    //心跳设置,需要云端每30s发送一次心跳包。
    $client->setHeartbeat(0, 30000);
    $client->setLogin($userName, $password);
    return $client;
}

public function  uuid()
{
    $chars = md5(uniqid(mt_rand(), true));
    $uuid = substr ( $chars, 0, 8 ) . '-'
        . substr ( $chars, 8, 4 ) . '-'
        . substr ( $chars, 12, 4 ) . '-'
        . substr ( $chars, 16, 4 ) . '-'
        . substr ( $chars, 20, 12 );
    return $uuid ;
}

}

可以使用阿里云提供的Java SDK来实现AMQP服务器建立长连接。以下是一个简单的示例: 1. 添加依赖 在pom.xml中添加以下依赖: ``` <dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-core</artifactId> <version>4.5.0</version> </dependency> <dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-amqp</artifactId> <version>1.0.0</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> ``` 2. 配置AMQP连接参数 在application.properties中配置AMQP连接参数: ``` spring.rabbitmq.host=amqp://xxxxx.mq-amqp.cn-shanghai-a.aliyuncs.com spring.rabbitmq.username=xxxxx spring.rabbitmq.password=xxxxx ``` 3. 编写AMQP客户端代码 在Spring Boot应用程序中,可以使用@RabbitListener注释来创建AMQP客户端。以下是一个简单的示例: ``` @Configuration @EnableRabbit public class AmqpConfig { @Bean public ConnectionFactory connectionFactory() { CachingConnectionFactory connectionFactory = new CachingConnectionFactory(); connectionFactory.setHost(environment.getProperty("spring.rabbitmq.host")); connectionFactory.setUsername(environment.getProperty("spring.rabbitmq.username")); connectionFactory.setPassword(environment.getProperty("spring.rabbitmq.password")); return connectionFactory; } @Bean public SimpleMessageListenerContainer messageListenerContainer(ConnectionFactory connectionFactory) { SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(); container.setConnectionFactory(connectionFactory); container.setQueueNames("amqp.queue.example"); container.setMessageListener(new MessageListenerAdapter(new AmqpMessageHandler())); return container; } public static class AmqpMessageHandler { // 处理接收到的消息 public void handleMessage(String message) { System.out.println("Received message: " + message); } } } ``` 在上面的代码中,我们定义了一个名为messageListenerContainer的消息监听器容器。该容器使用我们在步骤2中配置的连接工厂和队列名称。消息监听器是一个简单的处理程序,它将打印接收到的消息。 4. 启动应用程序 现在,我们可以启动应用程序并开始接收来自AMQP服务器消息。当应用程序启动时,它将建立一个长连接并开始监听队列。如果接收到新消息,它将调用我们在步骤3中定义的消息处理程序。 ``` @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值