2015-10-01 4 views
2

Я пытаюсь использовать cl-rabbit для связи с брокером RabbitMQ из процесса Lisp, выполняющегося внутри контейнера Docker. У меня есть код, который работает, когда я запускаю его за пределами контейнера докеров, поэтому проблема связана либо с ОС, либо с Docker. (Он работает на Mac OS X вне контейнера, но Ubuntu 14.04 внутри контейнера.)Отправка сообщений на кролик mq с использованием lisp внутри контейнера докера

Когда я запускаю систему с помощью docker-compose up, я вижу вывод, что брокер сообщений успешно запущен. Сюсюкать клиент дает этот вывод:

sbcl-rabbit_1 | This is SBCL 1.2.15, an implementation of ANSI Common Lisp. 
sbcl-rabbit_1 | More information about SBCL is available at <http://www.sbcl.org/>. 
sbcl-rabbit_1 | 
sbcl-rabbit_1 | SBCL is free software, provided as is, with absolutely no warranty. 
sbcl-rabbit_1 | It is mostly in the public domain; some portions are provided under 
sbcl-rabbit_1 | BSD-style licenses. See the CREDITS and COPYING files in the 
sbcl-rabbit_1 | distribution for more information. 
sbcl-rabbit_1 | Created connection #<CL-RABBIT::CONNECTION {10047054F3}> 
sbcl-rabbit_1 | Created socket #.(SB-SYS:INT-SAP #X00651650) 
sbcl-rabbit_1 | Opened socket #.(SB-SYS:INT-SAP #X00651650) 
sbcl-rabbit_1 | CORRUPTION WARNING in SBCL pid 10(tid 140737354065728): 
sbcl-rabbit_1 | Memory fault at 0x7ffff266ce10 (pc=0x7ffff2c957c2, sp=0x7ffff309f3d0) 
sbcl-rabbit_1 | The integrity of this image is possibly compromised. 
sbcl-rabbit_1 | Continuing with fingers crossed. 
sbcl-rabbit_1 | Unhandled SB-SYS:MEMORY-FAULT-ERROR in thread #<SB-THREAD:THREAD 
sbcl-rabbit_1 |             "main thread" RUNNING 
sbcl-rabbit_1 |             {1003FAF093}>: 
sbcl-rabbit_1 | Unhandled memory fault at #x7FFFF266CE10. 
sbcl-rabbit_1 | 
sbcl-rabbit_1 | Backtrace for: #<SB-THREAD:THREAD "main thread" RUNNING {1003FAF093}> 
sbcl-rabbit_1 | 0: ((LAMBDA NIL :IN SB-DEBUG::FUNCALL-WITH-DEBUG-IO-SYNTAX)) 
sbcl-rabbit_1 | 1: (SB-IMPL::CALL-WITH-SANE-IO-SYNTAX #<CLOSURE (LAMBDA NIL :IN SB-DEBUG::FUNCALL-WITH-DEBUG-IO-SYNTAX) {10047B016B}>) 
sbcl-rabbit_1 | 2: (SB-IMPL::%WITH-STANDARD-IO-SYNTAX #<CLOSURE (LAMBDA NIL :IN SB-DEBUG::FUNCALL-WITH-DEBUG-IO-SYNTAX) {10047B013B}>) 
sbcl-rabbit_1 | 3: (PRINT-BACKTRACE :STREAM #<SYNONYM-STREAM :SYMBOL SB-SYS:*STDERR* {1000164243}> :START 0 :FROM :INTERRUPTED-FRAME :COUNT NIL :PRINT-THREAD T :PRINT-FRAME-SOURCE NIL :METHOD-FRAME-STYLE NIL) 
sbcl-rabbit_1 | 4: (SB-DEBUG::DEBUGGER-DISABLED-HOOK #<SB-SYS:MEMORY-FAULT-ERROR {10047ACE93}> #<unavailable argument>) 
sbcl-rabbit_1 | 5: (SB-DEBUG::RUN-HOOK *INVOKE-DEBUGGER-HOOK* #<SB-SYS:MEMORY-FAULT-ERROR {10047ACE93}>) 
sbcl-rabbit_1 | 6: (INVOKE-DEBUGGER #<SB-SYS:MEMORY-FAULT-ERROR {10047ACE93}>) 
sbcl-rabbit_1 | 7: (ERROR SB-SYS:MEMORY-FAULT-ERROR :ADDRESS 140737260211728) 
sbcl-rabbit_1 | 8: (SB-SYS:MEMORY-FAULT-ERROR) 
sbcl-rabbit_1 | 9: ("foreign function: call_into_lisp") 
sbcl-rabbit_1 | 10: ("foreign function: post_signal_tramp") 
sbcl-rabbit_1 | 11: (CFFI::PREPARE-FUNCTION "amqp_login_with_properties" (:STRUCT CL-RABBIT::AMQP-RPC-REPLY-T) (:POINTER :POINTER :INT :INT :INT :POINTER :INT :POINTER :POINTER) :DEFAULT-ABI) 
sbcl-rabbit_1 | 12: (CL-RABBIT::AMQP-LOGIN-SASL-PLAIN-WITH-PROPERTIES #.(SB-SYS:INT-SAP #X00641500) "/" 0 131072 0 #.(SB-SYS:INT-SAP #X7FFFF329FFE8) 0 "guest" "guest") 
sbcl-rabbit_1 | 13: ((LABELS #:FN274 :IN CL-RABBIT:LOGIN-SASL-PLAIN) (CL-RABBIT::NUM-ENTRIES 2 CL-RABBIT::ENTRIES #.(SB-SYS:INT-SAP #X00651840))) 
sbcl-rabbit_1 | 14: (CL-RABBIT::CALL-WITH-AMQP-TABLE #<CLOSURE (LABELS #:FN274 :IN CL-RABBIT:LOGIN-SASL-PLAIN) {100470785B}> (("product" . "cl-rabbit") ("version" . "0.1"))) 
sbcl-rabbit_1 | 15: (CL-RABBIT.EXAMPLES::TROY-TEST) 
sbcl-rabbit_1 | 16: (SB-INT:SIMPLE-EVAL-IN-LEXENV (CL-RABBIT.EXAMPLES::TROY-TEST) #<NULL-LEXENV>) 
sbcl-rabbit_1 | 17: (EVAL (CL-RABBIT.EXAMPLES::TROY-TEST)) 
sbcl-rabbit_1 | 18: (SB-IMPL::PROCESS-EVAL/LOAD-OPTIONS ((:LOAD . "examples.lisp") (:EVAL . "(sleep 3)") (:EVAL . "(cl-rabbit.examples::troy-test)") (:QUIT))) 
sbcl-rabbit_1 | 19: (SB-IMPL::TOPLEVEL-INIT) 
sbcl-rabbit_1 | 20: ((FLET #:WITHOUT-INTERRUPTS-BODY-83 :IN SAVE-LISP-AND-DIE)) 
sbcl-rabbit_1 | 21: ((LABELS SB-IMPL::RESTART-LISP :IN SAVE-LISP-AND-DIE)) 
sbcl-rabbit_1 | 
sbcl-rabbit_1 | unhandled condition in --disable-debugger mode, quitting 

трассировки стека, кажется, указывает что-то вроде плохой ссылки указатель внутри кода RabbitMQ-C.

Для построения Docker изображения, используемые этот файл, чтобы создать SBCL изображение:

FROM ubuntu:14.04 

# Install things needed to get and install sbcl and quicklisp 
RUN apt-get -y update && apt-get install -y wget make pkg-config gcc libffi-dev 
# Install sbcl 
RUN cd /usr/local && \ 
    wget http://prdownloads.sourceforge.net/sbcl/sbcl-1.2.15-x86-64-linux-binary.tar.bz2 && \ 
    tar xf sbcl-1.2.15-x86-64-linux-binary.tar.bz2 && \ 
    cd sbcl-1.2.15-x86-64-linux && \ 
    ./install.sh 
# Install quicklisp 
RUN wget https://beta.quicklisp.org/quicklisp.lisp && \ 
    yes "" | sbcl --load quicklisp.lisp \ 
        --eval '(quicklisp-quickstart:install)' \ 
        --eval '(ql:quickload "vecto")' \ 
        --eval '(ql:add-to-init-file)'\ 
        --non-interactive 

# Mount workspace 
WORKDIR /app 

# Run sbcl 
CMD sbcl 

То есть строить с docker build -f Dockerfile-sbcl -t sbcl. Затем у меня есть второй файл докеров для создания изображения с cl-кроликом.

# SBCL with cl-rabbit installed 
FROM sbcl 

RUN apt-get update -y && apt-get install -y librabbitmq-dev 

ENV SBCL_CORE_DIR=/sbcl 


RUN mkdir -p $SBCL_CORE_DIR 
RUN sbcl --eval '(ql:quickload :cl-rabbit)' \ 
     --eval '(sb-ext:save-lisp-and-die "/'${SBCL_CORE_DIR}'/sbcl-rabbit.core")' 

RUN echo Saved core in $SBCL_CORE_DIR 
RUN ls -l $SBCL_CORE_DIR 

CMD sbcl --core $SBCL_CORE_DIR/sbcl-rabbit.core \ 
    --non-interactive       \ 
    --load examples.lisp      \ 
    --eval '(sleep 3)'       \ 
    --eval '(cl-rabbit.examples::troy-test)' 

#CMD ls -l 
# EOF 

Это построен с использованием docker-compose build с этим Докер-compose.yml.

sbcl-rabbit: 
    build: . 
    dockerfile: Dockerfile-sbcl-rabbitmq 
    volumes: 
    - ../../path/to/lisp://app 
    links: 
    - msgbroker 


msgbroker: 
    image: rabbitmq 
    ports: 
    - "5672:5672" 

Когда я бегу это с docker-compose up, я получаю выход, описанный выше.

Examples.lisp является следующее:

(require 'cl-rabbit) 
(in-package :cl-rabbit.examples) 

(defvar msgbroker "msgbroker") 
;;(setq msgbroker "localhost") 

(defun troy-test() 
    (with-connection (conn) 
    (format t "Created connection ~s~%" conn) 
    (let ((socket (tcp-socket-new conn)) 
      (channel 1)) 
     (format t "Created socket ~s~%" socket) 
     (socket-open socket msgbroker 5672) 
     (format t "Opened socket ~s~%" socket) 
     (login-sasl-plain conn "/" "guest" "guest") 
     (format t "logged in ~s~%" conn) 
     (channel-open conn channel) 
     (format t "Openned channel ~s~%" conn) 
     (queue-declare conn channel 
        :queue "lisp-queue" 
        :durable t) 
     (exchange-declare conn channel "lisp-exchange" "direct" 
         :durable t) 
     (queue-bind conn channel 
        :queue "lisp-queue" 
        :routing-key "lisp-queue" 
        :exchange "lisp-exchange") 
     (print "Bound queue") 
     (basic-publish conn channel 
        :exchange "lisp-exchange" 
        :routing-key "lisp-queue" 
        :body "Message from lisp") 
     (print "Pubished"); 
     (basic-consume conn channel "lisp-queue") 
     (print "Received") 
     (let* ((result (consume-message conn)) 
      (message (envelope/message result)) 
      (formatted (format t "Got message: ~s~%content: ~s~%props: ~s" 
           result (babel:octets-to-string (message/body message) :encoding :utf-8) 
           (message/properties message)))) 
     (prin1 formatted) 
     (pprint formatted) 
     (cl-rabbit:basic-ack conn channel (envelope/delivery-tag result)))))) 

Основываясь на показаниях печати, проблема происходит в login-sasl-plain.

Я использовал docker run rabbit_sbcl-rabbit bash для запуска контейнера Docker с интерактивной оболочкой и проверял, используя telnet msgbroker 5672, что порт 5672 на хост-сервере msgbroker подключается к серверу MQ кролика. Если я ввожу текст в сеанс telnet, я вижу сообщение с сервера о том, что соединение AMQP было сделано.

Я не вижу подобного сообщения, когда клиент lisp пытается подключиться.

Используя аналогичную конфигурацию, я использовал клиент Java для отправки и получения сообщений, причем отправитель и получатель находятся в одном контейнере Docker, а сервер RabbitMQ - в другом, поскольку я пытаюсь здесь.

Любая идея, что пойдет не так, или дальнейшие предложения о том, что нужно делать, чтобы попытаться ее диагностировать?

+0

Возможно, стоит попробовать в обычной Ubuntu VM? Возможно, разверните бродячий экземпляр и попробуйте его там? Если вы получите ту же ошибку, это может сделать ее немного легче отладить. Если нет, ну ... Вы исключили полную неспособность запустить его на Linux, так или иначе, и, может быть, вы получите что-то еще полезное ... Вот, надеюсь. – lindes

+0

Обратите внимание, что гость: гостевой пользователь может подключаться только к localhost https://www.rabbitmq.com/access-control.html –

ответ

0

Эй, если у вас все еще есть проблемы, попробуйте построить sbcl со статически связанными librabbitmq и libffi.

Также вы можете найти мой проект полезным - https://github.com/cl-rabbit/cl-bunny/