PDA

View Full Version : Analogo di WCF per Java


natasha
24-09-2009, 11:23
Buongiorno a tutti,
esiste una tecnologia di riferimento per la comunicazione fra sistemi, analoga alla WCF (Windows Communication Foundation) di .NET, per Java?

fero86
24-09-2009, 14:32
AHAHAHAHAHAH :rotfl: :sbonk:

in teoria ci sarebbe RMI :asd:

morskott
24-09-2009, 15:01
Pur non conoscendo (io) WCF, che te ridi?

RMI è un peletto più di teoria, e devo dire che è fatto veramente bene avendoci fatto qualche progetto, se invece che comunicazione punto punto serve qualcosa per il group multicast/membership c'è la libreria JGroups.

Con RMI ti crei l'interfaccia dell'oggetto remoto che estende una data interfacciapublic interface IMioOggetto extends Remote{
public void op1() throws RemoteException;
//eccetera, puoi usare tutti gli oggetti che implementino Serializable, che implementino Remote o tipi primitivi
}

il tuo oggetto che fa da "server"public class MioOggetto extends UnicastRemoteObject implements IMioOggetto{
public MioOggetto() throws RemoteException{
}

public void op1() throws RemoteException{
//le tue operazioni
}
}

avvii in una macchina il registry tramite un "LocateRegistry.createRegistry(666)" (ho messo come porta il 666) e pubblichi il tuo "server" sul registryRegistry reg=LocateRegistry.getRegistry("la macchina su cui sta il registry",666); //porta 666
reg.bind("NomeLogicoDelTuoOggetto",new MioOggetto());

e nella macchina client ti crei un'istanza dell'interfaccia tramiteRegistry reg=LocateRegistry.getRegistry("la macchina su cui sta il registry",666); //porta 666
IMioOggetto imo=reg.lookup("NomeLogicoDelTuoOggetto");
imo.op1(); //uso dell'oggetto

Mo non so WCF, ma mi pare abbastanza semplice e potente

Informarsi prima di parlare (ridere) please (non ho fatto alcun confronto tra WCF e RMI/JGroups non conoscendo WCF)

Caldwell83
24-09-2009, 15:05
Se ho capito cos'è WCF (e non ne sono affatto sicuro) potresti provare con CORBA.

PGI-Bis
24-09-2009, 15:13
Java EE.

tomminno
24-09-2009, 15:34
WCF è un'implementazione degli standard WS-*.
Un equivalente è JAX-WS

natasha
24-09-2009, 16:21
in teoria ci sarebbe RMI :asd:

Trovo più che appropriata la locuzione "in teoria" :D
Però, abbi pazienza, anche a me non risulta, ma al contempo reputo difficile che, a livello di Java EE o con altro framework JCP, nessuno abbia pensato ad una API che risolve gli stessi problemi affrontati (reputo intelligentemente, poi è chiaro che ognuno ha le sue opinioni) da WCF.

natasha
24-09-2009, 16:26
WCF è un'implementazione degli standard WS-*.
Un equivalente è JAX-WS

WCF è una tecnologia di comunicazione fra sistemi distribuiti che unifica la precedente (e piuttosto dispersiva) "offerta" Microsoft, e l'implementazione degli standard WS-* ne è UNA PARTE, così come CORBA (ormai passato di moda, temo...) è l'equivalente indipendente dal linguaggio (ma con molte implementazioni in Java) di UNA PARTE di WCF.
Comunque grazie per il suggerimento :)

natasha
24-09-2009, 16:27
Java EE.

Sono convinto che sia un'ottima risposta, ma siccome conosco abbastanza bene .NET, ma MOLTO meno Java EE, non so interpretarla :)

Kralizek
24-09-2009, 16:34
WCF é piú del singolo WS-*, CORBA o altro... e tutto insieme :)

lo stesso servizio puó essere esposto come web-service, remoter o essere pubblicato tramite XML o JSON in risposta a richieste REST ;)

PGI-Bis
24-09-2009, 16:47
Sono convinto che sia un'ottima risposta, ma siccome conosco abbastanza bene .NET, ma MOLTO meno Java EE, non so interpretarla :)

Java EE è una piattaforma per lo sviluppo di applicazioni distribuite. La distribuzione è realizzata attraverso l'astrazione del protocollo di comunicazione tra i moduli del sistema e la previsione di uno o più "nodi di distribuzione" - gli application server.

Un client può comunicare con un enterprise java bean che rappresenti un servizio via soap, via http, via rmi, via praticamente tutto.

WCF mi ricorda molto questo tipo di piattaforma di sviluppo, solo un po' più in piccolo.

natasha
24-09-2009, 17:13
Un client può comunicare con un enterprise java bean che rappresenti un servizio via soap, via http, via rmi, via praticamente tutto.

L'API parte delle specifiche EJB che consente tale versatilità di comunicazione ha un nome? :)

PGI-Bis
24-09-2009, 17:22
No. Ma trovi tutto nel capitolo sugli EJB nel meraviglioso manuale di Sun.

http://java.sun.com/javaee/5/docs/tutorial/doc/

[Edit] No, che io sappia. Ma io sappia solo le basi di Java EE.

fero86
24-09-2009, 18:53
Informarsi prima di parlare (ridere) please (non ho fatto alcun confronto tra WCF e RMI/JGroups non conoscendo WCF) per tua ammissione dovresti essere tu quello che si dovrebbe informare prima di parlare (scrivere) :)
premesso che ho lavorato piu volte con RMI avrei qualche domanda:

1) come reagisce un'applicazione basata su RMI se un client malizioso cerca di sopraffare le capacitá di handling del server? per esempio se un client effettua contemporaneamente 20 chiamate passando a ciascuna un array da 1 gigabyte, oppure se passa al server un input di dimensioni lineari in N laddove il server é costretto ad eseguire un algoritmo di complessitá esponenziale in N.

2) come si fa ad imporre restrizioni di sicurezza sulle chiamate che un client puó fare? inoltre devo implementarmi da solo il mio meccanismo di autenticazione?

3) piu in generale, come faccio ad identificare la connessione da cui proviene una certa chiamata? la documentazione del metodo RemoteServer.getClientHost() non assicura nulla sull'unicitá della stringa restituita, la quale dovrebbe essere usata piu che altro per motivi di logging immagino.

4) come faccio a fare chiamate asincrone?

PGI-Bis
24-09-2009, 19:06
Un intervento molto costruttivo.

fero86
24-09-2009, 19:08
Un intervento molto costruttivo. grazie, non pensavo che anche tu tenessi tanto a conoscere le limitazioni di RMI.

PGI-Bis
24-09-2009, 19:15
Se avessi un dubbio su RMI ti assicuro che non lo risolverei leggendo un forum.

tomminno
24-09-2009, 19:35
WCF è una tecnologia di comunicazione fra sistemi distribuiti che unifica la precedente (e piuttosto dispersiva) "offerta" Microsoft, e l'implementazione degli standard WS-* ne è UNA PARTE, così come CORBA (ormai passato di moda, temo...) è l'equivalente indipendente dal linguaggio (ma con molte implementazioni in Java) di UNA PARTE di WCF.
Comunque grazie per il suggerimento :)

CORBA lavora per serializzazione binaria, anche WCF supporta la serializzazione binaria tramite il Net*Binding, ma in tal caso è utilizzabile solo da applicativi .NET.

Il pieno supporto agli standard WS-* garantisce la compatibilità con altri linguaggi (certo sperare di usare il WSHttpBinding da gsoap è un utopia...).

Sinceramente mi sfugge quale sarebbe l'altra parte di WCF che non sia la sezione di comunicazione.

morskott
24-09-2009, 21:29
per tua ammissione dovresti essere tu quello che si dovrebbe informare prima di parlare (scrivere) :)
premesso che ho lavorato piu volte con RMI avrei qualche domanda:

1) come reagisce un'applicazione basata su RMI se un client malizioso cerca di sopraffare le capacitá di handling del server? per esempio se un client effettua contemporaneamente 20 chiamate passando a ciascuna un array da 1 gigabyte, oppure se passa al server un input di dimensioni lineari in N laddove il server é costretto ad eseguire un algoritmo di complessitá esponenziale in N.

2) come si fa ad imporre restrizioni di sicurezza sulle chiamate che un client puó fare? inoltre devo implementarmi da solo il mio meccanismo di autenticazione?

3) piu in generale, come faccio ad identificare la connessione da cui proviene una certa chiamata? la documentazione del metodo RemoteServer.getClientHost() non assicura nulla sull'unicitá della stringa restituita, la quale dovrebbe essere usata piu che altro per motivi di logging immagino.

4) come faccio a fare chiamate asincrone?

Infatti io non ho detto nulla rispetto WCF, ma ho difeso RMI avendone una (leggera) esperienza, rispondendo ai quesiti

1) Attacchi di tipo (D)DOS son sempre presenti in tutte le tecnologie

2) RMI è solo un metodo per chiamare remotamente metodi, e basta, tutto il resto è o da cercare già implementato in qualche framework o farselo con le proprie manine

3) Vedi sopra

4) public interface IChiamateAsincrone extends Remote{
public void chiamataAsincrona() throws RemoteException;
}
}

public class ChiamateAsincrone extends UnicastRemoteObject implements IChiamateAsincrone{

public ChiamateAsincrone() throws RemoteException{
}

public void chiamataAsincrona() throws RemoteException{
(new Thread(new Runnable(){
public void run(){
//Codice dell'operazione
}
})).start();
}
}semplice, no?

fero86
24-09-2009, 22:18
Infatti io non ho detto nulla rispetto WCF, ma ho difeso RMI avendone una (leggera) esperienza, io invece lo smonto affermando che soffre di mancanze gravi per le quali esistono soluzioni tecnologiche fin dai primi anni 90 (hai presente DCOM?).



1) Attacchi di tipo (D)DOS son sempre presenti in tutte le tecnologie ma magari sarebbe possibile limitarli se fosse possibile impostare il throttling.



2) RMI è solo un metodo per chiamare remotamente metodi, e basta, tutto il resto è o da cercare già implementato in qualche framework o farselo con le proprie manine

3) Vedi sopra non hai risposto alle domande; se ci provassi capiresti perché questa risposta non ha senso.



4) public interface IChiamateAsincrone extends Remote{
public void chiamataAsincrona() throws RemoteException;
}
}

public class ChiamateAsincrone extends UnicastRemoteObject implements IChiamateAsincrone{

public ChiamateAsincrone() throws RemoteException{
}

public void chiamataAsincrona() throws RemoteException{
(new Thread(new Runnable(){
public void run(){
//Codice dell'operazione
}
})).start();
}
}semplice, no? no, per niente: http://msdn.microsoft.com/en-us/library/ms731177.aspx

morskott
25-09-2009, 01:20
io invece lo smonto affermando che soffre di mancanze gravi per le quali esistono soluzioni tecnologiche fin dai primi anni 90 (hai presente DCOM?).

Se nei primi anni novanta si programmava ad oggetti mi son perso qualcosa...



ma magari sarebbe possibile limitarli se fosse possibile impostare il throttling.
e qui parliamo di ottimizzazione, non di tecnologia



non hai risposto alle domande; se ci provassi capiresti perché questa risposta non ha senso.


Non appendi un quadro su un martello, usi il martello per mettere un chiodo su cui appendi il quadro, in soldoni l'autenticazione può benissimo stare un layer sopra a RMI.


no, per niente: http://msdn.microsoft.com/en-us/library/ms731177.aspx

e per te è più semplice?

fero86
25-09-2009, 01:52
Se nei primi anni novanta si programmava ad oggetti mi son perso qualcosa... ecco, quindi controlla meglio: COM é del '93 e il C++ esisteva giá da 10 anni.



e qui parliamo di ottimizzazione, non di tecnologia quale ottimizzazione? in RMI se il client ti passa un array da 1 gigabyte tu te lo prendi tutto senza se e senza ma prima ancora che inizi l'esecuzione del codice del tuo metodo. dove scappi? l'array viene bufferizzato da RMI, il tuo metodo non puó cominciare ad essere eseguito senza conoscerne ogni singolo byte.



Non appendi un quadro su un martello, usi il martello per mettere un chiodo su cui appendi il quadro, in soldoni l'autenticazione può benissimo stare un layer sopra a RMI. questa metafora é utile come un rotolo di carta igienica finito. evidentemente finché non provi non riesci a capire, perció continuo a ripeterti: non hai risposto alle domande; se ci provassi capiresti perché questa risposta non ha senso.
ti do un aiuto: leggi meglio la domanda numero 3.



e per te è più semplice? certo, non devo creare un thread, é sufficiente marcare il metodo asincrono con [OperationContractAttribute(AsyncPattern=true)]. inoltre la tua soluzione non permette di conoscere il risultato dell'operazione ed il momento in cui finisce (non hai implementato il pattern in maniera completa).

tomminno
25-09-2009, 13:12
ecco, quindi controlla meglio: COM é del '93 e il C++ esisteva giá da 10 anni.


Ma è stato standardizzato solo 5 anni più tardi (1998)...

fero86
25-09-2009, 14:40
"standardizzato"?

tomminno
25-09-2009, 18:10
"standardizzato"?

ISO/IEC 14882:1998
Il C++ è uno standard internazionale ratificato dall'ISO

fero86
25-09-2009, 20:44
pensavo ti riferissi a COM.
comunque mi sembra inequivocabile che la programmazione a oggetti fosse molto diffusa anche prima del '98...