You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@activemq.apache.org by "Justin Bertram (Jira)" <ji...@apache.org> on 2020/03/03 20:47:00 UTC
[jira] [Commented] (ARTEMIS-2639) Lost activemq notification
properties when using a filter
[ https://issues.apache.org/jira/browse/ARTEMIS-2639?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17050539#comment-17050539 ]
Justin Bertram commented on ARTEMIS-2639:
-----------------------------------------
I tried to reproduce what you're seeing by adding this test to {{org.apache.activemq.artemis.tests.integration.divert.DivertTest}}:
{code:java}
@Test
public void testDivertedMessageProperties() throws Exception {
final String testAddress = ActiveMQDefaultConfiguration.getDefaultManagementNotificationAddress().toString();
final String forwardAddress = "forwardAddress";
DivertConfiguration divertConf = new DivertConfiguration().setName("divert1").setRoutingName("divert1").setAddress(testAddress).setForwardingAddress(forwardAddress).setFilterString("_AMQ_NotifType = 'CONSUMER_CREATED' OR _AMQ_NotifType = 'CONSUMER_CLOSED'");
Configuration config = createDefaultInVMConfig().addDivertConfiguration(divertConf);
ActiveMQServer server = addServer(ActiveMQServers.newActiveMQServer(config, false));
server.start();
ServerLocator locator = createInVMNonHALocator();
ClientSessionFactory sf = createSessionFactory(locator);
ClientSession session = sf.createSession(false, true, true);
final SimpleString queueName1 = new SimpleString("queue1");
session.createQueue(new SimpleString(forwardAddress), RoutingType.MULTICAST, queueName1, null, false);
session.start();
ClientConsumer consumer1 = session.createConsumer(queueName1);
ClientMessage message = consumer1.receive(DivertTest.TIMEOUT);
Assert.assertNotNull(message);
Assert.assertEquals("CONSUMER_CREATED", message.getStringProperty("_AMQ_NotifType"));
Assert.assertNull(consumer1.receiveImmediate());
}
{code}
However, the diverted message had the expected property (i.e. {{_AMQ_NotifType}}).
Could you work up a test that reproduces the issue you're seeing?
> Lost activemq notification properties when using a filter
> ---------------------------------------------------------
>
> Key: ARTEMIS-2639
> URL: https://issues.apache.org/jira/browse/ARTEMIS-2639
> Project: ActiveMQ Artemis
> Issue Type: Bug
> Components: Broker, OpenWire
> Affects Versions: 2.11.0
> Reporter: Ansgar Sachs
> Priority: Major
>
> {quote}As developer, I expect proper ActiveMQ Notifications, when consuming only some of them{quote}
> h3. Steps to reproduce
> 1a) Create a broker and add the following:
> {code:java}
> <divert name="consumer-notification-divert">
> <address>activemq.notifications</address>
> <forwarding-address>jms.consumer.notifications</forwarding-address>
> <filter string="_AMQ_NotifType = 'CONSUMER_CREATED' OR _AMQ_NotifType = 'CONSUMER_CLOSED'"/>
> </divert>
> {code}
> 1b) Same situation for:
> {code:java}
> <addresses xmlns="urn:activemq:core">
> <address name="activemq.notifications">
> <anycast>
> <queue name="jms.consumer.notifications">
> <durable>true</durable>
> <filter string="_AMQ_NotifType = 'CONSUMER_CREATED' OR _AMQ_NotifType = 'CONSUMER_CLOSED'"/>
> </queue>
> </anycast>
> </address>
> </addresses>
> {code}
> 2) Consume those messages with a MDB
> {code:java}
> @MessageDriven(
> name = "Notification_Subber",
> activationConfig = {
> @ActivationConfigProperty(propertyName = "destination", propertyValue = "jms.consumer.notifications"),
> @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Topic"),
> @ActivationConfigProperty(propertyName = "useJndi", propertyValue = "false"),
> }
> )
> public class NotificationMDB implements MessageListener {
> public void onMessage(Message message) {
> // Log message here
> // The message is missing all properties as documented in https://activemq.apache.org/components/artemis/documentation/latest/management.html
> }
> }
> {code}
> h3. Expected Behavior
> I would expect the same messages that are consumed as follows:
> {code:java}
> @MessageDriven(
> name = "Notification_Subber",
> activationConfig = {
> @ActivationConfigProperty(propertyName = "destination", propertyValue = "activemq.notifications"),
> @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Topic"),
> @ActivationConfigProperty(propertyName = "useJndi", propertyValue = "false"),
> @ActivationConfigProperty(propertyName = "messageSelector",propertyValue = "_AMQ_NotifType = 'CONSUMER_CREATED' OR _AMQ_NotifType = 'CONSUMER_CLOSED'"
> }
> )
> public class NotificationMDB implements MessageListener {
> public void onMessage(Message message) {
> // Log message here
> // This one actually returns all properties
> }
> }
> {code}
> h3. Current behavior
> I guess that the filter includes some kind of message-copy workflow which removes all those properties?
> During this copy process, all properties starting with "_" will be deleted.
> h3. Workaround
> Right now, the only workaround for this issue is a custom transformer, which does the following:
> {code:java}
> public class NotificationsTransformer implements Transformer {
> private static final Logger log = Logger.getLogger(NotificationsTransformer.class.getName());
>
> public Message transform(Message message) {
> try {
> log.finest(String.format("Transform CoreMessage: %s", message.toString()));
> message.putStringProperty("event_timestamp", message.getStringProperty("_AMQ_NotifTimestamp"));
> message.putStringProperty("address_name", message.getStringProperty("_AMQ_Address"));
> message.putStringProperty("event_type", message.getStringProperty("_AMQ_NotifType"));
> message.putStringProperty("queue_name", message.getStringProperty("_AMQ_RoutingName"));
> } catch (Exception e) {
> log.warning(String.format("Failed to transform message: %s", e.getMessage()));
> }
> return message;
> }
> }
> {code}
> h3. Steps to achieve victory
> (x) Find the errorneous message copy
> (x) Forward all message properties
--
This message was sent by Atlassian Jira
(v8.3.4#803005)