Azure 队列触发器不适用于 Java

Posted

技术标签:

【中文标题】Azure 队列触发器不适用于 Java【英文标题】:Azure Queue trigger not working with Java 【发布时间】:2021-03-10 00:18:07 【问题描述】:

我有一个 Spring Boot 应用程序,它将在 azure Queue 上发布消息。我还有一个用 Java 编写的 azure queueTrigger 函数,它将侦听 Spring Boot 应用程序已向其发布消息的同一队列。 queueTrigger 函数无法检测到队列上发布的消息。

这是我的发布商代码

public static void addQueueMessage(String connectStr, String queueName, String message) 
    try 
            // Instantiate a QueueClient which will be
            // used to create and manipulate the queue
            QueueClient queueClient = new QueueClientBuilder()
                                        .connectionString(connectStr)
                                        .queueName(queueName)
                                        .buildClient();
    
            System.out.println("Adding message to the queue: " + message);
    
            // Add a message to the queue
            queueClient.sendMessage(message);
          catch (QueueStorageException e) 
            // Output the exception message and stack trace
            System.out.println(e.getMessage());
            e.printStackTrace();
        
 

这是我的 queueTrigger 函数应用代码

@FunctionName("queueprocessor")
public void run(
   @QueueTrigger(name = "message",
                  queueName = "queuetest",
                  connection = "AzureWebJobsStorage") String message,
    final ExecutionContext context
) 
    context.getLogger().info(message);

我正在传递相同的连接字符串和队列名称,但仍然无法正常工作。如果我在本地机器上运行函数,那么它会被触发但出现错误 error image

【问题讨论】:

【参考方案1】:

正如official doc 建议的那样,

函数需要一个 base64 编码的字符串。对编码类型的任何调整(为了将数据准备为 base64 编码字符串)都需要在调用服务中实现。

更新发件人代码以发送 base64 编码消息。

String encodedMsg = Base64.getEncoder().encodeToString(message.getBytes())
queueClient.sendMessage(encodedMsg);

【讨论】:

感谢它在本地 Windows 机器上工作,但是当我部署 queueTrigger 函数以使其不会被触发时 它可能不会被触发的唯一原因是 Azure 中的函数应用程序中的“应用程序设置”应该在函数代码中使用存储连接字符串。还要确保您在那里有队列,并且没有其他应用程序(如本地调试器)正在侦听相同的队列。 我检查了,连接良好,没有其他监听器,部署时仍然无法正常工作,但在本地机器上工作正常 您在 App Isights 日志中看到了什么? 我不确定 Isights 是如何工作的,因为我是 azure 平台的新手

以上是关于Azure 队列触发器不适用于 Java的主要内容,如果未能解决你的问题,请参考以下文章

用于文件共享的 Azure 触发功能

Azure Functions:如何在 Azure 存储队列的绑定表达式中使用 POCO?

Azure Functions 的 Azure 队列触发器:配置最小轮询间隔

Azure 函数队列触发器:如何设置出列消息的时间延迟

Azure 函数 - 挂起队列触发器

使用多个 Azure 队列触发单个 Azure 函数