# ActiveMQ, JMS und Datei übertragen



## skizZ (1. Sep 2010)

Hallo zusammen,

hat schonmal jemand versucht mit JMS und ActiveMQ Dateien zu versenden und wieder zu empfangen?
Hat evtl. jemand ein Beispiel dazu?

Viele Grüße
skizZ


----------



## FArt (1. Sep 2010)

Wo ist das Problem? Nimm eine BytesMessage oder StreamMessage und verschicke diese.
Annahme: dir ist klar, dass du nur den Inhalt der Dateien verschicken kannst.


----------



## skizZ (1. Sep 2010)

Hallo.

ist es also nicht möglich eine Datei test.txt von PC A über MQ auf PC B zu übertragen?


----------



## FArt (1. Sep 2010)

skizZ hat gesagt.:


> Hallo.
> 
> ist es also nicht möglich eine Datei test.txt von PC A über MQ auf PC B zu übertragen?



Nicht direkt. Du musst den Inhalt und die Metainformationen (z.B. Dateiname) extra übertragen und natürlich auch in die Message packen bzw. beim Empfang daraus extrahieren.

Annahme: du weißt, was ein File-Objekt wirklich bedeutet.


----------



## skizZ (1. Sep 2010)

Hallo,

meine Vorgehensweise so korrekt?

- Dateiname in property speichern
- Dateiinhalt in property speichern
- übertragen

- auf gegenseite neu zusammensetzen
- datei abspeichern

scheint mir allerdings nicht das performanteste zu sein, anderen lösungsvorschlag?

lg
skizZ


----------



## FArt (1. Sep 2010)

Wo hakt es denn performancetechnisch? 
Bei kleinen Dateien kann man sicher den Weg gehen, dass erst die Datei komplett gelesen wird, in der Message verpackt wird und dann verschickt wird.
Grundsätzlich würde ich bei so etwas aber Streaming bevorzugen.

Die Gesamtperformance hängt im Prinzip aber sonst lediglich von der Größe der Datei und der Bandbreite ab.


----------



## skizZ (1. Sep 2010)

Hi,

nunja, noch hakt es nicht an der Performance, aber wenn man dann mal 1000 kleine Dateien kopieren möchte, dann sollte es doch schon recht heikel werden, oder?

Ich habe Dateiname und Dateiinhalt jeweils in die Property einer Streammessage gespeichert und schicke es dann ab.

Somit wird es doch gestreamt oder sehe ich das falsch?


----------



## FArt (1. Sep 2010)

skizZ hat gesagt.:


> Somit wird es doch gestreamt oder sehe ich das falsch?



Ja, das siehst du falsch.
JMS Interview Questions


----------



## skizZ (1. Sep 2010)

Du kennst nicht zufällig eine Seite auf der man diesbezüglich ein kleines Beispiel findet?


----------



## FArt (2. Sep 2010)

skizZ hat gesagt.:


> Du kennst nicht zufällig eine Seite auf der man diesbezüglich ein kleines Beispiel findet?



Da hast du aber Glück, denn aus reinem Zufall kenne ich so eine Seite... wie es aussieht kennen diese Seite viele andere nicht.
Link


----------



## skizZ (2. Sep 2010)

Cool, ich glaube ich sollte mit google bookmarken und merken.

danke dir schonmal für deine unterstützung


----------



## skizZ (2. Sep 2010)

Hallo,

also es funktioniert zwar ... aber eine 500kb textdatei braucht ca 1,5 minuten bis sie übertragen wurde ...

hast du einen tipp?


----------



## FArt (2. Sep 2010)

skizZ hat gesagt.:


> Hallo,
> 
> also es funktioniert zwar ... aber eine 500kb textdatei braucht ca 1,5 minuten bis sie übertragen wurde ...
> 
> hast du einen tipp?



In dieser Reihenfolge:
- Sourcecode ansehen, Infrastruktur bewerten und nachdenken
- Logfiles analysieren (evtl. vorher Logging sinnvoll erweitertn und konfigurieren)
- Profiler, Netzwerkanalysetools usw. verwenden


----------



## skizZ (2. Sep 2010)

Hallo,

ich gehe davon aus, dass es hier noch daran liegt:

- Datei Zeilenweise einlesen
- Inhalt in Stringvariable speichern
- mit streammessage.writestring variable reinschreiben
- mit send(streammessage verschicken)

falsche vorgehensweise?


----------



## skizZ (2. Sep 2010)

Lösung des Problemes: Blobmessage


----------



## FArt (2. Sep 2010)

skizZ hat gesagt.:


> Lösung des Problemes: Blobmessage



Ich würde nicht Lösung sondern Workaround dazu sagen.

Gehört nicht zum JMS Standard und benötigt Freigaben (Netzlaufwerke) oder einen speziellen Server, weil sich hier die Message nur um Benachrichtigung kümmert, nicht um den Datentransfer.


----------



## skizZ (2. Sep 2010)

Nunja, ActiveMQ stellt nunmal sowohl die BlobMessage, sowohl den zugehörigen Fileserver zur Verfügung. Von daher eine super Sache 

Ich danke dir aber trotzdem für die Unterstützung.


----------



## Kr0e (6. Sep 2010)

Reines JMS ist sowieso viel zu abstrakt und bietet nicht genug Möglichkeiten.
Das interne ActiveMQ-API zu nutzen ist daher sinnvoll. HornetQ bietet ebenfalls ein
sehr gutes API und hat auch schon eine fertige Lösung für das stückweise Übertragen von großen Dateien.
Auch mit Statuslistenern etc., alles sehr schön gelöst.


----------



## skizZ (6. Sep 2010)

Hey,

danke für deine Antwort.

habe es mit ActiveMQ nun recht gut gelöst, bin gerade am Clustern.

Würdest du mir eher zu HornetQ raten?


----------



## Kr0e (6. Sep 2010)

Ja, ich habe mit beiden intensiv gearbeitet. HornetQ hat in erster Linie mehr Power.
Die Entwickler haben bei HornetQ halt besonders auf die Geschwindigkiet geachtet,
außerdem ist die Handhabung sehr gut. Aber! ActiveMQ ist jetzt nicht unbedingt viel langsamer...
Wenn du damit klar kommst, dann nimm es ruhig weiter! Aber du kannst ruhig auf den JMS Standard pfeiffen 
Nutz ruhig das interne API..


----------



## skizZ (6. Sep 2010)

> Wenn du damit klar kommst, dann nimm es ruhig weiter! Aber du kannst ruhig auf den JMS Standard pfeiffen
> Nutz ruhig das interne API..



Sehe ich auch so, wofür ist das interne API denn sonst da 

danke dir


----------



## Kr0e (6. Sep 2010)

Eben! Vorallem... JMS hat scon ein paar Jährchen aufm Buckel und wirklich gepflegt wird JMS nicht mehr....


----------



## skizZ (6. Sep 2010)

Hast du Erfahrung mit activemq und clustering?


----------



## Kr0e (7. Sep 2010)

Nur mit HornetQ  ActiveMQ hab ich mich nie sooo tief eingearbeitet, weil mir die Dateitransfermöglichkeit von HornetQ gut gefiel...


----------



## skizZ (7. Sep 2010)

Kannst du mir kurz sagen wie bei HornetQ der Datentransfer abläuft?
Weil will wie gesagt Dateien von a nach b senden ... bei activemq geht das nur mit dem fileserver performant, der funktioniert aber im cluster nicht ... -> fällt server a aus, sind die files auf server b nicht verfügbar, sondern nur die messages.


----------



## Kr0e (8. Sep 2010)

HornetQ kannst du Streams senden und HornetQ sorgt dafür im Hintergrund, dass diese Streams so oft wie möglich in vorgegebenen ByteBöcken gelesen und verschickt werden. (Ohne Clusterkram)

Pseudocode:

FileStream fs = Stream auf Datei;

hornetQ.send(fs);

Zurück bekam man glaub ich ein FutureObjekt, über das der Transfer gesteuert werden kann. =)


----------

