Я пишу приложение в Spring (я не использую Spring Boost). Приложение использует JMS-брокер ActiveMQ.
Прослушиватель:
@Component
public class ReceiveMessage {
private HistoryService historyService;
@Autowired
public void setHistoryService(HistoryService historyService) {
this.historyService = historyService;
}
@JmsListener(destination = "my_topic")
public void receiveMessage(ObjectMessage objectMessage) throws JMSException {
Object object = ((ObjectMessage) objectMessage).getObject();
System.out.println(object);
if(objectMessage.getObject() instanceof History) {
History history = (History) objectMessage.getObject();
try {
historyService.add(history);
} catch (Exception e) {
System.out.println(e.toString());
}
}
Источник сообщений:
@Component
public class MessageProducer {
@Autowired
JmsTemplate jmsTemplate;
public void sendMessage(History history) {
jmsTemplate.send("my_topic", new MessageCreator() {
public Message createMessage(Session session) throws JMSException {
ObjectMessage objectMessage = session.createObjectMessage(history);
return objectMessage;
}
}
);
}
}
Конфигурация JMS:
@Configuration
@EnableJms
@ComponentScan(basePackages = "com.mycomp")
public class JMSConfig {
String BROKER_URL = "tcp://localhost:61616";
String BROKER_USERNAME = "admin";
String BROKER_PASSWORD = "admin";
@Bean
public ActiveMQConnectionFactory connectionFactory(){
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory();
connectionFactory.setBrokerURL(BROKER_URL);
connectionFactory.setPassword(BROKER_USERNAME);
connectionFactory.setUserName(BROKER_PASSWORD);
return connectionFactory;
}
@Bean
public JmsTemplate jmsTemplate(){
JmsTemplate template = new JmsTemplate();
template.setConnectionFactory(connectionFactory());
template.setPubSubDomain(true); // для работы с topic
//утсановка места назначения для отправки и приема по умалчанию
// Destination defaultDestination = new ActiveMQTopic("my_topic");
// template.setDefaultDestination(defaultDestination);
return template;
}
@Bean
public DefaultJmsListenerContainerFactory jmsListenerContainerFactory() {
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
factory.setConnectionFactory(connectionFactory());
factory.setConcurrency("1-1");
factory.setPubSubDomain(true); // для работы с topic
return factory;
}
}
История класс:
@Entity (name = "History")
@Table(name = "HISTORY", schema = "PUBLIC")
public class History implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID")
private long id;
@Column(name = "CHANGETYPE")
private String changeType;
@Column(name = "CHANGEENTITY")
private String changeEntity;
@Column(name = "VALUE")
private String value;
public History(){
}
//..
//setters getters
ActiveMQ:
https://i.stack.imgur.com/iFDAz.png
Проблемы:
1) вместо 1 слушателя, 2 слушатели реализованы.
2) Я не могу привести объект при получении сообщения к типу History.
Я попытался посмотреть, что отправлено и получено в режиме отладки
Отправка в MessageProducer :
https://i.stack.imgur.com/OG02i.png
Вот что получает слушатель:
https://i.stack.imgur.com/cX06G.jpg
Но Кажется, что некоторые данные здесь:
https://i.stack.imgur.com/l1US5.png