问题描述
我有一个REST端点,该端点将消息发送到三个单独的通用消息队列。每个队列都有一个与之关联的@MessageDriven
bean,然后可以处理消息。
我遇到的问题是,所有三个MDB在部署(或重新启动)后仅在第一次调用端点时才接收消息。此后的每次调用都只有2/3或1/3的bean可以接听消息。我可以看到它们已被发送但未被bean识别。
有没有一种方法可以设置这些bean,以便它们始终识别正在添加到队列中的消息?
系统
- JDK 11
- JBoss EAP 7.2.9.GA(WildFly Core 6.0.30.Final-redhat-00001)
- 通用消息传递(Software AG)队列
部署后的第一个日志语句
INFO [jms.MessageSender] (default task-3) MessageSender: Sending message
INFO [jms.MessageSender] (default task-3) Creating JMS session using realm
INFO [jms.MessageSender] (default task-3) Initializing JMS Session..
INFO [jms.MessageSender] (default task-3) Finding JMS queue queue/TestQueue
INFO [jms.MessageSender] (default task-3) pushing event
INFO [jms.MessageSender] (default task-3) Event sent successfully
INFO [jms.MessageMDB] (Client-Push: 4:0) Message Received <----This doesn't happen on subsequent calls
MessageSender
@Stateless(mappedname = "MessageSender")
@LocalBean
public class MessageSender {
public static final String NAME = "MessageSender";
public static final String JNDI_NAME = "java:global//MessageSender";
private static final Logger logger = LoggerFactory.getLogger(MessageSender.class);
public MessageSender() { super(); }
public MessageSender(@SystemProperty("<REALM>") String rnames,@SystemProperty("<USERNAME>") String username,@SecurityVaultProperty("${<PASSWORD>}") char[] password,@SystemProperty("queue/TestQueue") String destinationName) {
super(rnames,username,password,destinationName,logger);
}
public void sendMessage(Object message,String prop) throws Exception {
logger.info("MessageSender: Sending message");
String messageText = getMessage(message,messageClass);
nSession session = null;
try {
nSessionAttributes nsa = new nSessionAttributes(rname);
nsa.setFollowTheMaster(true);
nsa.setdisconnectOnClusterFailure(true);
logger.info("Creating JMS session using realm {}",rnames);
session = nSessionFactory.create(nsa,new String(password));
logger.info("Initializing JMS Session..");
session.init(true);
nChannelAttributes nca = new nChannelAttributes(destinationName);
nEventAttributes attr = new nEventAttributes();
attr.setMessageType(nEventAttributes.JMS_TEXT_MESSAGE_TYPE);
nEventProperties props = new nEventProperties();
props.put("prop",prop);
nConsumeEvent event = new nConsumeEvent((String) null,messageText.getBytes("UTF-8"));
event.setAttributes(attr);
event.setProperties(props);
logger.info("Finding JMS queue {}",destinationName);
nQueue jmsQueue = session.findQueue(nca);
logger.info("pushing event");
jmsQueue.push(event);
logger.info("Event sent successfully");
} catch (Exception e) {
logger.error("Failed to send JMS message",e);
throw new Exception("Failed to send JMS message",e);
} finally {
if (session != null) {
session.close();
}
}
}
}
Message Bean
@MessageDriven(name = MessageMDB.JNDI_NAME,activationConfig = {
@ActivationConfigProperty(propertyName = "connectionFactory",propertyValue = "java:/global/remoteJMS/ConnectionFactory"),@ActivationConfigProperty(propertyName = "destinationType",propertyValue = "javax.jms.Queue"),@ActivationConfigProperty(propertyName = "destination",propertyValue = "java:/global/remoteJMS/queue/TestQueue"),@ActivationConfigProperty(propertyName = "user",propertyValue = "${<USERNAME>}"),@ActivationConfigProperty(propertyName = "password",propertyValue = "${<Password>}")
})
@TransactionManagement(TransactionManagementType.CONTAINER)
@TransactionAttribute(value = TransactionAttributeType.NOT_SUPPORTED)
@ResourceAdapter("org.jboss.genericjms")
public class MessageMDB implements MessageListener {
public static final String JNDI_NAME = "MessageMDB";
private static final Logger logger = LoggerFactory.getLogger(MessageMDB.class);
public void onMessage(Message message) {
logger.info("Message Received");
try {
if (message instanceof TextMessage) {
//do stuff
} else {
logger.error("Message of wrong type: {}",message.getClass().getName());
}
} catch (JMSException e) {
logger.error("JMSException thrown: ",e);
mdc.setRollbackOnly();
}
}
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)