2017-09-13 6 views
0

トピックに公開するには、以下のコードを使用しています。それは、JMSテンプレートで送信するカスタムオブジェクトをシリアル化する方法変換および送信メソッド

public interface Event { 

    public boolean isEmpty(); 

    public AcEventDatafileTransaction getDatafileTransaction(); 

    public AcEventObjectTransaction getObjectTransaction(); 

    boolean isDatafileTransaction(); 

    boolean isObjectTransaction(); 

    boolean isRdbmsTransaction(); 

    String getTransactionId(); 

    } 

その実装は、このようなもので、フォーマットconvertAndSend(デスティネーション先、オブジェクトのメッセージ)

Event event; 
    jmsTemplate.convertAndSend(topic, event); 

私の現在のイベントインターフェースは、このようなものであるのです

public class EventPublisherImpl implements Event { 
    private final AcTransactionRecord transactionRecord; 
    private final Ac ac; 
    private final String[] actualTemplates; 
    private final String[] curveTemplates; 

    public AcEventPublisherImpl(final Ac ac, 
           final String[] actualTemplates, 
           final String[] curveTemplates, 
           final AcTransactionRecord acTransactionRecord) { 
     this.ac = ac; 
     this.transactionRecord = acTransactionRecord; 
     this.actualTemplates = actualTemplates; 
     this.curveTemplates = curveTemplates; 
    } 

    @Override 
    public boolean isEmpty() { 
     return transactionRecord.isEmpty(); 
    } 

    @Override 
    public AcEventDatafileTransaction getDatafileTransaction() { 
     if (isDatafileTransaction()) { 
      return new AcEventDatafileTransactionPublisherImpl(transactionRecord.getDatafileTransaction()); 
     } 
     return null; 
    } 


    @Override 
    public AcEventObjectTransaction getObjectTransaction() { 
     if (isObjectTransaction()) { 
      return new AcEventObjectTransactionPublisherImpl(ac, actualTemplates, curveTemplates, transactionRecord.getObjectOperations()); 
     } 
     return null; 
    } 

    @Override 
    public boolean isDatafileTransaction() { 
     return transactionRecord.getType() == AcTransactionRecord.DATAFILE_TRANS; 
    } 

    @Override 
    public boolean isObjectTransaction() { 
     return transactionRecord.getType() == AcTransactionRecord.OBJECT_TRANS; 
    } 

    @Override 
    public boolean isRdbmsTransaction() {  
     return transactionRecord.getType() == AcTransactionRecord.RDBMS_TRANS; 
    } 

    @Override 
    public String getTransactionId() { 
     if (transactionRecord != null) { 
      return Integer.toString(transactionRecord.getNumber()); 
     } 
     return ""; 
    } 
    } 

シリアル化可能な形式に変換するにはどうすればよいですか?

私の全目的は、イベントオブジェクトをトピックに公開することです。そのために私はconvertAndSendメソッドを使用しています。そのメソッドは、シリアル化されたクラスのオブジェクトを必要とします。私は現在持っていません。それは私が達成しようとしているものです。 私は適切な例とどのようにそれは私を助けにコードやポイントを介しての方法を提案してくださいいくつかの属性を持つクラスがメッセージコンバータにhttps://examples.javacodegeeks.com/enterprise-java/spring/spring-framework-jmstemplate-example/

を使用して直列化された例を見てきました。

答えて

0

JmsTemplateでオーバーロードされたメソッドconvertAndSend()receiveAndConvert()MessageConverterインタフェースのインスタンスへの変換処理を委任する。このインタフェースは、JavaオブジェクトとJMSメッセージの間で変換する簡単なコントラクトを定義します。既定の実装SimpleMessageConverterは、StringTextMessage,byte[]BytesMesssageの間の変換とjava.util.MapMapMessageの間の変換をサポートしています。

ので、カスタム型をサポートするために、我々は、サポートされているメッセージ・タイプのいずれかにEventオブジェクトを変換するMessageConverterを実装するカスタムコンバータを作成する必要があります。最も簡単な解決策は、変換オブジェクトをサポートするスプリングによって提供されたMappingJackson2MessageConverterTextMessageにjsonの形で登録することです。

@Bean // Serialize message content to json using TextMessage 
public MessageConverter jacksonJmsMessageConverter() { 
    MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter(); 
    converter.setTargetType(MessageType.TEXT); 
    converter.setTypeIdPropertyName("_type"); 
    return converter; 
} 

独自のコンバータを作成する場合は、ソースコードでシリアル化プロセスがどのように行われているかをご覧ください。メッセージを受信するには

、最も簡単な方法は、@JmsListenerアノテーションを使用することで、春には、暗黙のうちに別の方法がjavax.jms.MessageListenerを使用することですが、あなたは手動で行う必要があり、登録さコンバータ

@Component 
public class Receiver { 
    @JmsListener(destination = "dest") 
    public void receiveMessage(Event event) { 
    // do whatever you need with the event 
    } 
} 

を使用してJava型へのメッセージを変換します自分でメッセージを変換してください。

@Component 
public class ExampleListener implements MessageListener { 

@Autowired 
private ObjectMapper objectMapper; 

public void onMessage(Message message) { 
    if (message instanceof TextMessage) {// we set the converter targetType to text 
     try { 
      String json = ((TextMessage) message).getText(); // here you have your event object as json string 
      Event event = objectMapper.readValue(json, Event.class); // convert back to event object 
     } 
     catch (JMSException ex) { 
      throw new RuntimeException(ex); 
     } 
    } 
    else { 
     throw new IllegalArgumentException("Message must be of type TextMessage"); 
    } 
} 

参考:

+0

私がメッセージを受信messagelistenersを使用しています。 onMessageメソッドでMessageオブジェクトを取得します。イベントタイプに戻すにはどうすればいいですか?より理解しやすくするために質問を編集しています。 – africandrogba

+0

私はそれを使用しましたが、messagelistenerを使用しています。私はそれをメッセージとして受け取ったときにどのようにイベントオブジェクトに変換するのですか? – africandrogba

+0

@africandrogbaメッセージの受信方法に関する回答を更新しました – MangEngkus

関連する問題