我在LocalStack服务器上有一个SQS队列,我想与Celery使用者一起使用来自它的消息。
它似乎表明使用者已正确连接到队列,例如队列sqs-test-queue
,但是当我尝试使用aws
命令发送消息时,它没有收到任何消息。
我的celeryconfig.py
如下:
from kombu import (
Exchange,
Queue
)
broker_transport_options = {'region': REGION}
broker_transport = 'sqs'
accept_content = ['application/json']
result_serializer = 'json'
content_encoding = 'utf-8'
task_serializer = 'json'
worker_enable_remote_control = False
worker_send_task_events = False
result_backend = None
task_queues = (
Queue('sqs-test-queue', exchange=Exchange(''), routing_key='sqs-test-queue'),
)
和我的tasks.py
模块如下:
from celery import Celery
from kombu.utils.url import quote
AWS_ACCESS_KEY = quote("AWS_ACCESS_KEY")
AWS_SECRET_KEY = quote("AWS_SECRET_KEY")
LOCALSTACK = "<IP>:<PORT>"
broker_url = "sqs://{access}:{secret}@{host}".format(access=AWS_ACCESS_KEY,
secret=AWS_SECRET_KEY,
host=LOCALSTACK)
app = Celery('tasks', broker=broker_url, backend=None)
app.config_from_object('celeryconfig')
@app.task(bind=True, name='tasks.consume', acks_late=True, ignore_result=True)
def consume(self, msg):
# DO SOMETHING WITH THE RECEIVED MESSAGE
return True
试图用celery -A tasks worker -l INFO -Q sqs-test-queue
执行它,并且一切正常:
...
[tasks]
. tasks.consume
[... INFO/MainProcess] Connected to sqs://AWS_ACCESS_KEY:**@<IP>:<PORT>//
[... INFO/MainProcess] celery@local ready
但是当我尝试使用aws sqs send-message --endpoint-url=http://<IP>:<PORT> --queue-url=http://localhost:<PORT>/queue/sqs-test-queue --message-body="Test message"
发送消息时,什么也没发生。
我在做什么错?我可能错过了配置中的某些内容吗?
PS::如果我尝试运行命令aws sqs receive-message --endpoint-url=http://<IP>:<PORT> --queue-url=http://localhost:<PORT>/queue/sqs-test-queue
,我将收到消息。
注意:
我正在使用Python 3.7.0
,而我的pip freeze
看起来像这样:
boto3==1.10.16
botocore==1.13.16
celery==4.3.0
kombu==4.6.6
pycurl==7.43.0.3
...
答案 0 :(得分:1)
我正在经历与你相同的事情。要解决此问题,我做了几件事:
gridApi.getSelectedNodes()
和HOSTNAME_EXTERNAL
env变量HOSTNAME
设置为broker_url
sqs://{access}:{secret}@{host}:{port}
不包括配置项:broker_transport_options
,因为这会导致2020年2月7日(check issue here)的本地堆栈错误。一旦我做了这两件事,它就会开始起作用,希望对您有所帮助。
答案 1 :(得分:0)
Celery不能向任何消息队列系统发布或使用任意消息。为此使用kombu-这也是Celery在幕后使用的方式。