2013-02-20 20 views
7

Pytanie brzmi: w jaki sposób pobrać numer portu, na którym nasłuchuje odtwarzanie, bez względu na sposób jego zdefiniowania (konfiguracja, argument linii poleceń lub w ogóle).Pobieranie numeru portu w aplikacji Play Framework 2 app

Ta odpowiedź Retrieving port number in-application using Play Framework musi być dla Play v1, ponieważ kod ten nie jest kompilowany.

In Play 2 Java jest:

Integer port = Play.application().configuration().getInt("http.port"); 

To nie zwraca rzeczywisty numer portu, przynajmniej nie we wszystkich przypadkach. Jeśli Play jest uruchamiany jako:

run 80 -Dhttp.address=example.com 

Następnie zwraca null.

Jeśli Play jest uruchamiany jako

run -Dhttp.port 80 -Dhttp.address=example.com 

następnie odtworzyć rozpoczyna się w porcie domyślnym (9000).

Jak biesior wskazał, że działa przez wymienienie port dwukrotnie:

play -Dhttp.port=80 "run 80" 

Co oczywiście nie jest optymalny, ponieważ jeden jest co Zagraj faktycznie korzysta, a drugi jest tym, co zgłasza.

Ale to by odpowiadało na moje pytanie dotyczące trybu dewelopera. Jednak, jak wynika z dokumentacji, Play nie powinien nigdy być uruchamiany przy użyciu run w prod. Więc jaki jest odpowiednik polecenia start i czy nie ma lepszego, bezpieczniejszego sposobu? (Jestem zainteresowany w wersji Java, ale inni mogą chcieć wiedzieć o Scala zbyt.)

+0

Po prostu uwaga ... Naprawdę nie powinno się uruchamiać Graj na porcie 80 (przynajmniej na Unixie). Ponieważ wymaga to uruchomienia gry jako root i nie jest to bezpieczne. –

Odpowiedz

3

Uruchamianie w trybie dev trzeba użyć podwoiła notacji

play -Dhttp.port=80 "run 80" 

Niestety trzeba zrobić to samo dla domyślnie Port

play -Dhttp.port=9000 "run 9000" 

Więc po prostu proponuję napisać skrypt (lub .bat w Windows) dla łatwego rozruchu ze wszystkimi wymaganymi params.

+1

W produkcji, używając komendy 'start' (bez argumentów), otrzymuję' null' zamiast rzeczywistego '9000'. –

0

Używam tego fragmentu Scala, aby określić port odsłuchiwania Play. Niestety musiałem mocno zakodować niektóre domyślne wartości, na wypadek gdyby nie podano parametru -Dhttp.port=....

val listenPort = 
    if (!Play.isTest) { 
    System.getProperty("http.port", "9000") 
    } 
    else { 
    // Not on classpath: play.api.test.Helpers.testServerPort 
    // Instead, duplicate its implementation here: 
    System.getProperty("testserver.port", "19001") 
    } 

Zastanawiam się również, czy nie ma lepszego sposobu, np. Play.port ale nie znalazłem niczego - no chyba że za pytanie :-)

(W przykładzie powinno być -Dhttp.port=80 nie -Dhttp.port 80).

0

Właśnie znalazłem sposób, aby dostać się z portu bez względu na to w jaki sposób port jest określony. Użyj odwrotnej trasy, aby uzyskać obiekt Call, a następnie użyj metody absoluteUrl(), aby uzyskać bezwzględny URL akcji, która zawiera port. Fragment kodu:

public class RouteController extends Controller { 
public Promise<Result> getPortAction() { 
    Call call = com.mycom.routes.RouteController.getPortAction(); 
    String absoluteUrl = call.absoluteURL(request()); 
    //Here absoluteUrl would be like http://localhost:9002/...., 9002 would be the port. 
    ... 
} } 
+1

Poprawię twoją odpowiedź, jeśli uda ci się udoskonalić tę próbkę kodu. Jak sugerujesz, najlepiej _nie_ do przesłuchania konfiguracji. podczas szukania numeru portu. W zasadzie twoja jest idealną odpowiedzią, ale nie mogłem jej uruchomić. –

+0

Nie pomaga to w ogóle, ponieważ metoda "absoluteURL()" oblicza tylko lokalną sekcję ścieżki URI. Serwer i port są pomijane lub ustawiane niezależnie od parametrów "absoluteURL()". –