kaizen23

kaizen23

Two function in one time

Hi everyone.This is my first post.I’m sorry for newby question but I have problem with invoke two function in one time.I was created client for RabbitMQ. While I was starting this script sequence of execute function depends on which function is implementation first in method START.Talking about features listen_for_messages(channel, queue_data.queue) and wait_for_message(user, channel).I want to both features “listen” in one time.Function wait_for_message it’s responsible for text which user write while listen_for_messages it’s responsible for recieve messages from another client. Please give me any suggestion because i have no idea how solve this problem.This is my CODE:

defmodule ElixirChat do

  def start do
    user = IO.gets("Type in your name: ") |> String.strip
    IO.puts "Hi #{user}, you just joined a chat room! Type your message in and press enter."

    {:ok, conn} = AMQP.Connection.open
    {:ok, channel} = AMQP.Channel.open(conn)
    {:ok, queue_data } = AMQP.Queue.declare(channel, "")

    AMQP.Exchange.fanout(channel, "super.chat")
    AMQP.Queue.bind(channel, queue_data.queue, "super.chat")

		**listen_for_messages(channel, queue_data.queue)**
**		wait_for_message(user, channel)**


		
    
  end
  
  def display_message(user, message) do
    IO.puts "#{user}: #{message}"
  end

  def wait_for_message(user, channel) do
     message = IO.gets("") |> String.strip
     publish_message(user, message, channel)
     wait_for_message(user, channel)
  end

  def listen_for_messages(channel, queue_name) do
	  AMQP.Basic.consume(channel,queue_name,nil,no_ack: true)
  	
  	receive do
  		{:basic_deliver, payload, _meta}->
  		{status, list} = JSON.decode(payload)
		  display_message(list["user"], list["message"])
		  listen_for_messages(channel, queue_name) 
    end	


		
  end

  def publish_message(user, message, channel) do
    { :ok, data } = JSON.encode([user: user, message: message])
    AMQP.Basic.publish channel, "super.chat", "", data
  end

end

ElixirChat.start

Most Liked

OvermindDL1

OvermindDL1

Yeah I’d spool it up in a new Task, which is a simple wrapper around spawn with convenience methods (and can be fit into OTP supervisors, but ignore that part for now)> :slight_smile:

kaizen23

kaizen23

Hi.@mbuhot.Many thanks for help. This is saved me a lot of time.I didn’t think that could be so simple.It’s WORKING:)

mbuhot

mbuhot

Try running the listen_for_messages function in another process using spawn: http://elixir-lang.org/getting-started/processes.html#spawn

Where Next?

Popular in Questions Top

jononomo
For some reason my phoenix channels are working for me in my local dev environment, but as soon as I deploy via Docker, I get a 403 error...
New
lastday4you
I wanted to check elixir version in phoenix because i found that my elixir is 1.5 but when i use Enum.chunk_by it said the function is un...
New
mcarvalho
What is the difference between System.get_env and Application.get_env? For example, what are best practices to use one versus another.
New
openscript
Hello! Sorry for this astonishing simple question, but I’m really stuck. I try to set up the intellij-elixir plugin, but I don’t know ho...
New
stefanchrobot
What’s the safe way to decode a JSON string into a struct? I want to avoid calling String.to_atom. Jason.decode can give me a map with st...
New
pmjoe
I have a relationship of love and hate with Elixir. Lots of things are just absolutely right, but there are some things that are kind of ...
New
Harrisonl
We have an ECS cluster with 4 services, where each task joins a single cluster, via discovery ECS discovery service. Currently when I de...
New

Other popular topics Top

nobody
Hi! In PHP: $_SERVER[‘SERVER_ADDR’] - in Elixir? Searched the docs for ip address and the web, no good results. Thanks!
New
minhajuddin
I have seen a lot of code which picks the first element from a list using Enum.at(0) instead of List.first. Is there a reason why people ...
New
Qqwy
Original source of discussion: This topic on the Pragmatic Programmers’ Functional Web Development with Elixir, OTP, and Phoenix forum. ...
New
Brian
What is the proper way to load a module from a file in to IEX? In the python world, doing something like this pretty standard: from ....
New
msaraiva
Surface is an experimental library built on top of Phoenix LiveView and its new LiveComponent API that aims to provide a more declarative...
564 44167 214
New
senggen
Erlang/OTP 25 [erts-13.2.2] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] 15:22:35.803 [error] gen_event {lager_file_backend...
New

We're in Beta

About us Mission Statement