Domanda

Vorrei scrivere una classe MessageConverter che può racchiudere un altro MessageConverter. Questo MessageConverter chiamerebbe il convertitore figlio, che si presume generi un TextMessage. Richiederebbe il payload e GZIP lo comprimerebbe, creando un BytesMessage che alla fine viene restituito al mittente.

Il problema è scritto daMessage (). Posso riconvertire il payload nella stringa, ma poi voglio creare un " fittizio " TextMessage per inserire la stringa in poi passare al metodo fromMessage () del MessageConverter figlio. Lì sto colpendo un muro di mattoni perché non riesco a creare un TextMessage senza un oggetto sessione JMS e sembra che non ci sia alcun modo per ottenere una sessione in questo contesto.

Potrei creare proprietà aggiuntive per collegare più cose a questa classe, ma non mi sembra di poter facilmente ottenere una sessione da un oggetto JMSTemplate e non riesco a immaginare cos'altro dovrei avere .

Sono sul punto di creare un'implementazione di TextMessage privata all'interno di questo codice solo allo scopo di racchiudere una stringa per MessageConverter figlio. Quella classe richiederà tonnellate di metodi fittizi per arricchire l'interfaccia, e tutta quella digitazione fa piangere Gesù bambino.

Qualcuno può suggerire un modo migliore?

È stato utile?

Soluzione 2

Quindi, in effetti, ne ho creato uno:

    private static class FakeTextMessage implements TextMessage {
            public FakeTextMessage(Message m) { this.childMessage = m; }
            private String text;
            private Message childMessage;
            public void setText(String t) { this.text = t; }
            public String getText() { return this.text; }

            // All the rest of the methods are simply pass-through
            // implementations of the rest of the interface, handing off to the child message.
            public void acknowledge() throws JMSException { this.childMessage.acknowledge(); }
            public void clearBody() throws JMSException { this.childMessage.clearBody(); }
            public void clearProperties() throws JMSException { this.childMessage.clearProperties(); }
            public Enumeration getPropertyNames() throws JMSException { return this.childMessage.getPropertyNames(); }
            public boolean propertyExists(String pn) throws JMSException { return this.childMessage.propertyExists(pn); }

            // and so on and so on
    }

Mi fa venire voglia dell'obiettivo C. Come è possibile? :)

Altri suggerimenti

Vuoi davvero avvolgere le istanze di MessageConverter all'interno di altre istanze di MessageConverter? Il punto centrale di un MessageConverter è trasformare un messaggio in qualcos'altro (che non è un messaggio JMS). Non è davvero progettato per incatenarli (ogni passaggio crea un falso messaggio JMS).

Perché non introdurre semplicemente la tua interfaccia

interface MessageBodyConverter {
  /** return a converted body of the original message */
  Object convert(Object body, Message originalMessage);
}

È quindi possibile creare un MessageConverter invocando uno di questi (che può quindi nidificare in profondità come desiderato)

class MyMessageConverter implements MessageConverter {
  private final MessageBodyConverter converter;

  public Object fromMessage(Message message) {
    if (message instanceof ObjectMessage) {
       return converter.convert(objectMessage.getObject(), message);
    ...
  }
}

Puoi quindi concatenare quegli oggetti MessageBodyConverter nel modo che preferisci - inoltre hai accesso al messaggio JMS originale (per ottenere le intestazioni e così via) senza dover provare a creare implementazioni pseudo (probabilmente non conformi a JMS) di Message?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top