- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
这是我从 Heroku 迁移到 Google Container Engine 后开始面临的一个有趣的问题:
自从迁移到 GCE 后,在服务器启动/重启/部署几个小时后,突然之间,我的 Elixir 应用程序无法再向 APNS 发送推送通知。我正在使用 apns4ex图书馆。到目前为止,我大致发现了以下内容:
在 init 内部,库打开一个到 APNS 的 :ssl
(erlang) 套接字,并在 GenServer 进程中不断回收它
def connect_socket(host, port, opts, timeout_seconds) do
address = "#{host}:#{port}"
case :ssl.connect(host, port, opts, timeout_seconds * 1000) do
{:ok, socket} ->
APNS.Logger.debug("successfully connected to #{address}")
{:ok, socket}
{:error, reason} ->
APNS.Logger.error("failed to connect to push socket #{address}, reason given: #{inspect(reason)}")
{:error, {:connection_failed, address}}
end
end
现在,从 x 小时开始,在尝试发送消息后,库开始接收 :ssl_closed
消息/回调以指示 SSL 连接已关闭
def handle_info({:ssl_closed, socket}, %{socket_apple: socket} = state) do
APNS.Logger.debug("ssl socket closed, returning :connect")
{:connect, {:error, "ssl_closed"}, %{state | socket_apple: nil}}
end
它的处理方式是让连接关闭并返回 :connect
,然后重新连接到 APNS (here)
一旦推送通知停止工作,调试日志总是在每条消息上报告以下模式。
:ssl.send
报告 :ok
引起的):ssl.connect
返回 :ok
)发送包
代码:
def send_package(socket, packet) do
result = :ssl.send(socket, [packet])
case result do
:ok ->
APNS.Logger.debug("success sending ssl package")
{:error, reason} ->
APNS.Logger.warn("error #{reason} sending ssl package")
end
result
end
相比之下,发送成功后它会在第 2 点停止。
这是发送推送时我的应用程序的一些原始日志输出(注意最后 9 行显示了我描述的模式)
01:41:14.820 request_id=fecds3h3s1so2825c44qfestvvvpv707 [debug] [APNS] #PID<0.20135.97> 23303051:1ad798 sending in poolboy transaction :myapp
01:41:14.821 request_id=fecds3h3s1so2825c44qfestvvvpv707 [debug] [APNS] #PID<0.20135.97> 23303051:1ad798 sending message
01:41:14.821 request_id=fecds3h3s1so2825c44qfestvvvpv707 [debug] [APNS] #PID<0.20135.97> 62064556:b12e98 sending in poolboy transaction :myapp
01:41:14.821 [debug] [APNS] #PID<0.349.0> 23303051:1ad798 handling cast :send
01:41:14.821 [debug] [APNS] #PID<0.349.0> 23303051:1ad798 message's payload looks good
01:41:14.821 request_id=fecds3h3s1so2825c44qfestvvvpv707 [debug] [APNS] #PID<0.20135.97> 62064556:b12e98 sending message
01:41:14.821 request_id=fecds3h3s1so2825c44qfestvvvpv707 [debug] [APNS] #PID<0.20135.97> 19048099:b3ed8e sending in poolboy transaction :myapp
01:41:14.822 [debug] [APNS] #PID<0.349.0> success sending ssl package
01:41:14.822 [debug] [APNS] #PID<0.349.0> 23303051:1ad798 success sending
01:41:14.822 [debug] [APNS] #PID<0.349.0> 23303051:1ad798 handle call :send received :ok
01:41:14.822 [debug] [APNS] #PID<0.348.0> 62064556:b12e98 handling cast :send
01:41:14.822 [debug] [APNS] #PID<0.348.0> 62064556:b12e98 message's payload looks good
01:41:14.823 request_id=fecds3h3s1so2825c44qfestvvvpv707 [debug] [APNS] #PID<0.20135.97> 19048099:b3ed8e sending message
01:41:14.823 request_id=fecds3h3s1so2825c44qfestvvvpv707 [info] Sent 200 in 22ms
01:41:14.823 [debug] [APNS] #PID<0.348.0> success sending ssl package
01:41:14.823 [debug] [APNS] #PID<0.348.0> 62064556:b12e98 success sending
01:41:14.823 [debug] [APNS] #PID<0.348.0> 62064556:b12e98 handle call :send received :ok
01:41:14.823 [debug] [APNS] #PID<0.347.0> 19048099:b3ed8e handling cast :send
01:41:14.824 [debug] [APNS] #PID<0.347.0> 19048099:b3ed8e message's payload looks good
01:41:14.824 [debug] [APNS] #PID<0.347.0> success sending ssl package
01:41:14.824 [debug] [APNS] #PID<0.347.0> 19048099:b3ed8e success sending
01:41:14.824 [debug] [APNS] #PID<0.347.0> 19048099:b3ed8e handle call :send received :ok
01:41:15.027 [debug] [APNS] #PID<0.348.0> ssl socket closed, returning :connect
01:41:15.029 [debug] [APNS] #PID<0.347.0> ssl socket closed, returning :connect
01:41:15.043 [debug] [APNS] #PID<0.349.0> ssl socket closed, returning :connect
01:41:15.207 [debug] [APNS] #PID<0.348.0> successfully connected to gateway.push.apple.com:2195
01:41:15.207 [debug] [APNS] #PID<0.348.0> successfully connected to socket
01:41:15.209 [debug] [APNS] #PID<0.347.0> successfully connected to gateway.push.apple.com:2195
01:41:15.209 [debug] [APNS] #PID<0.347.0> successfully connected to socket
01:41:15.214 [debug] [APNS] #PID<0.349.0> successfully connected to gateway.push.apple.com:2195
01:41:15.214 [debug] [APNS] #PID<0.349.0> successfully connected to socket
一种理论认为 GCE 因空闲而关闭连接,但这并不能解释为什么重新连接后的另一条消息会立即导致相同的模式。另外,为什么套接字仅在使用 :ssl.send
发送后才关闭?
最佳答案
我和 apns4erl 有同样的问题,当套接字在尝试发送消息后关闭时,但问题出在我这边,不记得了,它要么在错误的证书文件中,要么在错误的消息中
关于ssl - 几个小时后,通过 GCE 上的套接字的 APNS 停止工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41273822/
我确信许多 GKE 客户都在混合 GCE/GKE 环境中工作。 目前,集群中的 skyDNS 服务没有在同一个项目中暴露 GCE 主机。 DNS 服务使用的这个 IP 地址范围不同于普通的应用程序服务
我有两个 GCE,都启用了操作系统登录: 1) 使用服务帐户 a_svc 配置的 a_vm 2) 使用服务帐户 b_svc 配置的 b_vm a_svc 具有对 b_vm 的操作系统登录访问权限。 a
我需要使用 Ansible 向现有 GCE 实例添加额外的磁盘 磁盘是用gce_pd模块创建的: - name : Add new disk local_action: module: g
在Google compute engine我可以使用 instance template从模板创建新 VM。使用 GCE 控制台可以正常工作,使用 API 也可以正常工作,也是(URL 参数“sou
我用 pip 安装了 ansible、apache-libcloud。此外,我可以将 gcloud cli 和 ansible 作品用于任何与 gce 无关的剧本。 在ansible playbo
与安装了 LAMP 的 GCE 相比,选择与 Google Cloud SQL 链接的 GCE 实例有哪些优势? 我确定 GCE 是可扩展的,但是安装在其上的 mysql 数据库的可扩展性如何? 使用
我想我想要一个 shell 脚本来自动重启一个实例,无论它是因为软件问题还是硬件问题而崩溃。 操作系统是 Ubuntu 18.04。 最佳答案 可能会有很多解决方案。您可能会考虑使用 Google S
尝试配置GCE Discovery。 在elasticsearch.yml中有这个 cloud: gce: project_id: .......... zone: us-
我使用以下命令设置我的 CD 以将容器部署到 gce: gcloud compute instances stop my-awesome-app gcloud compute instances up
我正在GKE上运行kubernetes应用程序,该应用程序在端口80上提供HTTP请求,并在端口8080上提供websocket。 现在,HTTP部分需要知道客户端的IP地址,因此我必须使用HTTP负
我正在寻找一种在 GCE 中创建内部 HTTPS L7 入口 Controller 的方法,但似乎没有任何关于如何做到这一点的文档。我看到有一种方法可以创建一个内部的 L4 LoadBalancer,
我正在尝试在 Google Compute Engine 上托管 TCP 套接字服务器,我在 GCE 防火墙规则上添加了以下规则(套接字端口 0.0.0.0/0 tcp:11000 适用于所有目标)但
图片:Debian GNU/Linux 7.6 (wheezy) amd64,带有 backports 内核和 SSH 包,构建于 2014-10-17 机器类型:n1-highcpu-2(2 个 v
我正在试用该平台。我已成功配置和设置 CENTOS v6 VM,然后添加 whm/cpanel。我在防火墙方面遇到了一些问题,我确信这些问题是在 Google Cloud 方面。我已经阅读了我的眼睛,
长话短说 - 我需要在项目之间使用网络来为它们单独计费。 我想从一个点访问不同项目中的所有 VM,我将用于配置系统(我们称之为协调器节点)。 看起来 VPC 网络对等是一个完美的解决方案。但不幸的是,
如何访问 Google Compute Engine 虚拟机实例的控制台? 最佳答案 要查看控制台输出(只读),您可以使用以下任何一种方法: Web UI 通过 Developers Console
我正在尝试使用需要 gce_client_id 和 gce_client_secret key 的第 3 方应用程序。为了生成它们,我浏览了凭据图标并尝试创建一个 OAuth 2.0 客户端 ID。但
我有一个执行单个大型计算的 Docker 容器。此计算需要大量内存,运行时间约为 12 小时。 我可以创建一个适当大小的 Google Compute Engine VM,并使用“将容器镜像部署到此
我有一个 docker 镜像上传到 GCP 容器注册表,其中包含一个在 TomEE 和 postgres 上运行的 Web 应用程序,用于数据持久性。我创建了一个计算引擎实例,并使用如下命令在端口 8
当我在 GCE 中创建一个新实例时,我可以毫无问题地 ssh 到那个新实例。 gcutil 检查我是否有 key (google_compute_engine),如果没有,它将为我创建它们。然后它将
我是一名优秀的程序员,十分优秀!