【问题标题】:How to keep App Engine Servlet Listening to Firebase如何让 App Engine Servlet 监听 Firebase
【发布时间】:2016-06-09 04:43:51
【问题描述】:

我正在学习以下教程:https://cloud.google.com/solutions/mobile/firebase-app-engine-android-studio

我一切正常,并且电子邮件按应有的方式每 2 分钟发送一次。但是,我现在希望将此扩展为仅在 Firebase 节点上的数据更改时触发发送电子邮件,不是每 2 分钟发送一次消息。

为了测试我替换了cron.xml 文件 来自:

<?xml version="1.0" encoding="UTF-8"?>
<cronentries>
   <cron>
       <url>/hello</url>
       <description>Send me an email of outstanding items in the morning</description>
       <schedule>every 2 minutes</schedule>
   </cron>
</cronentries>

到:

<?xml version="1.0" encoding="UTF-8"?>
<cronentries/>

清除计划任务。

但是现在在 Firebase 数据库中进行更改后,电子邮件永远不会发送....

如何让我的应用引擎服务器“监听”firebase 节点并随后实时生成给定onDataChanged 的操作?

MyServlet 类:

public class MyServlet extends HttpServlet {
    static Logger Log = Logger.getLogger("com.example.username.myapplication.backend.MyServlet");

    @Override
    public void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws IOException {
        Log.info("Got cron message, constructing email.");

        //Create a new Firebase instance and subscribe on child events.
        Firebase firebase = new Firebase("[firebase ref]");
        firebase.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                // Build the email message contents using every field from Firebase.
                final StringBuilder newItemMessage = new StringBuilder();
                newItemMessage.append("This should arrive very closely after changing the data");


                //Now Send the email
                Properties props = new Properties();
                Session session = Session.getDefaultInstance(props, null);
                try {
                    Message msg = new MimeMessage(session);
                    //Make sure you substitute your project-id in the email From field
                    msg.setFrom(new InternetAddress("anything@[app-engine].appspotmail.com",
                            "Todo Nagger"));
                    msg.addRecipient(Message.RecipientType.TO,
                            new InternetAddress("myEmail@gmail.com", "Recipient"));
                    msg.setSubject("Feast Email Test");
                    msg.setText(newItemMessage.toString());
                    Transport.send(msg);
                } catch (MessagingException | UnsupportedEncodingException e) {
                    Log.warning(e.getMessage());
                }
            }

            public void onCancelled(FirebaseError firebaseError) {
            }
        });
    }

}

【问题讨论】:

  • 或者我应该只使用 node.js...?
  • 你已经提到了教程,但是这个错误几乎总是在启用自动缩放时发生(在 tut 中有介绍)。见this thread
  • 另外,您可能需要记录 onCancelled() 处理程序以查看您的侦听器是否被拒绝。
  • @Kato,我完全按照教程操作,复制并粘贴了整个appengine.web.xml 文件....我将只使用node.js,对于这样一个简单的测试来说,这需要很多开销...
  • @Kato,更新,我迁移到 node.js,实时功能在监听 Firebase 的更新,然后触发一个动作方面没有问题。谢谢

标签: android google-app-engine servlets firebase


【解决方案1】:

你的问题其实是关于AppEngine以及如何创建一个自动启动并自动执行一些初始化的Servlet的问题。

您需要保持手动缩放,但请按照以下步骤操作: https://cloud.google.com/appengine/docs/java/config/appconfig#using_a_load-on-startup_servlet

用于在 init() 而不是 http 请求上设置您的侦听器。 你正在尝试的绝对是可能的,并且已经看到它在其他地方运行。

【讨论】:

  • 但总体而言,在扩展方面,使用 node.js 是不是更容易......?
  • Firebase 甚至明确地为 node:firebase.com/docs/web/quickstart.html提供了明确的文档
  • 当然 nodejs 是一个选项。 AppEngine 更像是一种 PaaS,可确保您的服务正在运行。您无需配置实例或集群,也无需担心重启。
  • 但对于我的用例,即。基本上是当 Firebase 节点更新时的监听器,然后会触发发送电子邮件或推送通知的操作……在开发速度和扩展方面,node.js 是最好用的吗?
【解决方案2】:

简单的答案是你还不能这样做。 Google 云端点的超时时间为 1 分钟。 Cron 作业也有超时。

您需要的是触发器。此功能在 Google io 16 上进行了演示。每当数据更改时,都会从 firebase 向您选择的服务器和路径发送一个休息请求。

即使我也在等待它尽快到来。

【讨论】:

    猜你喜欢
    • 2019-11-25
    • 1970-01-01
    • 2012-11-18
    • 1970-01-01
    • 1970-01-01
    • 2018-03-31
    • 2021-09-21
    • 2018-02-28
    • 1970-01-01
    相关资源
    最近更新 更多