• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

JMS große Datei verschicken

skizZ

Mitglied
Hallo zusammen,

ich arbeite gerade mit JMS und ActiveMQ als JMS Provider und versuche eine große Datei > 100MB in die Queue zu hängen.

Ich weiß, dass ActiveMQ die BlobMessage hat, möchte die aber nicht unbedingt benutzen. Ich lese die Datei in ein ByteArray ein und schreibe dieses ByteArray in die Queue. Allerdings wird beim Übertragen auf der Empfängerseite eine Heap Size Exception geworfen und die Übertragung bricht ab.

Hat jemand Erfahrung mit JMS Streams oder der Übertragung von größeren Nachrichten?

skizZ
 
Hallo,

genau dies habe ich schon versucht.
Funktioniert soweit auch, allerdings schlägt es beim Empfangen dann fehl.

Das Programm bleibt einfach stehen, springt in die onMessage Methode, hängt aber dann ohne Fehlermeldung bei stream.receive();
 
Hallo,

hier meine sendMessage Methode

Code:
public void sendMessage() throws Exception
    {
        Map myMap = new HashMap();
        File f = new File("D:/debian-lenny-vm-deutsch/test.vmdk");
        FileInputStream fin = new FileInputStream(f);
        BufferedInputStream in = new BufferedInputStream(fin);
        myMap.put("Filename", f.getName());
        OutputStream os = connection.createOutputStream(destination, myMap, ActiveMQMessage.DEFAULT_DELIVERY_MODE, ActiveMQMessage.DEFAULT_PRIORITY, ActiveMQMessage.DEFAULT_TIME_TO_LIVE);
        int value = 0;
        byte buffer[] = new byte[4048];

        while((value = in.read(buffer)) != -1){
            os.write(buffer, 0, value);
        }
    }
Hier meine onMessage Methode auf der Empfängerseite
(Es wird momentan nicht reingesprungen...)

Code:
public void onMessage(javax.jms.Message msg) {
        try {
            ActiveMQInputStream in = (ActiveMQInputStream) connection.createInputStream(request);
            ActiveMQMessage m = in.receive();
            System.out.println(m.getStringProperty("Filename"));
        } catch (JMSException ex) {
            Logger.getLogger(Receiver.class.getName()).log(Level.SEVERE, null, ex);
        }

   }

Ich hatte mal zwischenzeitlich direkt nach dem versenden in der sendMessage Methode einen InputStream aufgemacht und in.receiver() aufgerufen. Das funktionierte...

Ich benötige allerdings zwei getrennte Programme :-)
 
Hallo nochmal,

mir ist es auch ein Rätsel wie ich die Datei wieder zusammenbaue ... eine 5MB Datei schreibt 164 Messages in die Queue. Wie muss ich damit umgehen?
 
Hm, sorry, ich hatte gedacht, ich könnte da kurz ein paar JARs runterladen und rumprobieren. Aber allein das Aufsetzen einer Testumgebung hat für mich derzeit nicht auslotbare Tiefen. Da komme ich nicht zu. Dass ich bisher keinen aussagekräftigen Beispielcode per Suchmaschine gefunden habe, verbessert den Eindruck auch nicht gerade. Man sollte doch denken, dass das ein einigermaßen verbreitetes Problem ist.
 
Hi,

für die Testumgebung reicht die das ZIP File von AMQ. Darin einfach im bin ordner die Datei starten.
Die benötigte JAR Datei ist ebenfalls im ZIP Archiv enthalten.

Dass es keinen wirklichen Beispielcode gibt, habe ich auch schon gemerkt :-)

Egal, muss ich mich halt doch darauf begrenzen, dass es so ohne weiteres nur mit max. 20MB Dateien funktioniert.

Viele Grüße
skizZ
 
Zurück
Oben