Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

1
resposta

Meu código não está funcionando

Não consegui identificar o problema, meu arquivo não está sendo criado nem escrito. E analisando o código não encontrei nenhum erro.
Minha aplicação:

defmodule AluraProject.Application do
use Application

def start(_type, _args) do
children = [
AluraProject.Servidor,
AluraProject.Scheduler
]

opts = [
  strategy: :one_for_one,
  name: AluraProject.Supervisor
]

Supervisor.start_link(children, opts)

end
end

defmodule AluraProject.Agendador do

def escrever_numero_aleatorio() do
IO.puts("Está função foi chamada...")
numero_aleatorio = Enum.random(1..1000)
File.write("arquivo.txt", "Número: #{numero_aleatorio}")
IO.puts("Número adicionado com sucesso!..")
end
end

defmodule AluraProject.Scheduler do
use Quantum, otp_app: :alura_project
end

use Mix.Config

config :alura_project, AluraProject.Scheduler,
jobs: [

{"* * * * *", fn ->
IO.puts("Entrou no arquivo config...")
GenServer.cast(:servidor, :escreve)
end}

]

defmodule AluraProject.Servidor do
use GenServer

def start_link(_opts) do
GenServer.start_link(MODULE, :ok, name: :servidor)

end

def init(:ok) do
{:ok, %{}}
end

def handle_cast(:escreve, _) do
AluraProject.Agendador.escrever_numero_aleatorio()
{:noreply, %{}}
end

end

poderiam me ajudar?

1 resposta

Oi, Guilherme! Como vai?

Com o que você descreveu, o código está bem próximo do esperado, mas existem alguns pontos importantes que podem impedir a criação e escrita do arquivo.

1. Verifique o start_link/1 do GenServer: no método start_link/1 existe um detalhe que impede o GenServer de iniciar corretamente:


GenServer.start_link(__MODULE__, :ok, name: :servidor)

O que esse código faz:
Inicia o GenServer e registra o processo com o nome :servidor, permitindo que ele seja encontrado pelo GenServer.cast/2.


2. Confira se o Scheduler está sendo iniciado: como existe o IO.puts("Entrou no arquivo config..."), verifique se essa mensagem aparece no terminal.

  • Se não aparecer, o Quantum pode não estar sendo iniciado.
  • Se aparecer, o Scheduler está funcionando e o problema está na chamada seguinte.

3. Verifique o retorno do File.write/2: em vez de apenas chamar a função, capture o retorno para identificar possíveis erros.

Veja este exemplo:


case File.write("arquivo.txt", "Numero: #{numero_aleatorio}") do
  :ok ->
    IO.puts("Arquivo criado com sucesso!")

  {:error, motivo} ->
    IO.inspect(motivo)
end

O que esse código faz:
Tenta gravar o arquivo e informa se a operação foi realizada com sucesso ou qual erro ocorreu.


4. Confira onde o arquivo está sendo criado: o arquivo será criado no diretório onde a aplicação está sendo executada. Você pode verificar esse caminho executando:


IO.inspect(File.cwd())

O que esse código faz: exibe o diretório atual da aplicação, mostrando exatamente onde o arquivo.txt será criado.


Se, após esses testes, o problema continuar, compartilhe também:

  • a estrutura do projeto;
  • o arquivo config/config.exs;
  • a saída completa do terminal ao executar a aplicação.

Essas informações ajudam a identificar o ponto exato do problema.

Caso este post tenha lhe ajudado, por favor, marcar como solucionado