Skip to content
This repository has been archived by the owner on Nov 9, 2017. It is now read-only.

Commit

Permalink
refactor(ZNTA-938): update webhook to use queue
Browse files Browse the repository at this point in the history
  • Loading branch information
Alex Eng committed Apr 9, 2016
1 parent b6f05af commit e80038f
Show file tree
Hide file tree
Showing 22 changed files with 384 additions and 86 deletions.
8 changes: 4 additions & 4 deletions docs/release-notes.md
@@ -1,6 +1,10 @@
## 3.9
<h5>New Features</h5>
* [ZNTA-938](https://zanata.atlassian.net/browse/ZNTA-938) - Webhook event for translation update by user.

<h5>Infrastructure Changes</h5>
* Recommended platform: JBoss EAP 6 (6.4.6.GA or later).
* Alternative platform: WildFly version 10.x.
* [ZNTA-530](https://zanata.atlassian.net/browse/ZNTA-530) - Replace Seam 2 with CDI
* In WildFly or EAP `standalone.xml`, please make sure the Weld
extension is present in the `extensions` section like this:
Expand Down Expand Up @@ -33,10 +37,6 @@
* [ZNTA-928](https://zanata.atlassian.net/browse/ZNTA-928) - Readonly project doesn't have "lock" icon in UI
* [ZNTA-793](https://zanata.atlassian.net/browse/ZNTA-793) - Remove unused method in TranslationMemoryAction

<h5>Infrastructure Changes</h5>
* Recommended platform: JBoss EAP 6 (6.4.6.GA or later).
* Alternative platform: WildFly version 10.x.

-----------------------
## 3.8.4
<h5>Bug fixes</h5>
Expand Down
7 changes: 6 additions & 1 deletion docs/user-guide/system-admin/configuration/jms-messaging.md
Expand Up @@ -53,6 +53,10 @@ EAP 6:
<entry name="jms/queue/MailsQueue"/>
<durable>true</durable>
</jms-queue>
<jms-queue name="WebhookQueue">
<entry name="jms/queue/WebhookQueue"/>
<durable>true</durable>
</jms-queue>
<!-- omit other things -->
</jms-destinations>
</hornetq-server>
Expand Down Expand Up @@ -83,11 +87,12 @@ or (Wildfly 10, EAP 7):
<server name="default">
<!-- omit other things -->
<jms-queue name="MailsQueue" entries="java:/jms/queue/MailsQueue"/>
<jms-queue name="MailsQueue" entries="java:/jms/queue/WebhookQueue"/>
<!-- omit other things -->
</server>
</subsystem>
```

The only Zanata-specific change here is the addition of the JMS queue "MailsQueue" - the mdb configuration is simply copied from `standalone-full.xml`.
The only Zanata-specific change here is the addition of the JMS queue "MailsQueue" and "WebhookQueue" - the mdb configuration is simply copied from `standalone-full.xml`.

Restart your server to ensure changes are applied.
1 change: 1 addition & 0 deletions etc/scripts/standalone.cli.messaging.config
Expand Up @@ -8,5 +8,6 @@ connect
batch

jms-queue add --queue-address=MailsQueue --durable=true --entries=["java:/jms/queue/MailsQueue"]
jms-queue add --queue-address=WebhookQueue --durable=true --entries=["java:/jms/queue/WebhookQueue"]

run-batch
4 changes: 4 additions & 0 deletions functional-test/src/test/resources/conf/standalone.xml
Expand Up @@ -341,6 +341,10 @@
</jms-connection-factories>

<jms-destinations>
<jms-queue name="WebhookQueue">
<entry name="jms/queue/WebhookQueue"/>
<durable>true</durable>
</jms-queue>
<jms-queue name="MailsQueue">
<entry name="jms/queue/MailsQueue"/>
<durable>true</durable>
Expand Down
Expand Up @@ -378,6 +378,7 @@
<jms-queue name="ExpiryQueue" entries="java:/jms/queue/ExpiryQueue"/>
<jms-queue name="DLQ" entries="java:/jms/queue/DLQ"/>
<jms-queue name="MailsQueue" entries="java:/jms/queue/MailsQueue"/>
<jms-queue name="WebookQueue" entries="java:/jms/queue/WebookQueue"/>
<connection-factory name="InVmConnectionFactory" entries="java:/ConnectionFactory" connectors="in-vm"/>
<connection-factory name="RemoteConnectionFactory" entries="java:jboss/exported/jms/RemoteConnectionFactory" connectors="http-connector"/>
<pooled-connection-factory name="activemq-ra" transaction="xa" entries="java:/JmsXA java:jboss/DefaultJMSConnectionFactory" connectors="in-vm"/>
Expand Down
Expand Up @@ -377,6 +377,10 @@
</jms-connection-factories>

<jms-destinations>
<jms-queue name="WebhookQueue">
<entry name="jms/queue/WebhookQueue"/>
<durable>true</durable>
</jms-queue>
<jms-queue name="MailsQueue">
<entry name="jms/queue/MailsQueue"/>
<durable>true</durable>
Expand Down
Expand Up @@ -434,6 +434,7 @@
<in-vm-acceptor name="in-vm" server-id="0" />
<jms-queue name="ExpiryQueue" entries="java:/jms/queue/ExpiryQueue" />
<jms-queue name="DLQ" entries="java:/jms/queue/DLQ" />
<jms-queue name="WebhookQueue" entries="java:/jms/queue/WebhookQueue" />
<jms-queue name="MailsQueue" entries="java:/jms/queue/MailsQueue" />
<connection-factory name="InVmConnectionFactory"
entries="java:/ConnectionFactory" connectors="in-vm" />
Expand Down
45 changes: 45 additions & 0 deletions zanata-war/src/main/java/org/zanata/events/WebhookJmsEvent.java
@@ -0,0 +1,45 @@
/*
* Copyright 2016, Red Hat, Inc. and individual contributors as indicated by the
* @author tags. See the copyright.txt file in the distribution for a full
* listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This software is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this software; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA, or see the FSF
* site: http://www.fsf.org.
*/

package org.zanata.events;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.io.Serializable;

/**
* A wrapper for JMS event for all webhook
*
* @author Alex Eng<a href="mailto:aeng@redhat.com">aeng@redhat.com</a>
*/
@Getter
@AllArgsConstructor
@NoArgsConstructor
public class WebhookJmsEvent implements Serializable {

private WebhookEventType event;

private String url;

private String secret;
}
Expand Up @@ -20,32 +20,19 @@
*/
package org.zanata.notification;

import java.io.Serializable;
import java.util.Collections;
import java.util.Map;

import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.ObjectMessage;

import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;

import javax.inject.Inject;
import javax.inject.Named;
import org.zanata.events.LanguageTeamPermissionChangedEvent;

import com.google.common.base.Throwables;
import com.google.common.collect.ImmutableMap;

import static com.google.common.base.Strings.nullToEmpty;
import static org.zanata.notification.NotificationManager.MessagePropertiesKey;

/**
* JMS EmailsQueue consumer. It will base on
* org.zanata.notification.NotificationManager.MessagePropertiesKey#objectType
Expand All @@ -68,62 +55,16 @@
@Slf4j
@NoArgsConstructor
@AllArgsConstructor(access = AccessLevel.PROTECTED)
public class EmailQueueMessageReceiver implements MessageListener {

private static Map<String, JmsMessagePayloadHandler> handlers = Collections
.emptyMap();

public class EmailQueueMessageReceiver extends QueueMessageReceiver {
@Inject
private LanguageTeamPermissionChangeJmsMessagePayloadHandler languageTeamHandler;
private LanguageTeamPermissionChangeJmsPayloadHandler languageTeamHandler;

@Override
public void onMessage(Message message) {
if (message instanceof ObjectMessage) {
try {
String objectType =
nullToEmpty(
message.getStringProperty(
MessagePropertiesKey.objectType.name()));

JmsMessagePayloadHandler jmsMessagePayloadHandler =
getHandlers().get(objectType);
if (jmsMessagePayloadHandler != null) {
log.debug("found handler for message object type [{}]",
objectType);
jmsMessagePayloadHandler.handle(((ObjectMessage) message)
.getObject());
} else {
log.warn("can not find handler for message:{}", message);
}

} catch (JMSException e) {
log.warn("error handling jms message: {}", message);
Throwables.propagate(e);
} catch (Throwable e) {
log.warn("error handling jms message: {}", message, e);
}
}
}

public Map<String, JmsMessagePayloadHandler> getHandlers() {
protected Map<String, JmsPayloadHandler> getHandlers() {
if (handlers.isEmpty()) {
synchronized (this) {
if (handlers.isEmpty()) {
handlers =
ImmutableMap
.<String, JmsMessagePayloadHandler> builder()
.put(LanguageTeamPermissionChangedEvent.class
.getCanonicalName(),
languageTeamHandler)
.build();
}
}
log.info("email queue payload handlers: {}", handlers);
addHandler(LanguageTeamPermissionChangedEvent.class
.getCanonicalName(), languageTeamHandler);
}
return handlers;
}

public static interface JmsMessagePayloadHandler {
void handle(Serializable data);
}
}
Expand Up @@ -66,6 +66,9 @@ public class JmsResourcesProducer {
@Resource(lookup = "jms/queue/MailsQueue")
private Queue mailQueue;

@Resource(lookup = "jms/queue/WebhookQueue")
private Queue webhookQueue;

@Produces @RequestScoped @InVMJMS
public QueueConnection createJMSConnection() throws JMSException {
QueueConnection queueConnection =
Expand Down Expand Up @@ -103,7 +106,15 @@ public QueueSender createEmailQueueSender(@InVMJMS
return session.createSender(mailQueue);
}

public void closeQueueSender(@Disposes @EmailQueueSender QueueSender queueSender) {
@Produces
@WebhookQueueSender
public QueueSender createWebhookQueueSender(@InVMJMS
QueueSession session) throws JMSException {
return session.createSender(webhookQueue);
}

public void closeEmailQueueSender(
@Disposes @EmailQueueSender QueueSender queueSender) {
try {
log.debug("________ closing email queue sender");
queueSender.close();
Expand All @@ -112,5 +123,15 @@ public void closeQueueSender(@Disposes @EmailQueueSender QueueSender queueSender
}
}

public void closeWebhookQueueSender(
@Disposes @WebhookQueueSender QueueSender queueSender) {
try {
log.debug("________ closing webhook queue sender");
queueSender.close();
} catch (JMSException e) {
throw Throwables.propagate(e);
}
}


}
Expand Up @@ -26,7 +26,7 @@

import javax.inject.Inject;
import javax.inject.Named;
import org.zanata.ApplicationConfiguration;

import org.zanata.email.Addresses;
import org.zanata.email.EmailBuilder;
import org.zanata.email.LanguageTeamPermissionChangeEmailStrategy;
Expand Down Expand Up @@ -56,8 +56,8 @@
@Slf4j
@NoArgsConstructor
@AllArgsConstructor(access = AccessLevel.PROTECTED)
public class LanguageTeamPermissionChangeJmsMessagePayloadHandler implements
EmailQueueMessageReceiver.JmsMessagePayloadHandler {
public class LanguageTeamPermissionChangeJmsPayloadHandler implements
QueueMessageReceiver.JmsPayloadHandler {
@Inject
private EmailBuilder emailBuilder;

Expand Down
Expand Up @@ -32,6 +32,9 @@
import org.zanata.events.LanguageTeamPermissionChangedEvent;

import com.google.common.base.Throwables;
import org.zanata.events.WebhookJmsEvent;

import java.io.Serializable;

/**
* Centralized place to handle all events that needs to send out notifications.
Expand All @@ -46,13 +49,25 @@ public class NotificationManager {
public void onLanguageTeamPermissionChanged(
final @Observes LanguageTeamPermissionChangedEvent event,
final @InVMJMS QueueSession queueSession,
final @EmailQueueSender QueueSender mailQueueSender) {
final @EmailQueueSender QueueSender queueSender) {
queueEvent(event, queueSession, queueSender);
}

public void onWebhookJmsFire(
final @Observes WebhookJmsEvent event,
final @InVMJMS QueueSession queueSession,
final @WebhookQueueSender QueueSender queueSender) {
queueEvent(event, queueSession, queueSender);
}

private void queueEvent(Serializable event, QueueSession queueSession,
QueueSender queueSender) {
try {
ObjectMessage message =
queueSession.createObjectMessage(event);
queueSession.createObjectMessage(event);
message.setObjectProperty(MessagePropertiesKey.objectType.name(),
event.getClass().getCanonicalName());
mailQueueSender.send(message);
event.getClass().getCanonicalName());
queueSender.send(message);
} catch (JMSException e) {
throw Throwables.propagate(e);
}
Expand Down

0 comments on commit e80038f

Please sign in to comment.