Erlang 服务器 SQS 实现

问题描述 投票:0回答:1

我想通过erlang的公共库erlcloud访问SQS服务。到目前为止我有以下内容:

`
    -module(server).
    -export([start/0, loop/1, handle_sqs_request/1]).

     start() ->
        application:set_env(erlcloud, aws_access_key_id,      os:getenv("AWS_ACCESS_KEY_ID")),
        application:set_env(erlcloud, aws_secret_access_key, os:getenv("AWS_SECRET_ACCESS_KEY")),
        application:set_env(erlcloud, aws_region, os:getenv("AWS_REGION")),
        application:ensure_all_started(erlcloud),
        spawn(fun() -> loop("queueurl") end).

    loop(QueueUrl) ->
        io:format("Fetching messages from queue: ~s~n", [QueueUrl]),
        handle_sqs_request(QueueUrl),
        timer:sleep(5000),  % Wait for 5 seconds before checking again
        loop(QueueUrl).

    handle_sqs_request(QueueUrl) ->
        io:format("Processing messages from queue: ~s~n", [QueueUrl]),
        Options = #{max_number_of_messages => 10},
        io:format("Options being passed: ~p~n", [Options]),
        case erlcloud_sqs:receive_message(QueueUrl, Options) of
             {ok, Messages} ->
                io:format("Raw messages received: ~p~n", [Messages]),
                lists:foreach(fun(Msg) ->
                    case maps:get(<<"receipt_handle">>, Msg, undefined) of
                        undefined -> 
                            io:format("No receipt handle found in message: ~p~n", [Msg]);
                        ReceiptHandle ->
                            io:format("Deleting message with receipt handle: ~s~n", [ReceiptHandle]),
                            erlcloud_sqs:delete_message(QueueUrl, ReceiptHandle)
                    end
                end, Messages),
                ok;
            {error, Reason} ->
                io:format("Error receiving messages: ~p~n", [Reason])
        end.
`

并且在 rebar3 shell 之后出现以下错误:


1> server:start().
Fetching messages from queue: queurl
<0.226.0>
Processing messages from queue: queuurl
Options being passed: #{max_number_of_messages => 10}
=ERROR REPORT==== 11-Dec-2024::17:07:24.378596 ===
Error in process <0.226.0> with exit value:
{function_clause,
    [{erlcloud_sqs,receive_message,
         ["queurul",
          #{max_number_of_messages => 10},
          1,none,none,
          [all],

this is my rebar.config
{erl_opts, [debug_info]}.
{deps, [
    {erlcloud, {git, "https://github.com/erlcloud/erlcloud.git", {branch, "master"}}}
]}.
{shell, [
    {apps, [appname]}
]}.

` aws 凭证正在从环境变量中正确加载,并与我的 aws 配置中的凭证相匹配,而且用户也拥有与 sqs 服务交互的正确权限。 queurl 是硬编码的,但在本示例中,出于安全目的,我将其切换为“queurl”。我使用的是最新版本的 erlcloud,但是我似乎与 erlcloud 集成的正确语法不匹配。

有人可以帮助我吗?谢谢!

我尝试来回更改所使用的handle_sqs_request的语法。

我尝试了旧版本的erlcloud,但也不匹配。在我的 CLI 中,我正确地从 SQS 发送和获取消息,因此问题肯定存在于代码中。

amazon-web-services server erlang cloud amazon-sqs
1个回答
0
投票

函数

erlcloud_sqs:receive_message
可以使用不同数量的参数来调用,从 1 到 7。 据我所知,如果您想指定最大消息数,则需要使用三参数消息。它需要以下参数:

  1. 队列名称
  2. 属性名称,列表或原子
    all
  3. 最大消息数,或
    aws_config
    记录

所以这可能有效:

erlcloud_sqs:receive_message(QueueUrl, all, 10)
© www.soinside.com 2019 - 2024. All rights reserved.